@@ -41,22 +41,25 @@ constrain :: RTV -> Can.Expr -> Expected Type -> IO Constraint
41constrain rtv (A.At region expression) expected =
41constrain rtv (A.At region expression) expected =
42 case expression of
42 case expression of
43 Can.VarLocal name ->
43 Can.VarLocal name ->
44− return (CLookup region name expected)
44+ return (CLocal region name expected)
46 Can.VarTopLevel _ name ->
46 Can.VarTopLevel _ name ->
47− return (CLookup region name expected)
47+ return (CLocal region name expected)
49 Can.VarKernel _ _ ->
49 Can.VarKernel _ _ ->
50 return CTrue
50 return CTrue
52 Can.VarForeign _ name annotation ->
52 Can.VarForeign _ name annotation ->
53− return $ CInstance region (FuncName name) annotation expected
53+ return $ CForeign region name annotation expected
55+ Can.VarCtor _ _ name _ annotation ->
56+ return $ CForeign region name annotation expected
55 Can.VarDebug _ name annotation ->
58 Can.VarDebug _ name annotation ->
56− return $ CInstance region (FuncName name) annotation expected
59+ return $ CForeign region name annotation expected
58 Can.VarOperator op _ _ annotation ->
61 Can.VarOperator op _ _ annotation ->
59− return $ CInstance region (OpName op) annotation expected
62+ return $ CForeign region op annotation expected
61 Can.Str _ ->
64 Can.Str _ ->
62 return $ CEqual region String Type.string expected
65 return $ CEqual region String Type.string expected
@@ -180,7 +183,7 @@ constrainLambda rtv region args body expected =
181constrainCall :: RTV -> R.Region -> Can.Expr -> [Can.Expr] -> Expected Type -> IO Constraint
184constrainCall :: RTV -> R.Region -> Can.Expr -> [Can.Expr] -> Expected Type -> IO Constraint
182constrainCall rtv region func args expected =
185constrainCall rtv region func args expected =
183− do let maybeFuncName = getFuncName func
186+ do let maybeName = getName func
185 funcVar <- mkFlexVar
188 funcVar <- mkFlexVar
186 resultVar <- mkFlexVar
189 resultVar <- mkFlexVar
@@ -190,10 +193,10 @@ constrainCall rtv region func args expected =
190 funcCon <- constrain rtv func (NoExpectation funcType)
193 funcCon <- constrain rtv func (NoExpectation funcType)
192 (argVars, argTypes, argCons) <-
195 (argVars, argTypes, argCons) <-
193− unzip3 <$> Index.indexedTraverse (constrainArg rtv region maybeFuncName) args
196+ unzip3 <$> Index.indexedTraverse (constrainArg rtv region maybeName) args
195 let arityType = foldr FunN resultType argTypes
198 let arityType = foldr FunN resultType argTypes
196− let resultCon = CEqual region (CallResult maybeFuncName) resultType expected
199+ let resultCon = CEqual region (CallResult maybeName) resultType expected
198 return $ exists (funcVar:resultVar:argVars) $
201 return $ exists (funcVar:resultVar:argVars) $
@@ -202,53 +205,56 @@ constrainCall rtv region func args expected =
202 { _a = funcType
205 { _a = funcType
203 , _b = arityType
206 , _b = arityType
204 , _eq = CAnd [ CAnd argCons, resultCon ]
207 , _eq = CAnd [ CAnd argCons, resultCon ]
205− , _neq = constrainCallBackup rtv region maybeFuncName func args
208+ , _neq = constrainCallBackup rtv region maybeName func args
210−constrainArg :: RTV -> R.Region -> Maybe FuncName -> Index.ZeroBased -> Can.Expr -> IO (Variable, Type, Constraint)
213+constrainArg :: RTV -> R.Region -> MaybeName -> Index.ZeroBased -> Can.Expr -> IO (Variable, Type, Constraint)
211−constrainArg rtv region maybeFuncName index arg =
214+constrainArg rtv region maybeName index arg =
212 do argVar <- mkFlexVar
215 do argVar <- mkFlexVar
213 let argType = VarN argVar
216 let argType = VarN argVar
214− argCon <- constrain rtv arg (FromContext region (CallArg maybeFuncName index) argType)
217+ argCon <- constrain rtv arg (FromContext region (CallArg maybeName index) argType)
215 return (argVar, argType, argCon)
218 return (argVar, argType, argCon)
218−constrainCallBackup :: RTV -> R.Region -> Maybe FuncName -> Can.Expr -> [Can.Expr] -> IO Constraint
221+constrainCallBackup :: RTV -> R.Region -> MaybeName -> Can.Expr -> [Can.Expr] -> IO Constraint
219−constrainCallBackup rtv region maybeFuncName func args =
222+constrainCallBackup rtv region maybeName func args =
220 do (argVars, argTypes, argCons) <-
223 do (argVars, argTypes, argCons) <-
221− unzip3 <$> Index.indexedTraverse (constrainArg rtv region maybeFuncName) args
224+ unzip3 <$> Index.indexedTraverse (constrainArg rtv region maybeName) args
223 resultVar <- mkFlexVar
226 resultVar <- mkFlexVar
224 let resultType = VarN resultVar
227 let resultType = VarN resultVar
225 let arityType = foldr FunN resultType argTypes
228 let arityType = foldr FunN resultType argTypes
227− funcCon <- constrain rtv func (FromContext region (TooManyArgs maybeFuncName (length args)) arityType)
230+ funcCon <- constrain rtv func (FromContext region (TooManyArgs maybeName (length args)) arityType)
229 return $ exists (resultVar:argVars) $ CAnd [ CAnd argCons, funcCon ]
232 return $ exists (resultVar:argVars) $ CAnd [ CAnd argCons, funcCon ]
232−getFuncName :: Can.Expr -> Maybe FuncName
235+getName :: Can.Expr -> MaybeName
233−getFuncName (A.At _ expr) =
236+getName (A.At _ expr) =
234 case expr of
237 case expr of
235 Can.VarLocal name ->
238 Can.VarLocal name ->
236− Just (FuncName name)
239+ FuncName name
238 Can.VarTopLevel _ name ->
241 Can.VarTopLevel _ name ->
239− Just (FuncName name)
242+ FuncName name
241− Can.VarKernel _ name ->
242− Just (FuncName name)
244 Can.VarForeign _ name _ ->
244 Can.VarForeign _ name _ ->
245− Just (FuncName name)
245+ FuncName name
247+ Can.VarCtor _ _ name _ _ ->
247 Can.VarOperator op _ _ _ ->
250 Can.VarOperator op _ _ _ ->
248− Just (OpName op)
251+ OpName op
253+ Can.VarKernel _ name ->
@@ -265,7 +271,7 @@ constrainBinop rtv region op annotation leftExpr rightExpr expected =
265 let answerType = VarN answerVar
271 let answerType = VarN answerVar
266 let binopType = leftType ==> rightType ==> answerType
272 let binopType = leftType ==> rightType ==> answerType
268− let opCon = CInstance region (OpName op) annotation (NoExpectation binopType)
274+ let opCon = CForeign region op annotation (NoExpectation binopType)
270 leftCon <- constrain rtv leftExpr (FromContext region (OpLeft op) leftType)
276 leftCon <- constrain rtv leftExpr (FromContext region (OpLeft op) leftType)
271 rightCon <- constrain rtv rightExpr (FromContext region (OpRight op) rightType)
277 rightCon <- constrain rtv rightExpr (FromContext region (OpRight op) rightType)
@@ -275,7 +281,7 @@ constrainBinop rtv region op annotation leftExpr rightExpr expected =
276 , leftCon
282 , leftCon
277 , rightCon
283 , rightCon
278− , CEqual region (CallResult (Just (OpName op))) answerType expected
284+ , CEqual region (CallResult (OpName op)) answerType expected