@@ -26,7 +26,6 @@ import qualified Canonicalize.Environment as Env
2626import qualified Canonicalize.Environment.Dups as Dups
2727import qualified Canonicalize.Pattern as Pattern
2828import qualified Canonicalize.Type as Type
29−import qualified Data.Bag as Bag
3029import qualified Data.Index as Index
3130import qualified Data.OneOrMore as OneOrMore
3231import qualified Elm.Name as N
@@ -76,8 +75,15 @@ canonicalize env (A.At region expression) =
7675 Valid.Float float ->
7776 Result.ok (Can.Float float)
7877
79− Valid.Var maybePrefix name ->
80− findVar region env maybePrefix name
78+ Valid.Var varType name ->
79+ case varType of
80+ Src.Value -> findVar region env name
81+ Src.Ctor -> toVarCtor name <$> Env.findCtor region env name
82+
83+ Valid.VarQual varType prefix name ->
84+ case varType of
85+ Src.Value -> findVarQual region env prefix name
86+ Src.Ctor -> toVarCtor name <$> Env.findCtorQual region env prefix name
8187
8288 Valid.List exprs ->
8389 Can.List <$> traverse (canonicalize env) exprs
@@ -134,7 +140,7 @@ canonicalize env (A.At region expression) =
134140
135141 Valid.Update (A.At reg name) fields ->
136142 do fieldDict <- Dups.checkFields fields
137− name_ <- findVar reg env Nothing name
143+ name_ <- findVar reg env name
138144 Can.Update (A.At reg name_)
139145 <$> traverse (canonicalize env) fieldDict
140146
@@ -339,7 +345,10 @@ addBindingsHelp bindings (A.At region pattern) =
339345 Src.PTuple a b cs ->
340346 List.foldl' addBindingsHelp bindings (a:b:cs)
341347
342− Src.PCtor _ _ _ patterns ->
348+ Src.PCtor _ _ patterns ->
349+ List.foldl' addBindingsHelp bindings patterns
350+
351+ Src.PCtorQual _ _ _ patterns ->
343352 List.foldl' addBindingsHelp bindings patterns
344353
345354 Src.PList patterns ->
@@ -458,18 +467,19 @@ addEdge edges nodes aname@(A.At _ name) =
458467getPatternNames :: [A.Located N.Name] -> Src.Pattern -> [A.Located N.Name]
459468getPatternNames names (A.At region pattern) =
460469 case pattern of
461− Src.PAnything -> names
462− Src.PVar name -> A.At region name : names
463− Src.PRecord fields -> fields ++ names
464− Src.PAlias ptrn name -> getPatternNames (name : names) ptrn
465− Src.PUnit -> names
466− Src.PTuple a b cs -> List.foldl' getPatternNames (getPatternNames (getPatternNames names a) b) cs
467− Src.PCtor _ _ _ args -> List.foldl' getPatternNames names args
468− Src.PList patterns -> List.foldl' getPatternNames names patterns
469− Src.PCons hd tl -> getPatternNames (getPatternNames names hd) tl
470− Src.PChr _ -> names
471− Src.PStr _ -> names
472− Src.PInt _ -> names
470+ Src.PAnything -> names
471+ Src.PVar name -> A.At region name : names
472+ Src.PRecord fields -> fields ++ names
473+ Src.PAlias ptrn name -> getPatternNames (name : names) ptrn
474+ Src.PUnit -> names
475+ Src.PTuple a b cs -> List.foldl' getPatternNames (getPatternNames (getPatternNames names a) b) cs
476+ Src.PCtor _ _ args -> List.foldl' getPatternNames names args
477+ Src.PCtorQual _ _ _ args -> List.foldl' getPatternNames names args
478+ Src.PList patterns -> List.foldl' getPatternNames names patterns
479+ Src.PCons hd tl -> getPatternNames (getPatternNames names hd) tl
480+ Src.PChr _ -> names
481+ Src.PStr _ -> names
482+ Src.PInt _ -> names
473483
474484
475485
@@ -674,56 +684,74 @@ delayedUsage (Result.Result k) =
674684-- FIND VARIABLE
675685
676686
677−findVar :: R.Region -> Env.Env -> Maybe N.Name -> N.Name -> Result FreeLocals w Can.Expr_
678−findVar region (Env.Env localHome vars _ _ _) maybePrefix name =
687+findVar :: R.Region -> Env.Env -> N.Name -> Result FreeLocals w Can.Expr_
688+findVar region (Env.Env localHome vars _ _ _ _ _ _) name =
679689 case Map.lookup name vars of
680− Nothing ->
681− case maybePrefix of
682− Nothing ->
683− Result.throw (error "TODO no name" region)
690+ Just var ->
691+ case var of
692+ Env.Local _ ->
693+ logVar name (Can.VarLocal name)
684694
685− Just prefix ->
686− if ModuleName.isKernel prefix then
687− Result.ok $ Can.VarKernel (ModuleName.getKernel prefix) name
688− else
689− Result.throw (error "TODO no name" region)
695+ Env.TopLevel _ ->
696+ logVar name (Can.VarTopLevel localHome name)
690697
691− Just (Env.VarHomes unqualified qualified) ->
692− case maybePrefix of
693− Nothing ->
694− case unqualified of
695− Env.Local _ ->
696− logVar name (Can.VarLocal name)
697−
698− Env.TopLevel _ ->
699− logVar name (Can.VarTopLevel localHome name)
700−
701− Env.Foreign bag ->
702− case bag of
703− Bag.One (Env.ForeignVarHome home annotation) ->
704− Result.ok $
705− if home == ModuleName.debug then
706− Can.VarDebug localHome name annotation
707− else
708− Can.VarForeign home name annotation
709−
710− Bag.Empty ->
711− Result.throw (error "TODO no unqualified" region)
712−
713− Bag.Two _ _ ->
714− Result.throw (error "TODO ambiguous unqualified" region)
715−
716− Just prefix ->
717− case Map.lookup prefix qualified of
718− Nothing ->
719− Result.throw (error "TODO no qualified" region)
720−
721− Just (OneOrMore.One (Env.ForeignVarHome home annotation)) ->
698+ Env.Foreign bag ->
699+ case bag of
700+ OneOrMore.One (Env.ForeignVar home annotation) ->
722701 Result.ok $
723702 if home == ModuleName.debug then
724703 Can.VarDebug localHome name annotation
725704 else
726705 Can.VarForeign home name annotation
727706
728− Just _ ->
729− Result.throw (error "TODO ambiguous qualified" region)
707+ OneOrMore.More _ _ ->
708+ Result.throw (error "TODO ambiguous unqualified" region)
709+
710+ Nothing ->
711+ Result.throw (error "TODO no name" region)
712+
713+
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
717+ Just qualified ->
718+ case Map.lookup name qualified of
719+ Just (OneOrMore.One (Env.ForeignVar home annotation)) ->
720+ Result.ok $
721+ if home == ModuleName.debug then
722+ Can.VarDebug localHome name annotation
723+ else
724+ Can.VarForeign home name annotation
725+
726+ Just _ ->
727+ Result.throw (error "TODO ambiguous qualified" region)
728+
729+ Nothing ->
730+ Result.throw (error "TODO no qualified" region)
731+
732+ Nothing ->
733+ if ModuleName.isKernel prefix then
734+ Result.ok $ Can.VarKernel (ModuleName.getKernel prefix) name
735+ else
736+ Result.throw (error "TODO no name" region)
737+
738+
739+-- FIND CTOR
740+
741+
742+toVarCtor :: N.Name -> Env.Ctor -> Can.Expr_
743+toVarCtor name ctor =
744+ case ctor of
745+ Env.Ctor home typeName (Can.Union vars _ _ opts) index args ->
746+ let
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
750+ in
751+ Can.VarCtor opts home name index (Can.Forall freeVars tipe)
752+
753+ Env.RecordCtor home vars tipe ->
754+ let
755+ freeVars = Map.fromList (map (\v -> (v, ())) vars)
756+ in
757+ Can.VarCtor Can.Normal home name Index.first (Can.Forall freeVars tipe)