on master help sign in
canonicalize module names, generate unambiguous names in JS

Begging to address #826

commit31545d1252ac8f4efe456a2710e43777e45accc0 authorEvan Czaplicki <info@elm-lang.org> dateFri 28 Aug 2015, 16:24 (11 years ago) parent5943865
23 files changed+360−405
elm-compiler.cabal+1 src/AST/Module.hs+15−40 src/AST/Module/Name.hs+50 src/AST/Variable.hs+16−11 src/Canonicalize.hs+17−8 src/Canonicalize/Declaration.hs+3−3 src/Canonicalize/Environment.hs+3−3 src/Canonicalize/Result.hs+4−4 src/Canonicalize/Setup.hs+39−31 src/Canonicalize/Variable.hs+11−11 src/Compile.hs+9−33 src/Elm/Compiler.hs+10−13 src/Elm/Compiler/Module.hs+6−29 src/Elm/Package.hs+14−15 src/Generate/JavaScript.hs+7−107 src/Generate/JavaScript/Variable.hs+37−20 src/Nitpick/PatternMatches.hs+3−2 src/Nitpick/TopLevelTypes.hs+49−29 src/Parse/Module.hs+8−4 src/Parse/Parse.hs+19−10 src/Reporting/Error/Canonicalize.hs+8−8 src/Reporting/Warning.hs+3−3 src/Type/Inference.hs+28−21
elm-compiler.cabal+1
@@ -56,6 +56,7 @@ Library
5656 AST.Helpers,
5757 AST.Literal,
5858 AST.Module,
59+ AST.Module.Name,
5960 AST.Pattern,
6061 AST.Type,
6162 AST.Variable,
src/AST/Module.hs+15−40
@@ -1,24 +1,22 @@
11module AST.Module
2− ( Interfaces, CanonicalInterfaces
2+ ( Interfaces
33 , Types, Aliases, ADTs
44 , AdtInfo, CanonicalAdt
55 , SourceModule, ValidModule, CanonicalModule, Optimized
66 , Module(..), Body(..)
77 , Header(..)
8− , Name, nameToString, nameIsNative
9− , CanonicalName(..), canonPkg, canonModul
108 , Interface(..), toInterface
119 , UserImport, DefaultImport, ImportMethod(..)
1210 ) where
1311
1412import Control.Applicative ((<$>),(<*>))
1513import Data.Binary
16−import qualified Data.List as List
1714import qualified Data.Map as Map
1815
1916import qualified AST.Declaration as Decl
2017import qualified AST.Expression.Canonical as Canonical
2118import qualified AST.Expression.Optimized as Optimized
19+import qualified AST.Module.Name as Name
2220import qualified AST.Type as Type
2321import qualified AST.Variable as Var
2422import qualified Docs.AST as Docs
@@ -29,8 +27,7 @@ import qualified Reporting.Annotation as A
2927
3028-- HELPFUL TYPE ALIASES
3129
32−type Interfaces = Map.Map Name Interface
33−type CanonicalInterfaces = Map.Map CanonicalName Interface
30+type Interfaces = Map.Map Name.Canonical Interface
3431
3532type Types = Map.Map String Type.Canonical
3633type Aliases = Map.Map String ([String], Type.Canonical)
@@ -59,15 +56,15 @@ type ValidModule =
5956
6057
6158type CanonicalModule =
62− Module Docs.Centralized [Name] [Var.Value] (Body Canonical.Expr)
59+ Module Docs.Centralized [Name.Raw] [Var.Value] (Body Canonical.Expr)
6360
6461
6562type Optimized =
66− Module Docs.Centralized [Name] [Var.Value] (Body Optimized.Expr)
63+ Module Docs.Centralized [Name.Raw] [Var.Value] (Body Optimized.Expr)
6764
6865
6966data Module docs imports exports body = Module
70− { names :: Name
67+ { name :: Name.Canonical
7168 , path :: FilePath
7269 , docs :: A.Located (Maybe docs)
7370 , exports :: exports
@@ -90,41 +87,19 @@ data Body expr = Body
9087
9188{-| Basic info needed to identify modules and determine dependencies. -}
9289data Header imports = Header
93− { _names :: Name
90+ { _name :: Name.Raw
9491 , _docs :: A.Located (Maybe String)
9592 , _exports :: Var.Listing (A.Located Var.Value)
9693 , _imports :: imports
9794 }
9895
9996
100−type Name = [String] -- must be non-empty
101−
102−
103−data CanonicalName =
104− CanonicalName
105− { canonPkg :: Package.Name
106− , canonModul :: Name
107− }
108−
109−
110−nameToString :: Name -> String
111−nameToString =
112− List.intercalate "."
113−
114−
115−nameIsNative :: Name -> Bool
116−nameIsNative name =
117− case name of
118− "Native" : _ -> True
119− _ -> False
120−
121−
12297-- IMPORTs
12398
124−type UserImport = A.Located (Name, ImportMethod)
99+type UserImport = A.Located (Name.Raw, ImportMethod)
125100
126101
127−type DefaultImport = (Name, ImportMethod)
102+type DefaultImport = (Name.Raw, ImportMethod)
128103
129104
130105data ImportMethod = ImportMethod
@@ -137,15 +112,15 @@ data ImportMethod = ImportMethod
137112
138113{-| Key facts about a module, used when reading info from .elmi files. -}
139114data Interface = Interface
140− { iVersion :: String
115+ { iVersion :: Package.Version
116+ , iPackage :: Package.Name
141117 , iExports :: [Var.Value]
142118 , iTypes :: Types
143− , iImports :: [Name]
119+ , iImports :: [Name.Raw]
144120 , iAdts :: ADTs
145121 , iAliases :: Aliases
146122 , iFixities :: [(Decl.Assoc, Int, String)]
147123 , iPorts :: [String]
148− , iPackage :: Package.Name
149124 }
150125
151126
@@ -153,7 +128,8 @@ toInterface :: Package.Name -> CanonicalModule -> Interface
153128toInterface pkgName modul =
154129 let body' = body modul in
155130 Interface
156− { iVersion = Package.versionToString Compiler.version
131+ { iVersion = Compiler.version
132+ , iPackage = pkgName
157133 , iExports = exports modul
158134 , iTypes = types body'
159135 , iImports = imports modul
@@ -161,7 +137,6 @@ toInterface pkgName modul =
161137 , iAliases = aliases body'
162138 , iFixities = fixities body'
163139 , iPorts = ports body'
164− , iPackage = pkgName
165140 }
166141
167142
@@ -169,6 +144,7 @@ instance Binary Interface where
169144 get = Interface <$> get <*> get <*> get <*> get <*> get <*> get <*> get <*> get <*> get
170145 put modul = do
171146 put (iVersion modul)
147+ put (iPackage modul)
172148 put (iExports modul)
173149 put (iTypes modul)
174150 put (iImports modul)
@@ -176,4 +152,3 @@ instance Binary Interface where
176152 put (iAliases modul)
177153 put (iFixities modul)
178154 put (iPorts modul)
179− put (iPackage modul)
src/AST/Module/Name.hsnew file+50
@@ -0,0 +1,50 @@
1+module AST.Module.Name where
2+
3+import Control.Applicative ((<$>),(<*>))
4+import Data.Binary
5+import qualified Data.List as List
6+
7+import qualified Elm.Package as Package
8+
9+
10+type Raw = [String] -- must be non-empty
11+
12+
13+data Canonical = Canonical
14+ { _package :: Package.Name
15+ , _module :: Raw
16+ }
17+ deriving (Eq, Ord, Show)
18+
19+
20+inCore :: Raw -> Canonical
21+inCore raw =
22+ Canonical Package.coreName raw
23+
24+
25+toString :: Raw -> String
26+toString rawName =
27+ List.intercalate "." rawName
28+
29+
30+canonicalToString :: Canonical -> String
31+canonicalToString (Canonical _ rawName) =
32+ toString rawName
33+
34+
35+isNative :: Raw -> Bool
36+isNative name =
37+ case name of
38+ "Native" : _ ->
39+ True
40+
41+ _ ->
42+ False
43+
44+
45+instance Binary Canonical where
46+ put (Canonical home name) =
47+ put home >> put name
48+
49+ get =
50+ Canonical <$> get <*> get
src/AST/Variable.hs+16−11
@@ -2,12 +2,12 @@ module AST.Variable where
22
33import Control.Applicative ((<$>), (<*>))
44import Data.Binary
5−import qualified Data.List as List
65import qualified Data.Map as Map
76import qualified Data.Maybe as Maybe
87import Text.PrettyPrint as P
98
109import qualified AST.Helpers as Help
10+import qualified AST.Module.Name as ModuleName
1111import qualified Reporting.PrettyPrint as P
1212
1313
@@ -19,8 +19,8 @@ newtype Raw = Raw String
1919
2020data Home
2121 = BuiltIn
22− | Module [String]
23− | TopLevel [String]
22+ | Module ModuleName.Canonical
23+ | TopLevel ModuleName.Canonical
2424 | Local
2525 deriving (Eq, Ord, Show)
2626
@@ -37,9 +37,9 @@ local x =
3737 Canonical Local x
3838
3939
40−topLevel :: [String] -> String -> Canonical
41−topLevel names x =
42− Canonical (TopLevel names) x
40+topLevel :: ModuleName.Canonical -> String -> Canonical
41+topLevel home x =
42+ Canonical (TopLevel home) x
4343
4444
4545builtin :: String -> Canonical
@@ -47,16 +47,21 @@ builtin x =
4747 Canonical BuiltIn x
4848
4949
50−fromModule :: [String] -> String -> Canonical
50+fromModule :: ModuleName.Canonical -> String -> Canonical
5151fromModule home name =
5252 Canonical (Module home) name
5353
5454
55+inCore :: ModuleName.Raw -> String -> Canonical
56+inCore home name =
57+ Canonical (Module (ModuleName.inCore home)) name
58+
59+
5560-- VARIABLE RECOGNIZERS
5661
57−is :: [String] -> String -> Canonical -> Bool
62+is :: ModuleName.Raw -> String -> Canonical -> Bool
5863is home name var =
59− var == Canonical (Module home) name
64+ var == inCore home name
6065
6166
6267isJson :: Canonical -> Bool
@@ -133,8 +138,8 @@ instance ToString Canonical where
133138 BuiltIn ->
134139 name
135140
136− Module path ->
137− List.intercalate "." (path ++ [name])
141+ Module moduleName ->
142+ ModuleName.canonicalToString moduleName ++ "." ++ name
138143
139144 TopLevel _ ->
140145 name
src/Canonicalize.hs+17−8
@@ -10,12 +10,14 @@ import qualified Data.Foldable as T
1010
1111import AST.Expression.General (Expr'(..), dummyLet)
1212import AST.Module (Body(..))
13+import Elm.Utils ((|>))
1314
1415import qualified AST.Declaration as D
1516import qualified AST.Expression.General as E
1617import qualified AST.Expression.Valid as Valid
1718import qualified AST.Expression.Canonical as Canonical
1819import qualified AST.Module as Module
20+import qualified AST.Module.Name as ModuleName
1921import qualified AST.Pattern as P
2022import qualified AST.Type as Type
2123import qualified AST.Variable as Var
@@ -41,13 +43,19 @@ import qualified Canonicalize.Variable as Canonicalize
4143-- MODULES
4244
4345module'
44− :: Module.Interfaces
46+ :: [ModuleName.Canonical]
47+ -> Module.Interfaces
4548 -> Module.ValidModule
4649 -> R.Result Warning.Warning Error.Error Module.CanonicalModule
47−module' interfaces modul =
50+module' canonicalImports interfaces modul =
4851 let
52+ importDict =
53+ canonicalImports
54+ |> map (\cName -> (ModuleName._module cName, cName))
55+ |> Map.fromList
56+
4957 (Result.Result uses rawResults) =
50− moduleHelp interfaces modul
58+ moduleHelp importDict interfaces modul
5159 in
5260 case rawResults of
5361 Result.Ok (env, almostCanonicalModule) ->
@@ -67,10 +75,11 @@ type AlmostCanonicalModule =
6775
6876
6977moduleHelp
70− :: Module.Interfaces
78+ :: Map.Map ModuleName.Raw ModuleName.Canonical
79+ -> Module.Interfaces
7180 -> Module.ValidModule
7281 -> Result.ResultErr (Env.Environment, AlmostCanonicalModule)
73−moduleHelp interfaces modul@(Module.Module _ _ comment exports _ decls) =
82+moduleHelp importDict interfaces modul@(Module.Module _ _ comment exports _ decls) =
7483 canonicalModule
7584 <$> canonicalDeclsResult
7685 <*> resolveExports locals exports
@@ -88,7 +97,7 @@ moduleHelp interfaces modul@(Module.Module _ _ comment exports _ decls) =
8897 concatMap declToValue decls
8998
9099 canonicalDeclsResult =
91− Setup.environment interfaces modul
100+ Setup.environment importDict interfaces modul
92101 `Result.andThen` \env -> (,) env <$> T.traverse (declaration env) decls
93102
94103 body :: [D.CanonicalDecl] -> Module.Body Canonical.Expr
@@ -97,7 +106,7 @@ moduleHelp interfaces modul@(Module.Module _ _ comment exports _ decls) =
97106 in
98107 Module.Body
99108 { program =
100− let expr = Decls.toExpr (Module.names modul) decls
109+ let expr = Decls.toExpr (Module.name modul) decls
101110 in
102111 Sort.definitions (dummyLet expr)
103112
@@ -121,7 +130,7 @@ moduleHelp interfaces modul@(Module.Module _ _ comment exports _ decls) =
121130-- IMPORTS
122131
123132filterImports
124− :: Set.Set Module.Name
133+ :: Set.Set ModuleName.Raw
125134 -> AlmostCanonicalModule
126135 -> R.Result Warning.Warning e Module.CanonicalModule
127136filterImports uses modul@(Module.Module _ _ _ _ (defaults, imports) _) =
src/Canonicalize/Declaration.hs+3−3
@@ -4,7 +4,7 @@ module Canonicalize.Declaration (toExpr) where
44import qualified AST.Declaration as D
55import qualified AST.Expression.General as E
66import qualified AST.Expression.Canonical as Canonical
7−import qualified AST.Module as Module
7+import qualified AST.Module.Name as ModuleName
88import qualified AST.Pattern as P
99import qualified AST.Type as T
1010import qualified AST.Variable as Var
@@ -12,12 +12,12 @@ import qualified Reporting.Annotation as A
1212import qualified Reporting.Region as R
1313
1414
15−toExpr :: Module.Name -> [D.CanonicalDecl] -> [Canonical.Def]
15+toExpr :: ModuleName.Canonical -> [D.CanonicalDecl] -> [Canonical.Def]
1616toExpr moduleName decls =
1717 concatMap (toDefs moduleName) decls
1818
1919
20−toDefs :: Module.Name -> D.CanonicalDecl -> [Canonical.Def]
20+toDefs :: ModuleName.Canonical -> D.CanonicalDecl -> [Canonical.Def]
2121toDefs moduleName (A.A (region,_) decl) =
2222 let typeVar = Var.fromModule moduleName
2323
src/Canonicalize/Environment.hs+3−3
@@ -7,7 +7,7 @@ import qualified Data.Maybe as Maybe
77import qualified Data.Set as Set
88
99import AST.Expression.General (saveEnvName)
10−import qualified AST.Module as Module
10+import qualified AST.Module.Name as ModuleName
1111import qualified AST.Pattern as P
1212import qualified AST.Type as Type
1313import qualified AST.Variable as Var
@@ -17,7 +17,7 @@ import Elm.Utils ((|>))
1717-- ENVIRONMENT
1818
1919data Environment = Env
20− { _home :: Module.Name
20+ { _home :: ModuleName.Canonical
2121 , _values :: Dict Var.Canonical
2222 , _adts :: Dict Var.Canonical
2323 , _aliases :: Dict (Var.Canonical, [String], Type.Canonical)
@@ -29,7 +29,7 @@ type Dict a =
2929 Map.Map String (Set.Set a)
3030
3131
32−fromPatches :: Module.Name -> [Patch] -> Environment
32+fromPatches :: ModuleName.Canonical -> [Patch] -> Environment
3333fromPatches moduleName patches =
3434 addPatches
3535 patches
src/Canonicalize/Result.hs+4−4
@@ -6,7 +6,7 @@ import qualified Control.Applicative as A
66import qualified Data.Functor as F
77import qualified Data.Set as Set
88
9−import qualified AST.Module as Module
9+import qualified AST.Module.Name as ModuleName
1010import qualified AST.Variable as Var
1111import qualified Reporting.Annotation as A
1212import qualified Reporting.Error.Canonicalize as Error
@@ -16,7 +16,7 @@ type ResultErr a = Result (A.Located Error.Error) a
1616
1717
1818data Result err a =
19− Result (Set.Set Module.Name) (RawResult err a)
19+ Result (Set.Set ModuleName.Raw) (RawResult err a)
2020
2121
2222data RawResult err a
@@ -95,7 +95,7 @@ instance A.Applicative (Result e) where
9595
9696-- TRACK USES OF IMPORTS
9797
98−addModule :: Module.Name -> Result e a -> Result e a
98+addModule :: ModuleName.Raw -> Result e a -> Result e a
9999addModule home (Result uses result) =
100100 Result (Set.insert home uses) result
101101
@@ -103,7 +103,7 @@ addModule home (Result uses result) =
103103var' :: (a -> Var.Canonical) -> a -> Result e a
104104var' toVar value =
105105 case toVar value of
106− Var.Canonical (Var.Module moduleName) _name ->
106+ Var.Canonical (Var.Module (ModuleName.Canonical _ moduleName)) _name ->
107107 Result (Set.singleton moduleName) (Ok value)
108108
109109 Var.Canonical _ _ ->
src/Canonicalize/Setup.hs+39−31
@@ -11,6 +11,7 @@ import qualified Data.Traversable as Trav
1111import qualified AST.Declaration as D
1212import qualified AST.Expression.Valid as Valid
1313import qualified AST.Module as Module
14+import qualified AST.Module.Name as ModuleName
1415import qualified AST.Pattern as P
1516import qualified AST.Type as Type
1617import qualified AST.Variable as Var
@@ -25,50 +26,57 @@ import qualified Canonicalize.Type as Canonicalize
2526
2627
2728environment
28− :: Module.Interfaces
29+ :: Map.Map ModuleName.Raw ModuleName.Canonical
30+ -> Module.Interfaces
2931 -> Module.ValidModule
3032 -> Result.ResultErr Env.Environment
31−environment interfaces modul@(Module.Module _ _ _ _ (defaults, imports) decls) =
32− let moduleName =
33− Module.names modul
33+environment importDict interfaces (Module.Module name _ _ _ (defaults, imports) decls) =
34+ let
35+ allImports =
36+ imports ++ map (A.A (error "default import not found")) defaults
3437
35− allImports =
36− imports ++ map (A.A (error "default import not found")) defaults
38+ importPatchesResult =
39+ concat <$> Trav.traverse (importPatches importDict interfaces) allImports
3740
38− importPatchesResult =
39− concat <$> Trav.traverse (importPatches interfaces) allImports
41+ (typeAliasNodes, declPatches) =
42+ declarationsToPatches name decls
4043
41− (typeAliasNodes, declPatches) =
42− declarationsToPatches moduleName decls
43−
44− patches =
45− (++) (Env.builtinPatches ++ declPatches) <$> importPatchesResult
44+ patches =
45+ (++) (Env.builtinPatches ++ declPatches) <$> importPatchesResult
4646 in
47− (Env.fromPatches moduleName <$> patches)
48− `Result.andThen` addTypeAliases moduleName typeAliasNodes
47+ (Env.fromPatches name <$> patches)
48+ `Result.andThen` addTypeAliases name typeAliasNodes
4949
5050
5151-- PATCHES FOR IMPORTS
5252
5353importPatches
54− :: Module.Interfaces
55− -> A.Located (Module.Name, Module.ImportMethod)
54+ :: Map.Map ModuleName.Raw ModuleName.Canonical
55+ -> Module.Interfaces
56+ -> A.Located (ModuleName.Raw, Module.ImportMethod)
5657 -> Result.ResultErr [Env.Patch]
57−importPatches allInterfaces (A.A region (importName, method)) =
58− case restrictToPublicApi <$> Map.lookup importName allInterfaces of
58+importPatches importDict allInterfaces (A.A region (rawImportName, method)) =
59+ let
60+ maybeInterface =
61+ do canonicalName <- Map.lookup rawImportName importDict
62+ interface <- Map.lookup canonicalName allInterfaces
63+ return (canonicalName, restrictToPublicApi interface)
64+ in
65+ case maybeInterface of
5966 Nothing ->
60− if Module.nameIsNative importName then
67+ if ModuleName.isNative rawImportName then
6168 Result.ok []
6269
6370 else
6471 allInterfaces
6572 |> Map.keys
66− |> Error.nearbyNames Module.nameToString importName
67− |> Error.moduleNotFound importName
73+ |> map ModuleName._module
74+ |> Error.nearbyNames ModuleName.toString rawImportName
75+ |> Error.moduleNotFound rawImportName
6876 |> A.A region
6977 |> Result.err
7078
71− Just interface ->
79+ Just (importName, interface) ->
7280 let (Module.ImportMethod maybeAlias listing) =
7381 method
7482
@@ -76,7 +84,7 @@ importPatches allInterfaces (A.A region (importName, method)) =
7684 listing
7785
7886 qualifier =
79− maybe (Module.nameToString importName) id maybeAlias
87+ maybe (ModuleName.toString rawImportName) id maybeAlias
8088
8189 qualifiedPatches =
8290 interfacePatches importName (qualifier ++ ".") interface
@@ -89,7 +97,7 @@ importPatches allInterfaces (A.A region (importName, method)) =
8997 (++) qualifiedPatches <$> unqualifiedPatches
9098
9199
92−interfacePatches :: Module.Name -> String -> Module.Interface -> [Env.Patch]
100+interfacePatches :: ModuleName.Canonical -> String -> Module.Interface -> [Env.Patch]
93101interfacePatches moduleName prefix interface =
94102 let genericPatch mkPatch name value =
95103 mkPatch (prefix ++ name) value
@@ -124,7 +132,7 @@ interfacePatches moduleName prefix interface =
124132
125133valueToPatches
126134 :: R.Region
127− -> Module.Name
135+ -> ModuleName.Canonical
128136 -> Module.Interface
129137 -> Var.Value
130138 -> Result.ResultErr [Env.Patch]
@@ -139,7 +147,7 @@ valueToPatches region moduleName interface value =
139147 Module.iExports interface
140148 |> getNames
141149 |> Error.nearbyNames id x
142− |> Error.valueNotFound moduleName x
150+ |> Error.valueNotFound (ModuleName._module moduleName) x
143151 |> A.A region
144152 |> Result.err
145153 in
@@ -232,7 +240,7 @@ node region name tvars alias =
232240
233241
234242addTypeAliases
235− :: Module.Name
243+ :: ModuleName.Canonical
236244 -> [Node]
237245 -> Env.Environment
238246 -> Result.ResultErr Env.Environment
@@ -244,7 +252,7 @@ addTypeAliases moduleName typeAliasNodes initialEnv =
244252
245253
246254addTypeAlias
247− :: Module.Name
255+ :: ModuleName.Canonical
248256 -> Graph.SCC (R.Region, String, [String], Type.Raw)
249257 -> Env.Environment
250258 -> Result.ResultErr Env.Environment
@@ -272,7 +280,7 @@ addTypeAlias moduleName scc env =
272280-- DECLARATIONS TO PATCHES
273281
274282declarationsToPatches
275− :: Module.Name
283+ :: ModuleName.Canonical
276284 -> [D.ValidDecl]
277285 -> ([Node], [Env.Patch])
278286declarationsToPatches moduleName decls =
@@ -288,7 +296,7 @@ declarationsToPatches moduleName decls =
288296-- _values that are defined as top-level declarations are (Var.TopLevel ...)
289297-- all other _values are local (Var.Local)
290298declToPatches
291− :: Module.Name
299+ :: ModuleName.Canonical
292300 -> D.ValidDecl
293301 -> (Maybe Node, [Env.Patch])
294302declToPatches moduleName (A.A (region,_) decl) =
src/Canonicalize/Variable.hs+11−11
@@ -6,7 +6,7 @@ import qualified Data.Map as Map
66import qualified Data.Set as Set
77
88import qualified AST.Helpers as Help
9−import qualified AST.Module as Module
9+import qualified AST.Module.Name as ModuleName
1010import qualified AST.Type as Type
1111import qualified AST.Variable as Var
1212import qualified Reporting.Annotation as A
@@ -22,8 +22,8 @@ variable :: R.Region -> Env.Environment -> String -> Result.ResultErr Var.Canoni
2222variable region env var =
2323 case toVarName var of
2424 Right (name, varName)
25− | Module.nameIsNative name ->
26− Result.var (Var.Canonical (Var.Module name) varName)
25+ | ModuleName.isNative name ->
26+ error "TODO" "Result.var (Var.Canonical (Var.Module name) varName)"
2727
2828 _ ->
2929 case Set.toList `fmap` Map.lookup var (Env._values env) of
@@ -134,7 +134,7 @@ preferLocals' region env extract kind possibilities var =
134134 vars = map (Var.toString . extract) possibleVars
135135
136136
137−isLocal :: [String] -> Var.Canonical -> Bool
137+isLocal :: ModuleName.Canonical -> Var.Canonical -> Bool
138138isLocal contextName (Var.Canonical home _) =
139139 case home of
140140 Var.Local ->
@@ -163,7 +163,7 @@ isTopLevel (Var.Canonical home _) =
163163-- NOT FOUND HELPERS
164164
165165type VarName =
166− Either String (Module.Name, String)
166+ Either String (ModuleName.Raw, String)
167167
168168
169169toVarName :: String -> VarName
@@ -180,9 +180,9 @@ noQualifier name =
180180 Right (_, x) -> x
181181
182182
183−qualifiedToString :: (Module.Name, String) -> String
183+qualifiedToString :: (ModuleName.Raw, String) -> String
184184qualifiedToString (modul, name) =
185− Module.nameToString (modul ++ [name])
185+ ModuleName.toString modul ++ "." ++ name
186186
187187
188188isOp :: VarName -> Bool
@@ -225,16 +225,16 @@ exposedProblem name possibleNames =
225225
226226
227227qualifiedProblem
228− :: Module.Name
228+ :: ModuleName.Raw
229229 -> String
230− -> [(Module.Name, String)]
230+ -> [(ModuleName.Raw, String)]
231231 -> (Error.VarProblem, [String])
232232qualifiedProblem moduleName name allQualified =
233233 let availableModules =
234234 Set.fromList (map fst allQualified)
235235
236236 moduleNameString =
237− Module.nameToString moduleName
237+ ModuleName.toString moduleName
238238 in
239239 case Set.member moduleName availableModules of
240240 True ->
@@ -248,6 +248,6 @@ qualifiedProblem moduleName name allQualified =
248248 False ->
249249 ( Error.UnknownQualifier moduleNameString name
250250 , Set.toList availableModules
251− |> map Module.nameToString
251+ |> map ModuleName.toString
252252 |> Error.nearbyNames id moduleNameString
253253 )
src/Compile.hs+9−33
@@ -3,6 +3,7 @@ module Compile (compile) where
33import qualified Data.Map as Map
44
55import qualified AST.Module as Module
6+import qualified AST.Module.Name as ModuleName
67import qualified Canonicalize
78import Elm.Utils ((|>))
89import qualified Elm.Package as Package
@@ -17,31 +18,23 @@ import qualified Type.Inference as TI
1718
1819
1920compile
20− :: Map.Map Module.Name Package.Name
21− -> Package.Name
21+ :: Package.Name
2222 -> Bool
23− -> Module.CanonicalInterfaces
23+ -> [ModuleName.Canonical]
24+ -> Module.Interfaces
2425 -> String
2526 -> Result.Result Warning.Warning Error.Error Module.CanonicalModule
2627
27−compile importedPackages packageName isRoot interfaces source =
28+compile packageName isRoot canonicalImports interfaces source =
2829 do
29− -- determine if default imports should be added
30− -- only elm-lang/core is exempt
31− let needsDefaults =
32− not (packageName == Package.coreName)
33−
34− let normalInterfaces =
35− unCanonicalizeInterfaces importedPackages interfaces
36−
3730 -- Parse the source code
3831 validModule <-
3932 Result.mapError Error.Syntax $
40− Parse.program needsDefaults isRoot (getOpTable interfaces) source
33+ Parse.program packageName isRoot (getOpTable interfaces) source
4134
4235 -- Canonicalize all variables, pinning down where they came from.
4336 canonicalModule <-
44− Canonicalize.module' normalInterfaces validModule
37+ Canonicalize.module' canonicalImports interfaces validModule
4538
4639 -- Run type inference on the program.
4740 types <-
@@ -52,7 +45,7 @@ compile importedPackages packageName isRoot interfaces source =
5245 Result.mapError Error.Type $
5346 Nitpick.topLevelTypes types (Module.body validModule)
5447
55− Nitpick.patternMatches normalInterfaces canonicalModule
48+ Nitpick.patternMatches interfaces canonicalModule
5649
5750 -- Add the real list of types
5851 let body = (Module.body canonicalModule) { Module.types = types }
@@ -60,26 +53,9 @@ compile importedPackages packageName isRoot interfaces source =
6053 return $ canonicalModule { Module.body = body }
6154
6255
63−getOpTable :: Module.CanonicalInterfaces -> Parse.OpTable
56+getOpTable :: Module.Interfaces -> Parse.OpTable
6457getOpTable interfaces =
6558 Map.elems interfaces
6659 |> concatMap Module.iFixities
6760 |> map (\(assoc,lvl,op) -> (op,(lvl,assoc)))
6861 |> Map.fromList
69−
70−
71−unCanonicalizeInterfaces
72− :: Map.Map Module.Name Package.Name
73− -> Module.CanonicalInterfaces
74− -> Module.Interfaces
75−unCanonicalizeInterfaces packageInfo ifaces =
76− let
77− foldFun canonName iface mapSoFar =
78− case Map.lookup (Module.canonModul canonName) packageInfo of
79− Just pkg | pkg == Module.iPackage iface ->
80− Map.insert (Module.canonModul canonName) iface mapSoFar
81−
82− _ ->
83− mapSoFar
84− in
85− Map.foldrWithKey foldFun Map.empty ifaces
src/Elm/Compiler.hs+10−13
@@ -50,9 +50,9 @@ parseDependencies sourceCode =
5050 Result.Err msgs ->
5151 Left $ map (Error . A.map Error.Syntax) msgs
5252
53− Result.Ok (Module.Header names _docs _exports imports) ->
53+ Result.Ok (Module.Header name _docs _exports imports) ->
5454 Right
55− ( PublicModule.Name names
55+ ( PublicModule.Name name
5656 , map (PublicModule.Name . fst . A.drop) imports
5757 )
5858
@@ -63,22 +63,16 @@ parseDependencies sourceCode =
6363compile
6464 :: Context
6565 -> String
66− -> Map.Map PublicModule.CanonicalName PublicModule.Interface
66+ -> PublicModule.Interfaces
6767 -> (Dealiaser, [Warning], Either [Error] Result)
6868
6969compile context source interfaces =
7070 let
71− (Context packageName isRoot isExposed modulePackages) =
71+ (Context packageName isRoot isExposed dependencies) =
7272 context
7373
74− unwrappedInterfaces =
75− Map.mapKeysMonotonic PublicModule.fromCanonicalName interfaces
76−
77− unwrappedPackages =
78− Map.mapKeysMonotonic (\(PublicModule.Name strs) -> strs ) modulePackages
79−
8074 (Result.Result (dealiaser, warnings) rawResult) =
81− do modul <- Compile.compile unwrappedPackages packageName isRoot unwrappedInterfaces source
75+ do modul <- Compile.compile packageName isRoot dependencies interfaces source
8276 docs <- docsGen isExposed modul
8377
8478 let interface = Module.toInterface packageName modul
@@ -97,7 +91,7 @@ data Context = Context
9791 { _packageName :: Package.Name
9892 , _isRoot :: Bool
9993 , _isExposed :: Bool
100− , _modulePackages :: Map.Map PublicModule.Name Package.Name
94+ , _dependencies :: [PublicModule.Canonical]
10195 }
10296
10397
@@ -120,8 +114,11 @@ docsGen isExposed modul =
120114 getChecked =
121115 Docs.check (Module.exports modul) (Module.docs modul)
122116
117+ name =
118+ PublicModule.Name (PublicModule._module (Module.name modul))
119+
123120 toDocs checked =
124− Docs.fromCheckedDocs (PublicModule.Name (Module.names modul)) checked
121+ Docs.fromCheckedDocs name checked
125122 in
126123 (Just . toDocs) `fmap` Result.mapError Error.Docs getChecked
127124
src/Elm/Compiler/Module.hs+6−29
@@ -1,13 +1,12 @@
11module Elm.Compiler.Module
2− ( Interface, Name(Name), name
3− , CanonicalName(CanonicalName), canonicalName, canonPkg, canonModul
4− , fromCanonicalName, canonFromPackage
2+ ( Interface, Interfaces, Name(Name)
53 , nameToPath
64 , nameToString, nameFromString
75 , hyphenate, dehyphenate
86 , defaultImports
97 , interfacePorts
108 , interfaceAliasedTypes
9+ , ModuleName.Canonical(..)
1110 )
1211 where
1312
@@ -21,10 +20,10 @@ import qualified Data.Text as Text
2120import System.FilePath ((</>))
2221
2322import qualified AST.Module as Module
23+import qualified AST.Module.Name as ModuleName
2424import qualified Elm.Compiler.Imports as Imports
2525import qualified Elm.Compiler.Type as Type
2626import qualified Elm.Compiler.Type.Extract as Extract
27−import qualified Elm.Package as Package
2827
2928
3029-- EXPOSED TYPES
@@ -32,33 +31,11 @@ import qualified Elm.Package as Package
3231type Interface = Module.Interface
3332
3433
35−newtype Name = Name [String]
36− deriving (Eq, Ord)
37−
38−data CanonicalName =
39− CanonicalName
40− { canonPkg :: Package.Name
41− , canonVersion :: Package.Version
42− , canonModul :: Name
43− } deriving (Eq, Ord)
44−
45−
46−canonFromPackage :: Package.Package -> Name -> CanonicalName
47−canonFromPackage (pk, vr) nm =
48− CanonicalName pk vr nm
49−
34+type Interfaces = Module.Interfaces
5035
51−fromCanonicalName :: CanonicalName -> Module.CanonicalName
52−fromCanonicalName (CanonicalName p _ (Name n)) =
53− Module.CanonicalName p n
5436
55−
56−canonicalName :: Package.Name -> Package.Version -> Name -> CanonicalName
57−canonicalName = CanonicalName
58−
59−
60−name :: [String] -> Name
61−name = Name
37+newtype Name = Name ModuleName.Raw
38+ deriving (Eq, Ord)
6239
6340
6441defaultImports :: [Name]
src/Elm/Package.hs+14−15
@@ -1,8 +1,6 @@
1−{-# LANGUAGE FlexibleContexts #-}
21module Elm.Package where
32
43import Control.Applicative ((<$>), (<*>))
5−import Control.Monad.Error.Class (MonadError, throwError)
64import Data.Aeson
75import Data.Binary
86import qualified Data.List as List
@@ -12,11 +10,14 @@ import System.FilePath ((</>))
1210import Data.Char (isDigit)
1311import Data.Function (on)
1412
13+
14+-- PACKGE NAMES
15+
1516data Name = Name
1617 { user :: String
1718 , project :: String
1819 }
19− deriving (Eq, Ord)
20+ deriving (Eq, Ord, Show)
2021
2122
2223type Package = (Name, Version)
@@ -55,11 +56,6 @@ fromString string =
5556 _ -> Nothing
5657
5758
58−fromString' :: (MonadError String m) => String -> m Name
59−fromString' string =
60− Maybe.maybe (throwError $ errorMsg string) return (fromString string)
61−
62−
6359instance Binary Name where
6460 get = Name <$> get <*> get
6561 put (Name user project) =
@@ -69,10 +65,13 @@ instance Binary Name where
6965
7066instance FromJSON Name where
7167 parseJSON (String text) =
72− let string = T.unpack text in
73− Maybe.maybe (fail $ errorMsg string) return (fromString string)
68+ let
69+ string = T.unpack text
70+ in
71+ Maybe.maybe (fail (errorMsg string)) return (fromString string)
7472
75− parseJSON _ = fail "Project name must be a string."
73+ parseJSON _ =
74+ fail "Project name must be a string."
7675
7776
7877instance ToJSON Name where
@@ -88,12 +87,12 @@ errorMsg string =
8887 ]
8988
9089
91−
90+-- PACKAGE VERSIONS
9291
9392data Version = Version
94− { major :: Int
95− , minor :: Int
96− , patch :: Int
93+ { _major :: Int
94+ , _minor :: Int
95+ , _patch :: Int
9796 }
9897 deriving (Eq, Ord)
9998
src/Generate/JavaScript.hs+7−107
@@ -6,19 +6,16 @@ import Control.Monad.State
66import qualified Data.List as List
77import qualified Data.Map as Map
88import qualified Data.Maybe as Maybe
9−import qualified Data.Set as Set
10−import Language.ECMAScript3.PrettyPrint
119import Language.ECMAScript3.Syntax
1210
13−import AST.Module
1411import AST.Expression.General as Expr
1512import qualified AST.Expression.Optimized as Opt
1613import qualified AST.Helpers as Help
1714import AST.Literal
1815import qualified AST.Module as Module
16+import qualified AST.Module.Name as ModuleName
1917import qualified AST.Pattern as P
2018import qualified AST.Variable as Var
21−import Elm.Utils ((|>))
2219import Generate.JavaScript.Helpers as Help
2320import qualified Generate.JavaScript.Crash as Crash
2421import qualified Generate.JavaScript.Port as Port
@@ -28,20 +25,12 @@ import qualified Reporting.Annotation as A
2825import qualified Reporting.Crash as Crash
2926
3027
31−-- HELPERS
28+generate :: Module.Optimized -> String
29+generate modul =
30+ error "TODO" modul exprToCode
3231
33−internalImports :: Module.Name -> [VarDecl ()]
34−internalImports name =
35− [ varDecl "_N" (obj ["Elm","Native"])
36− , include "_U" "Utils"
37− , include "_L" "List"
38− , varDecl Crash.localModuleName (string (Module.nameToString name))
39− ]
40− where
41− include :: String -> String -> VarDecl ()
42− include alias modul =
43− varDecl alias (Help.make ["_N", modul])
4432
33+-- HELPERS
4534
4635_Utils :: String -> Expression ()
4736_Utils x =
@@ -419,9 +408,6 @@ crushIfsHelp visitedBranches unvisitedBranches finally =
419408 (A.A _ (Literal (Boolean True)), branch) : _ ->
420409 crushIfsHelp visitedBranches [] branch
421410
422− (A.A _ (Var (Var.Canonical (Var.Module ["Basics"]) "otherwise")), branch) : _ ->
423− crushIfsHelp visitedBranches [] branch
424−
425411 visiting : unvisited ->
426412 crushIfsHelp (visiting : visitedBranches) unvisited finally
427413
@@ -597,92 +583,6 @@ flattenLets defs lexpr@(A.A _ expr) =
597583 _ -> (defs, lexpr)
598584
599585
600−generate :: Module.Optimized -> String
601−generate modul =
602− show . prettyPrint $ setup "Elm" (names ++ ["make"]) ++
603− [ assign ("Elm" : names ++ ["make"]) (function [localRuntime] programStmts) ]
604− where
605− names :: [String]
606− names = Module.names modul
607−
608− thisModule :: Expression ()
609− thisModule = obj (localRuntime : names ++ ["values"])
610−
611− programStmts :: [Statement ()]
612− programStmts =
613− concat
614− [ [ ExprStmt () (string "use strict") ]
615− , setup localRuntime (names ++ ["values"])
616− , [ IfSingleStmt () thisModule (ret thisModule) ]
617− , [ VarDeclStmt () localVars ]
618− , body
619− , [ jsExports ]
620− , [ ret thisModule ]
621− ]
622−
623− localVars :: [VarDecl ()]
624− localVars =
625− varDecl "_op" (ObjectLit () [])
626− : internalImports (Module.names modul)
627− ++ explicitImports
628− where
629− explicitImports :: [VarDecl ()]
630− explicitImports =
631− Module.imports modul
632− |> Set.fromList
633− |> Set.toList
634− |> map jsImport
635−
636− jsImport :: Module.Name -> VarDecl ()
637− jsImport name =
638− varDecl (Var.moduleName name) $
639− obj ("Elm" : name ++ ["make"]) <| ref localRuntime
640−
641− body :: [Statement ()]
642− body =
643− concat (evalState defs 0)
644− where
645− defs =
646− Module.program (Module.body modul)
647− |> flattenLets []
648− |> fst
649− |> mapM defToStatements
650−
651− setup namespace path =
652− map create paths
653− where
654− create name =
655− assign name (InfixExpr () OpLOr (obj name) (ObjectLit () []))
656− paths =
657− namespace : path
658− |> List.inits
659− |> init
660− |> drop 2
661−
662− jsExports =
663− assign (localRuntime : names ++ ["values"]) (ObjectLit () exs)
664− where
665− exs = map entry $ "_op" : concatMap extract (exports modul)
666− entry x = (prop x, ref x)
667− extract value =
668− case value of
669− Var.Alias _ -> []
670−
671− Var.Value x
672− | Help.isOp x -> []
673− | otherwise -> [Var.varName x]
674−
675− Var.Union _ (Var.Listing ctors _) ->
676− map Var.varName ctors
677−
678− assign path expr =
679− case path of
680− [x] -> VarDeclStmt () [ varDecl x expr ]
681− _ ->
682− ExprStmt () $
683− AssignExpr () OpAssign (LDot () (obj (init path)) (last path)) expr
684−
685−
686586-- BINARY OPERATORS
687587
688588binop
@@ -753,7 +653,7 @@ backwardApply =
753653
754654inBasics :: String -> Var.Canonical
755655inBasics name =
756− Var.Canonical (Var.Module ["Basics"]) name
656+ Var.inCore ["Basics"] name
757657
758658
759659-- BINARY OPERATOR HELPERS
@@ -764,7 +664,7 @@ makeExpr qualifiedOp@(Var.Canonical home op) =
764664 simpleMake left right =
765665 ref "A2" `call` [ Var.canonical qualifiedOp, left, right ]
766666 in
767− if home == Var.Module ["Basics"] then
667+ if home == Var.Module (ModuleName.inCore ["Basics"]) then
768668 Map.findWithDefault simpleMake op basicOps
769669 else
770670 simpleMake
src/Generate/JavaScript/Variable.hs+37−20
@@ -1,13 +1,15 @@
11module Generate.JavaScript.Variable where
22
3−import qualified AST.Helpers as Help
4−import qualified AST.Module as Module
5−import qualified AST.Variable as Var
63import qualified Data.List as List
74import qualified Data.Set as Set
8−import qualified Generate.JavaScript.Helpers as JS
95import qualified Language.ECMAScript3.Syntax as JS
106
7+import qualified AST.Helpers as Help
8+import qualified AST.Module.Name as ModuleName
9+import qualified AST.Variable as Var
10+import qualified Elm.Package as Pkg
11+import qualified Generate.JavaScript.Helpers as JS
12+
1113
1214swap :: Char -> Char -> Char -> Char
1315swap from to c =
@@ -16,21 +18,36 @@ swap from to c =
1618
1719canonical :: Var.Canonical -> JS.Expression ()
1820canonical (Var.Canonical home name) =
19− case Help.isOp name of
20− True -> JS.BracketRef () (JS.obj (home' ++ ["_op"])) (JS.string name)
21− False -> JS.obj (home' ++ [ varName name ])
22− where
23− home' =
24− case home of
25− Var.Local -> []
26− Var.TopLevel _ -> []
27− Var.BuiltIn -> []
28− Var.Module path -> [ moduleName path ]
21+ if Help.isOp name then
22+ JS.BracketRef () (JS.ref (addRoot home "_op")) (JS.string name)
23+
24+ else
25+ JS.ref (addRoot home (varName name))
26+
27+
28+addRoot :: Var.Home -> String -> String
29+addRoot home name =
30+ case home of
31+ Var.Local ->
32+ name
33+
34+ Var.TopLevel moduleName ->
35+ canonicalName moduleName name
36+
37+ Var.BuiltIn ->
38+ name
39+
40+ Var.Module moduleName ->
41+ canonicalName moduleName name
42+
2943
44+canonicalName :: ModuleName.Canonical -> String -> String
45+canonicalName (ModuleName.Canonical (Pkg.Name user project) moduleName) name =
46+ map (swap '-' '_') user
47+ ++ '$' : map (swap '-' '_') project
48+ ++ '$' : List.intercalate "$" moduleName
49+ ++ '$' : name
3050
31−moduleName :: Module.Name -> String
32−moduleName name =
33− '$' : List.intercalate "$" name
3451
3552
3653varName :: String -> String
@@ -41,9 +58,9 @@ varName name =
4158 map (swap '\'' '$') saferName
4259
4360
44−value :: Module.Name -> String -> JS.Expression ()
45−value home name =
46− canonical (Var.Canonical (Var.Module home) name)
61+--value :: Module.Name -> String -> JS.Expression ()
62+--value home name =
63+-- canonical (Var.Canonical (Var.Module home) name)
4764
4865
4966jsReserveds :: Set.Set String
src/Nitpick/PatternMatches.hs+3−2
@@ -11,6 +11,7 @@ import qualified AST.Expression.General as E
1111import qualified AST.Expression.Canonical as Canonical
1212import qualified AST.Helpers as Help
1313import qualified AST.Module as Module
14+import qualified AST.Module.Name as ModuleName
1415import qualified AST.Pattern as Pattern
1516import qualified AST.Variable as Var
1617import Elm.Utils ((|>))
@@ -27,7 +28,7 @@ patternMatches
2728 -> Result.Result Warning.Warning e ()
2829patternMatches interfaces modul =
2930 let
30− name = Module.names modul
31+ name = Module.name modul
3132 body = Module.body modul
3233 in
3334 checkExpression
@@ -44,7 +45,7 @@ type TagDict =
4445type Tag = String
4546
4647
47−toTagDict :: Module.Interfaces -> Module.Name -> Module.ADTs -> TagDict
48+toTagDict :: Module.Interfaces -> ModuleName.Canonical -> Module.ADTs -> TagDict
4849toTagDict interfaces localName localAdts =
4950 let
5051 listTags =
src/Nitpick/TopLevelTypes.hs+49−29
@@ -7,9 +7,11 @@ import qualified Data.Map as Map
77
88import qualified AST.Expression.Valid as Valid
99import qualified AST.Declaration as Decl
10+import qualified AST.Module.Name as ModuleName
1011import qualified AST.Pattern as P
1112import qualified AST.Type as Type
1213import qualified AST.Variable as Var
14+import qualified Elm.Package as Pkg
1315import qualified Reporting.Annotation as A
1416import qualified Reporting.Error.Type as Error
1517import qualified Reporting.Result as Result
@@ -77,39 +79,57 @@ validMainTypes =
7779 , signal element
7880 , signal html
7981 ]
80− where
81− fromModule :: [String] -> String -> Type.Canonical
82− fromModule home name =
83− Type.Type (Var.fromModule home name)
8482
85− html =
86− fromModule ["VirtualDom"] "Node"
8783
88− signal tipe =
89− Type.App (fromModule ["Signal"] "Signal") [ tipe ]
84+html :: Type.Canonical
85+html =
86+ Type.Type (Var.fromModule virtualDom "Node")
9087
91− element =
92− let builtin name =
93− Type.Type (Var.builtin name)
9488
95− maybe tipe =
96− Type.App (fromModule ["Maybe"] "Maybe") [ tipe ]
97− in
89+virtualDom :: ModuleName.Canonical
90+virtualDom =
91+ ModuleName.Canonical (Pkg.Name "evancz" "virtual-dom") ["VirtualDom"]
92+
93+
94+element :: Type.Canonical
95+element =
96+ Type.Record
97+ [ ("element", core ["Graphics","Element"] "ElementPrim")
98+ , ("props",
9899 Type.Record
99− [ ("element", fromModule ["Graphics","Element"] "ElementPrim")
100− , ("props",
101− Type.Record
102− [ ("click" , builtin "_Tuple0")
103− , ("color" , maybe (fromModule ["Color"] "Color"))
104− , ("height" , builtin "Int")
105− , ("hover" , builtin "_Tuple0")
106− , ("href" , builtin "String")
107− , ("id" , builtin "Int")
108− , ("opacity", builtin "Float")
109− , ("tag" , builtin "String")
110− , ("width" , builtin "Int")
111− ]
112− Nothing
113− )
100+ [ ("click" , builtin "_Tuple0")
101+ , ("color" , maybe (core ["Color"] "Color"))
102+ , ("height" , builtin "Int")
103+ , ("hover" , builtin "_Tuple0")
104+ , ("href" , builtin "String")
105+ , ("id" , builtin "Int")
106+ , ("opacity", builtin "Float")
107+ , ("tag" , builtin "String")
108+ , ("width" , builtin "Int")
114109 ]
115110 Nothing
111+ )
112+ ]
113+ Nothing
114+
115+
116+core :: [String] -> String -> Type.Canonical
117+core home name =
118+ Type.Type (Var.inCore home name)
119+
120+
121+signal :: Type.Canonical -> Type.Canonical
122+signal tipe =
123+ Type.App (core ["Signal"] "Signal") [ tipe ]
124+
125+
126+maybe :: Type.Canonical -> Type.Canonical
127+maybe tipe =
128+ Type.App (core ["Maybe"] "Maybe") [ tipe ]
129+
130+
131+builtin :: String -> Type.Canonical
132+builtin name =
133+ Type.Type (Var.builtin name)
134+
135+
src/Parse/Module.hs+8−4
@@ -5,6 +5,7 @@ import Text.Parsec hiding (newline, spaces)
55
66import Parse.Helpers
77import qualified AST.Module as Module
8+import qualified AST.Module.Name as ModuleName
89import qualified AST.Variable as Var
910import Reporting.Annotation as A
1011
@@ -12,13 +13,16 @@ import Reporting.Annotation as A
1213getModuleName :: String -> Maybe String
1314getModuleName source =
1415 case iParse getModuleName source of
15− Right name -> Just name
16− Left _ -> Nothing
16+ Right name ->
17+ Just name
18+
19+ Left _ ->
20+ Nothing
1721 where
1822 getModuleName =
1923 do optional freshLine
2024 (names, _) <- moduleDecl
21− return (Module.nameToString names)
25+ return (ModuleName.toString names)
2226
2327
2428header :: IParser (Module.Header [Module.UserImport])
@@ -60,7 +64,7 @@ import' =
6064 do try (reserved "import")
6165 whitespace
6266 names <- dotSep1 capVar
63− (,) names <$> method (Module.nameToString names)
67+ (,) names <$> method (ModuleName.toString names)
6468 where
6569 method :: String -> IParser Module.ImportMethod
6670 method defaultAlias =
src/Parse/Parse.hs+19−10
@@ -9,7 +9,9 @@ import qualified Text.Parsec.Error as Parsec
99
1010import qualified AST.Declaration as D
1111import qualified AST.Module as M
12+import qualified AST.Module.Name as ModuleName
1213import qualified Elm.Compiler.Imports as Imports
14+import qualified Elm.Package as Package
1315import Parse.Helpers
1416import qualified Parse.Module as Module
1517import qualified Parse.Declaration as Decl
@@ -20,33 +22,40 @@ import qualified Validate
2022
2123
2224program
23− :: Bool
25+ :: Package.Name
2426 -> Bool
2527 -> OpTable
2628 -> String
2729 -> Result.Result wrn Error.Error M.ValidModule
28−program needsDefaults isRoot table src =
29− do (M.Module names filePath docs exports imports sourceDecls) <-
30− parseWithTable table src programParser
30+program pkgName isRoot table src =
31+ do (M.Module name filePath docs exports imports sourceDecls) <-
32+ parseWithTable table src (programParser pkgName)
3133
3234 validDecls <- Validate.declarations isRoot sourceDecls
3335
36+ -- determine if default imports should be added, only elm-lang/core is exempt
3437 let ammendedImports =
35− (if needsDefaults then Imports.defaults else [], imports)
38+ ( if pkgName == Package.coreName then [] else Imports.defaults
39+ , imports
40+ )
3641
37− return (M.Module names filePath docs exports ammendedImports validDecls)
42+ return (M.Module name filePath docs exports ammendedImports validDecls)
3843
3944
4045-- HEADERS AND DECLARATIONS
4146
42−programParser :: IParser M.SourceModule
43−programParser =
44− do (M.Header names docs exports imports) <- Module.header
47+programParser :: Package.Name -> IParser M.SourceModule
48+programParser pkgName =
49+ do (M.Header name docs exports imports) <- Module.header
4550 decls <- declarations
4651 optional freshLine
4752 optional spaces
4853 eof
49− return $ M.Module names "" docs exports imports decls
54+
55+ let canonicalName =
56+ ModuleName.Canonical pkgName name
57+
58+ return $ M.Module canonicalName "" docs exports imports decls
5059
5160
5261declarations :: IParser [D.SourceDecl]
src/Reporting/Error/Canonicalize.hs+8−8
@@ -3,7 +3,7 @@ module Reporting.Error.Canonicalize where
33
44import qualified Text.PrettyPrint as P
55
6−import qualified AST.Module as Module
6+import qualified AST.Module.Name as ModuleName
77import qualified AST.Type as Type
88import qualified AST.Variable as Var
99import qualified Reporting.Error.Helpers as Help
@@ -16,7 +16,7 @@ data Error
1616 = Var VarError
1717 | Pattern PatternError
1818 | Alias AliasError
19− | Import Module.Name ImportError
19+ | Import ModuleName.Raw ImportError
2020 | Export String [String]
2121 | DuplicateExport String
2222 | Port PortError
@@ -58,16 +58,16 @@ argMismatch name expected actual =
5858-- IMPORTS
5959
6060data ImportError
61− = ModuleNotFound [Module.Name]
61+ = ModuleNotFound [ModuleName.Raw]
6262 | ValueNotFound String [String]
6363
6464
65−moduleNotFound :: Module.Name -> [Module.Name] -> Error
65+moduleNotFound :: ModuleName.Raw -> [ModuleName.Raw] -> Error
6666moduleNotFound name possibilities =
6767 Import name (ModuleNotFound possibilities)
6868
6969
70−valueNotFound :: Module.Name -> String -> [String] -> Error
70+valueNotFound :: ModuleName.Raw -> String -> [String] -> Error
7171valueNotFound name value possibilities =
7272 Import name (ValueNotFound value possibilities)
7373
@@ -178,13 +178,13 @@ toReport dealiaser err =
178178 ++ "line " ++ show (Region.line start)
179179
180180 Import name importError ->
181− let moduleName = Module.nameToString name
181+ let moduleName = ModuleName.toString name
182182 in
183183 case importError of
184184 ModuleNotFound suggestions ->
185185 namingError
186186 ("Could not find a module named `" ++ moduleName ++ "`")
187− (Help.maybeYouWant (map Module.nameToString suggestions))
187+ (Help.maybeYouWant (map ModuleName.toString suggestions))
188188
189189 ValueNotFound value suggestions ->
190190 namingError
@@ -249,7 +249,7 @@ extractSuggestions err =
249249 Import _ importError ->
250250 case importError of
251251 ModuleNotFound suggestions ->
252− Just (map Module.nameToString suggestions)
252+ Just (map ModuleName.toString suggestions)
253253
254254 ValueNotFound _ suggestions ->
255255 Just suggestions
src/Reporting/Warning.hs+3−3
@@ -7,7 +7,7 @@ import qualified Data.Aeson as Json
77import qualified Text.PrettyPrint as P
88import Text.PrettyPrint ((<+>))
99
10−import qualified AST.Module as Module
10+import qualified AST.Module.Name as ModuleName
1111import qualified AST.Type as Type
1212import qualified Nitpick.Pattern as Pattern
1313import qualified Reporting.Annotation as A
@@ -18,7 +18,7 @@ import qualified Reporting.Report as Report
1818-- ALL POSSIBLE WARNINGS
1919
2020data Warning
21− = UnusedImport Module.Name
21+ = UnusedImport ModuleName.Raw
2222 | MissingTypeAnnotation String Type.Canonical
2323 | InexhaustivePatternMatch [Pattern.Pattern]
2424 | RedundantPatternMatch
@@ -42,7 +42,7 @@ toReport dealiaser warning =
4242 UnusedImport moduleName ->
4343 Report.simple
4444 "unused import"
45− ("Module `" ++ Module.nameToString moduleName ++ "` is unused.")
45+ ("Module `" ++ ModuleName.toString moduleName ++ "` is unused.")
4646 ""
4747
4848 MissingTypeAnnotation name inferredType ->
src/Type/Inference.hs+28−21
@@ -6,6 +6,7 @@ import qualified Data.Map as Map
66import qualified Data.Traversable as Traverse
77
88import AST.Module as Module
9+import qualified AST.Module.Name as ModuleName
910import qualified AST.Type as Type
1011import qualified AST.Variable as Var
1112import qualified Reporting.Annotation as A
@@ -22,7 +23,7 @@ import System.IO.Unsafe
2223
2324
2425infer
25− :: CanonicalInterfaces
26+ :: Module.Interfaces
2627 -> Module.CanonicalModule
2728 -> Except [A.Located Error.Error] (Map.Map String Type.Canonical)
2829infer interfaces modul =
@@ -39,7 +40,7 @@ infer interfaces modul =
3940
4041
4142genConstraints
42− :: CanonicalInterfaces
43+ :: Module.Interfaces
4344 -> Module.CanonicalModule
4445 -> IO (Env.TypeDict, T.TypeConstraint)
4546genConstraints interfaces modul =
@@ -69,34 +70,40 @@ genConstraints interfaces modul =
6970
7071canonicalizeValues
7172 :: Env.Environment
72− -> (Module.CanonicalName, Interface)
73+ -> (ModuleName.Canonical, Interface)
7374 -> IO [(String, ([T.Variable], T.Type))]
7475canonicalizeValues env (moduleName, iface) =
7576 forM (Map.toList (iTypes iface)) $ \(name,tipe) ->
7677 do tipe' <- Env.instantiateType env tipe Map.empty
77− return ((Module.nameToString $ Module.canonModul moduleName) ++ "." ++ name, tipe')
78+ return
79+ ( ModuleName.canonicalToString moduleName ++ "." ++ name
80+ , tipe'
81+ )
7882
7983
80−canonicalizeAdts :: CanonicalInterfaces -> Module.CanonicalModule -> [CanonicalAdt]
84+canonicalizeAdts :: Module.Interfaces -> Module.CanonicalModule -> [CanonicalAdt]
8185canonicalizeAdts interfaces modul =
8286 localAdts ++ importedAdts
8387 where
8488 localAdts :: [CanonicalAdt]
85− localAdts = format (Module.names modul, datatypes (body modul))
89+ localAdts =
90+ format (Module.name modul, datatypes (body modul))
8691
8792 importedAdts :: [CanonicalAdt]
88− importedAdts = concatMap (format . second iAdts)
89− (map (\(nm, iface) -> (Module.canonModul nm, iface )) $ Map.toList $ interfaces)
90−
91− format :: (Module.Name, Module.ADTs) -> [CanonicalAdt]
92− format (home, adts) =
93− map canonical (Map.toList adts)
94− where
95− canonical :: (String, AdtInfo String) -> CanonicalAdt
96− canonical (name, (tvars, ctors)) =
97− ( toVar name
98− , (tvars, map (first toVar) ctors)
99− )
100−
101− toVar :: String -> Var.Canonical
102− toVar = Var.Canonical (Var.Module home)
93+ importedAdts =
94+ concatMap (format . second iAdts) (Map.toList interfaces)
95+
96+
97+format :: (ModuleName.Canonical, Module.ADTs) -> [CanonicalAdt]
98+format (home, adts) =
99+ map canonical (Map.toList adts)
100+ where
101+ canonical :: (String, AdtInfo String) -> CanonicalAdt
102+ canonical (name, (tvars, ctors)) =
103+ ( toVar name
104+ , (tvars, map (first toVar) ctors)
105+ )
106+
107+ toVar :: String -> Var.Canonical
108+ toVar name =
109+ Var.fromModule home name