on master help sign in
Do a better job canonicalizing values
commit9e272b6e545dfb3ba00a590b797f64152783e5ba authorEvan Czaplicki <info@elm-lang.org> dateThu 29 May 2014, 14:22 (12 years ago) parentd970976
1 file changed+15−12
compiler/Transform/Canonicalize.hs+15−12
compiler/Transform/Canonicalize.hs+15−12
@@ -111,33 +111,36 @@ addValue name interface env value =
111111 [] -> return names
112112 c:_ -> notFound c
113113
114+-- When canonicalizing, all _values should be Local, but all _adts and _patterns
115+-- should be fully namespaced. With _adts, they may appear in types that can
116+-- escape the module.
114117addDecl :: String -> Environment -> D.ValidDecl -> Either [Doc] Environment
115118addDecl moduleName env decl =
116− let typeVar = Var.Canonical (Var.Module moduleName) in
119+ let namespacedVar = Var.Canonical (Var.Module moduleName)
120+ addLocal x e = insert x (Var.local x) e
121+ addNamespaced x e = insert x (namespacedVar x) e
122+ in
117123 case decl of
118124 D.Definition (Valid.Definition pattern _ _) ->
119125 return $ env
120− { _values = foldr add (_values env) (P.boundVarList pattern) }
121− where
122− add x e = insert x (Var.local x) e
126+ { _values = foldr addLocal (_values env) (P.boundVarList pattern) }
123127
124128 D.Datatype name _ ctors ->
125129 return $ env
126− { _values = addCtors (_values env)
127− , _adts = insert name (typeVar name) (_adts env)
128− , _patterns = addCtors (_patterns env)
130+ { _values = addCtors addLocal (_values env)
131+ , _adts = addNamespaced name (_adts env)
132+ , _patterns = addCtors addNamespaced (_patterns env)
129133 }
130134 where
131− addCtors e = foldr add e (map fst ctors)
132− add name e = insert name (typeVar name) e
135+ addCtors how e = foldr how e (map fst ctors)
133136
134137 D.TypeAlias name tvars alias ->
135138 do alias' <- Either.either throw return (tipe env alias)
136139 return $ env
137− { _aliases = insert name (typeVar name, tvars, alias') (_aliases env)
140+ { _aliases = insert name (namespacedVar name, tvars, alias') (_aliases env)
138141 , _values = case alias of
139− Type.Record _ _ -> insert name (typeVar name) (_values env)
140− _ -> _values env
142+ Type.Record _ _ -> addLocal name (_values env)
143+ _ -> _values env
141144 }
142145 where
143146 throw err = Left [ P.vcat [ P.text $ "Error in type alias '" ++ name ++ "':"