@@ -111,33 +111,36 @@ addValue name interface env value =
111 [] -> return names
111 [] -> return names
112 c:_ -> notFound c
112 c:_ -> notFound c
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.
114addDecl :: String -> Environment -> D.ValidDecl -> Either [Doc] Environment
117addDecl :: String -> Environment -> D.ValidDecl -> Either [Doc] Environment
115addDecl moduleName env decl =
118addDecl 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
117 case decl of
123 case decl of
118 D.Definition (Valid.Definition pattern _ _) ->
124 D.Definition (Valid.Definition pattern _ _) ->
119 return $ env
125 return $ env
120− { _values = foldr add (_values env) (P.boundVarList pattern) }
126+ { _values = foldr addLocal (_values env) (P.boundVarList pattern) }
122− add x e = insert x (Var.local x) e
124 D.Datatype name _ ctors ->
128 D.Datatype name _ ctors ->
125 return $ env
129 return $ env
126− { _values = addCtors (_values env)
130+ { _values = addCtors addLocal (_values env)
127− , _adts = insert name (typeVar name) (_adts env)
131+ , _adts = addNamespaced name (_adts env)
128− , _patterns = addCtors (_patterns env)
132+ , _patterns = addCtors addNamespaced (_patterns env)
131− addCtors e = foldr add e (map fst ctors)
135+ addCtors how e = foldr how e (map fst ctors)
132− add name e = insert name (typeVar name) e
134 D.TypeAlias name tvars alias ->
137 D.TypeAlias name tvars alias ->
135 do alias' <- Either.either throw return (tipe env alias)
138 do alias' <- Either.either throw return (tipe env alias)
136 return $ env
139 return $ env
137− { _aliases = insert name (typeVar name, tvars, alias') (_aliases env)
140+ { _aliases = insert name (namespacedVar name, tvars, alias') (_aliases env)
138 , _values = case alias of
141 , _values = case alias of
139− Type.Record _ _ -> insert name (typeVar name) (_values env)
142+ Type.Record _ _ -> addLocal name (_values env)
140− _ -> _values env
143+ _ -> _values env
143 throw err = Left [ P.vcat [ P.text $ "Error in type alias '" ++ name ++ "':"
146 throw err = Left [ P.vcat [ P.text $ "Error in type alias '" ++ name ++ "':"