Skip to content

Commit

Permalink
Correctly resolve the visibility annotations of NameSpaceEntries (#2657)
Browse files Browse the repository at this point in the history
See the bug report for context.

* Closes #2656
  • Loading branch information
paulcadman authored Feb 16, 2024
1 parent dc04989 commit a126464
Show file tree
Hide file tree
Showing 7 changed files with 68 additions and 2 deletions.
26 changes: 26 additions & 0 deletions src/Juvix/Compiler/Concrete/Data/NameSpace.hs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ module Juvix.Compiler.Concrete.Data.NameSpace where

import Data.Kind qualified as GHC
import Juvix.Compiler.Concrete.Data.Name qualified as C
import Juvix.Compiler.Concrete.Data.ScopedName qualified as S
import Juvix.Compiler.Concrete.Data.VisibilityAnn
import Juvix.Compiler.Store.Scoped.Language
import Juvix.Data.NameKind
import Juvix.Prelude
Expand Down Expand Up @@ -39,3 +41,27 @@ exportNameSpace = case sing :: SNameSpace ns of
SNameSpaceSymbols -> exportSymbols
SNameSpaceModules -> exportModuleSymbols
SNameSpaceFixities -> exportFixitySymbols

resolveNameSpaceEntry :: forall ns. (SingI ns) => NameSpaceEntryType ns -> NameSpaceEntryType ns -> NameSpaceEntryType ns
resolveNameSpaceEntry = case sing :: SNameSpace ns of
SNameSpaceSymbols -> resolvePreSymbolEntry
SNameSpaceModules -> resolveModuleSymbolEntry
SNameSpaceFixities -> resolveFixitySymbolEntry
where
resolvePreSymbolEntry :: PreSymbolEntry -> PreSymbolEntry -> PreSymbolEntry
resolvePreSymbolEntry = \cases
(PreSymbolAlias (Alias n1)) (PreSymbolAlias (Alias n2)) -> PreSymbolAlias (Alias (resolveName n1 n2))
(PreSymbolFinal (SymbolEntry n1)) (PreSymbolFinal (SymbolEntry n2)) -> PreSymbolFinal (SymbolEntry (resolveName n1 n2))
_ _ -> impossible

resolveModuleSymbolEntry :: ModuleSymbolEntry -> ModuleSymbolEntry -> ModuleSymbolEntry
resolveModuleSymbolEntry (ModuleSymbolEntry n1) (ModuleSymbolEntry n2) = ModuleSymbolEntry (resolveName n1 n2)

resolveFixitySymbolEntry :: FixitySymbolEntry -> FixitySymbolEntry -> FixitySymbolEntry
resolveFixitySymbolEntry (FixitySymbolEntry n1) (FixitySymbolEntry n2) = FixitySymbolEntry (resolveName n1 n2)

resolveName :: S.Name -> S.Name -> S.Name
resolveName n1 n2
| n1 ^. S.nameId == n2 ^. S.nameId =
over S.nameVisibilityAnn (resolveVisibility (n2 ^. S.nameVisibilityAnn)) n1
| otherwise = impossible
9 changes: 8 additions & 1 deletion src/Juvix/Compiler/Concrete/Data/Scope/Base.hs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
module Juvix.Compiler.Concrete.Data.Scope.Base where

import Data.HashMap.Strict qualified as HashMap
import Juvix.Compiler.Concrete.Data.NameSpace
import Juvix.Compiler.Concrete.Data.ScopedName qualified as S
import Juvix.Compiler.Concrete.Language
Expand All @@ -12,7 +13,13 @@ newtype SymbolInfo (n :: NameSpace) = SymbolInfo
-- different places
_symbolInfo :: HashMap S.AbsModulePath (NameSpaceEntryType n)
}
deriving newtype (Semigroup, Monoid)

instance (SingI n) => Semigroup (SymbolInfo n) where
SymbolInfo s1 <> SymbolInfo s2 =
SymbolInfo (HashMap.unionWith resolveNameSpaceEntry s1 s2)

instance (SingI n) => Monoid (SymbolInfo n) where
mempty = SymbolInfo mempty

data BindingStrategy
= -- | Local binding allows shadowing
Expand Down
11 changes: 11 additions & 0 deletions src/Juvix/Compiler/Concrete/Data/VisibilityAnn.hs
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,14 @@ data VisibilityAnn
deriving stock (Show, Eq, Ord, Generic)

instance Serialize VisibilityAnn

instance Semigroup VisibilityAnn where
v1 <> v2 = case v1 of
VisPublic -> VisPublic
VisPrivate -> v2

instance Monoid VisibilityAnn where
mempty = VisPrivate

resolveVisibility :: VisibilityAnn -> VisibilityAnn -> VisibilityAnn
resolveVisibility = (<>)
6 changes: 5 additions & 1 deletion test/Scope/Positive.hs
Original file line number Diff line number Diff line change
Expand Up @@ -237,5 +237,9 @@ tests =
posTest
"Import nested local module"
$(mkRelDir "ImportNestedLocalModule")
$(mkRelFile "ImportNestedLocalModule.juvix")
$(mkRelFile "ImportNestedLocalModule.juvix"),
posTest
"Visibility precedence"
$(mkRelDir "VisibilityPrecendence")
$(mkRelFile "VisibilityPrecedence.juvix")
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
module NestedLocalModuleViaExport;

module A;
type T := t;
end;

open A using {T} public;
open A;
5 changes: 5 additions & 0 deletions tests/positive/VisibilityPrecendence/Package.juvix
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module Package;

import PackageDescription.V2 open;

package : Package := defaultPackage {name := "test075"};
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module VisibilityPrecedence;

import NestedLocalModuleViaExport as M;

main : M.T := M.A.t;

0 comments on commit a126464

Please sign in to comment.