@@ -26,7 +26,6 @@ import qualified Canonicalize.Environment as Env
26import qualified Canonicalize.Environment.Dups as Dups
26import qualified Canonicalize.Environment.Dups as Dups
27import qualified Canonicalize.Pattern as Pattern
27import qualified Canonicalize.Pattern as Pattern
28import qualified Canonicalize.Type as Type
28import qualified Canonicalize.Type as Type
29−import qualified Data.Bag as Bag
30import qualified Data.Index as Index
29import qualified Data.Index as Index
31import qualified Data.OneOrMore as OneOrMore
30import qualified Data.OneOrMore as OneOrMore
32import qualified Elm.Name as N
31import qualified Elm.Name as N
@@ -76,8 +75,15 @@ canonicalize env (A.At region expression) =
76 Valid.Float float ->
75 Valid.Float float ->
77 Result.ok (Can.Float float)
76 Result.ok (Can.Float float)
79− Valid.Var maybePrefix name ->
78+ Valid.Var varType name ->
80− findVar region env maybePrefix name
80+ Src.Value -> findVar region env name
81+ Src.Ctor -> toVarCtor name <$> Env.findCtor region env name
83+ Valid.VarQual varType prefix name ->
85+ Src.Value -> findVarQual region env prefix name
86+ Src.Ctor -> toVarCtor name <$> Env.findCtorQual region env prefix name
82 Valid.List exprs ->
88 Valid.List exprs ->
83 Can.List <$> traverse (canonicalize env) exprs
89 Can.List <$> traverse (canonicalize env) exprs
@@ -134,7 +140,7 @@ canonicalize env (A.At region expression) =
135 Valid.Update (A.At reg name) fields ->
141 Valid.Update (A.At reg name) fields ->
136 do fieldDict <- Dups.checkFields fields
142 do fieldDict <- Dups.checkFields fields
137− name_ <- findVar reg env Nothing name
143+ name_ <- findVar reg env name
138 Can.Update (A.At reg name_)
144 Can.Update (A.At reg name_)
139 <$> traverse (canonicalize env) fieldDict
145 <$> traverse (canonicalize env) fieldDict
@@ -339,7 +345,10 @@ addBindingsHelp bindings (A.At region pattern) =
339 Src.PTuple a b cs ->
345 Src.PTuple a b cs ->
340 List.foldl' addBindingsHelp bindings (a:b:cs)
346 List.foldl' addBindingsHelp bindings (a:b:cs)
342− Src.PCtor _ _ _ patterns ->
348+ Src.PCtor _ _ patterns ->
349+ List.foldl' addBindingsHelp bindings patterns
351+ Src.PCtorQual _ _ _ patterns ->
343 List.foldl' addBindingsHelp bindings patterns
352 List.foldl' addBindingsHelp bindings patterns
345 Src.PList patterns ->
354 Src.PList patterns ->
@@ -458,18 +467,19 @@ addEdge edges nodes aname@(A.At _ name) =
458getPatternNames :: [A.Located N.Name] -> Src.Pattern -> [A.Located N.Name]
467getPatternNames :: [A.Located N.Name] -> Src.Pattern -> [A.Located N.Name]
459getPatternNames names (A.At region pattern) =
468getPatternNames names (A.At region pattern) =
460 case pattern of
469 case pattern of
461− Src.PAnything -> names
470+ Src.PAnything -> names
462− Src.PVar name -> A.At region name : names
471+ Src.PVar name -> A.At region name : names
463− Src.PRecord fields -> fields ++ names
472+ Src.PRecord fields -> fields ++ names
464− Src.PAlias ptrn name -> getPatternNames (name : names) ptrn
473+ Src.PAlias ptrn name -> getPatternNames (name : names) ptrn
465− Src.PUnit -> names
474+ Src.PUnit -> names
466− Src.PTuple a b cs -> List.foldl' getPatternNames (getPatternNames (getPatternNames names a) b) cs
475+ Src.PTuple a b cs -> List.foldl' getPatternNames (getPatternNames (getPatternNames names a) b) cs
476+ Src.PCtor _ _ args -> List.foldl' getPatternNames names args
467− Src.PCtor _ _ _ args -> List.foldl' getPatternNames names args
477+ Src.PCtorQual _ _ _ args -> List.foldl' getPatternNames names args
468− Src.PList patterns -> List.foldl' getPatternNames names patterns
478+ Src.PList patterns -> List.foldl' getPatternNames names patterns
469− Src.PCons hd tl -> getPatternNames (getPatternNames names hd) tl
479+ Src.PCons hd tl -> getPatternNames (getPatternNames names hd) tl
470− Src.PChr _ -> names
480+ Src.PChr _ -> names
471− Src.PStr _ -> names
481+ Src.PStr _ -> names
472− Src.PInt _ -> names
482+ Src.PInt _ -> names
@@ -674,56 +684,74 @@ delayedUsage (Result.Result k) =
674-- FIND VARIABLE
684-- FIND VARIABLE
677−findVar :: R.Region -> Env.Env -> Maybe N.Name -> N.Name -> Result FreeLocals w Can.Expr_
687+findVar :: R.Region -> Env.Env -> N.Name -> Result FreeLocals w Can.Expr_
678−findVar region (Env.Env localHome vars _ _ _) maybePrefix name =
688+findVar region (Env.Env localHome vars _ _ _ _ _ _) name =
679 case Map.lookup name vars of
689 case Map.lookup name vars of
680− Nothing ->
690+ Just var ->
681− case maybePrefix of
691+ case var of
682− Nothing ->
692+ Env.Local _ ->
683− Result.throw (error "TODO no name" region)
693+ logVar name (Can.VarLocal name)
685− Just prefix ->
695+ Env.TopLevel _ ->
686− if ModuleName.isKernel prefix then
696+ logVar name (Can.VarTopLevel localHome name)
687− Result.ok $ Can.VarKernel (ModuleName.getKernel prefix) name
689− Result.throw (error "TODO no name" region)
691− Just (Env.VarHomes unqualified qualified) ->
696− logVar name (Can.VarLocal name)
699− logVar name (Can.VarTopLevel localHome name)
701− Env.Foreign bag ->
698+ Env.Foreign bag ->
702− case bag of
699+ case bag of
703− Bag.One (Env.ForeignVarHome home annotation) ->
705− if home == ModuleName.debug then
706− Can.VarDebug localHome name annotation
708− Can.VarForeign home name annotation
711− Result.throw (error "TODO no unqualified" region)
714− Result.throw (error "TODO ambiguous unqualified" region)
717− case Map.lookup prefix qualified of
719− Result.throw (error "TODO no qualified" region)
721− Just (OneOrMore.One (Env.ForeignVarHome home annotation)) ->
700+ OneOrMore.One (Env.ForeignVar home annotation) ->
722 Result.ok $
701 Result.ok $
723 if home == ModuleName.debug then
702 if home == ModuleName.debug then
724 Can.VarDebug localHome name annotation
703 Can.VarDebug localHome name annotation
726 Can.VarForeign home name annotation
705 Can.VarForeign home name annotation
728− Just _ ->
707+ OneOrMore.More _ _ ->
729− Result.throw (error "TODO ambiguous qualified" region)
708+ Result.throw (error "TODO ambiguous unqualified" region)
711+ Result.throw (error "TODO no name" region)
714+findVarQual :: R.Region -> Env.Env -> N.Name -> N.Name -> Result FreeLocals w Can.Expr_
715+findVarQual region (Env.Env localHome _ _ _ _ vars _ _) prefix name =
716+ case Map.lookup prefix vars of
718+ case Map.lookup name qualified of
719+ Just (OneOrMore.One (Env.ForeignVar home annotation)) ->
721+ if home == ModuleName.debug then
722+ Can.VarDebug localHome name annotation
724+ Can.VarForeign home name annotation
727+ Result.throw (error "TODO ambiguous qualified" region)
730+ Result.throw (error "TODO no qualified" region)
733+ if ModuleName.isKernel prefix then
734+ Result.ok $ Can.VarKernel (ModuleName.getKernel prefix) name
736+ Result.throw (error "TODO no name" region)
742+toVarCtor :: N.Name -> Env.Ctor -> Can.Expr_
743+toVarCtor name ctor =
745+ Env.Ctor home typeName (Can.Union vars _ _ opts) index args ->
747+ freeVars = Map.fromList (map (\v -> (v, ())) vars)
748+ result = Can.TType home typeName (map Can.TVar vars)
749+ tipe = foldr Can.TLambda result args
751+ Can.VarCtor opts home name index (Can.Forall freeVars tipe)
753+ Env.RecordCtor home vars tipe ->
755+ freeVars = Map.fromList (map (\v -> (v, ())) vars)
757+ Can.VarCtor Can.Normal home name Index.first (Can.Forall freeVars tipe)