@@ -41,22 +41,25 @@ constrain :: RTV -> Can.Expr -> Expected Type -> IO Constraint
4141constrain rtv (A.At region expression) expected =
4242 case expression of
4343 Can.VarLocal name ->
44− return (CLookup region name expected)
44+ return (CLocal region name expected)
4545
4646 Can.VarTopLevel _ name ->
47− return (CLookup region name expected)
47+ return (CLocal region name expected)
4848
4949 Can.VarKernel _ _ ->
5050 return CTrue
5151
5252 Can.VarForeign _ name annotation ->
53− return $ CInstance region (FuncName name) annotation expected
53+ return $ CForeign region name annotation expected
54+
55+ Can.VarCtor _ _ name _ annotation ->
56+ return $ CForeign region name annotation expected
5457
5558 Can.VarDebug _ name annotation ->
56− return $ CInstance region (FuncName name) annotation expected
59+ return $ CForeign region name annotation expected
5760
5861 Can.VarOperator op _ _ annotation ->
59− return $ CInstance region (OpName op) annotation expected
62+ return $ CForeign region op annotation expected
6063
6164 Can.Str _ ->
6265 return $ CEqual region String Type.string expected
@@ -180,7 +183,7 @@ constrainLambda rtv region args body expected =
180183
181184constrainCall :: RTV -> R.Region -> Can.Expr -> [Can.Expr] -> Expected Type -> IO Constraint
182185constrainCall rtv region func args expected =
183− do let maybeFuncName = getFuncName func
186+ do let maybeName = getName func
184187
185188 funcVar <- mkFlexVar
186189 resultVar <- mkFlexVar
@@ -190,10 +193,10 @@ constrainCall rtv region func args expected =
190193 funcCon <- constrain rtv func (NoExpectation funcType)
191194
192195 (argVars, argTypes, argCons) <-
193− unzip3 <$> Index.indexedTraverse (constrainArg rtv region maybeFuncName) args
196+ unzip3 <$> Index.indexedTraverse (constrainArg rtv region maybeName) args
194197
195198 let arityType = foldr FunN resultType argTypes
196− let resultCon = CEqual region (CallResult maybeFuncName) resultType expected
199+ let resultCon = CEqual region (CallResult maybeName) resultType expected
197200
198201 return $ exists (funcVar:resultVar:argVars) $
199202 CAnd
@@ -202,53 +205,56 @@ constrainCall rtv region func args expected =
202205 { _a = funcType
203206 , _b = arityType
204207 , _eq = CAnd [ CAnd argCons, resultCon ]
205− , _neq = constrainCallBackup rtv region maybeFuncName func args
208+ , _neq = constrainCallBackup rtv region maybeName func args
206209 }
207210 ]
208211
209212
210−constrainArg :: RTV -> R.Region -> Maybe FuncName -> Index.ZeroBased -> Can.Expr -> IO (Variable, Type, Constraint)
211−constrainArg rtv region maybeFuncName index arg =
213+constrainArg :: RTV -> R.Region -> MaybeName -> Index.ZeroBased -> Can.Expr -> IO (Variable, Type, Constraint)
214+constrainArg rtv region maybeName index arg =
212215 do argVar <- mkFlexVar
213216 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)
215218 return (argVar, argType, argCon)
216219
217220
218−constrainCallBackup :: RTV -> R.Region -> Maybe FuncName -> Can.Expr -> [Can.Expr] -> IO Constraint
219−constrainCallBackup rtv region maybeFuncName func args =
221+constrainCallBackup :: RTV -> R.Region -> MaybeName -> Can.Expr -> [Can.Expr] -> IO Constraint
222+constrainCallBackup rtv region maybeName func args =
220223 do (argVars, argTypes, argCons) <-
221− unzip3 <$> Index.indexedTraverse (constrainArg rtv region maybeFuncName) args
224+ unzip3 <$> Index.indexedTraverse (constrainArg rtv region maybeName) args
222225
223226 resultVar <- mkFlexVar
224227 let resultType = VarN resultVar
225228 let arityType = foldr FunN resultType argTypes
226229
227− funcCon <- constrain rtv func (FromContext region (TooManyArgs maybeFuncName (length args)) arityType)
230+ funcCon <- constrain rtv func (FromContext region (TooManyArgs maybeName (length args)) arityType)
228231
229232 return $ exists (resultVar:argVars) $ CAnd [ CAnd argCons, funcCon ]
230233
231234
232−getFuncName :: Can.Expr -> Maybe FuncName
233−getFuncName (A.At _ expr) =
235+getName :: Can.Expr -> MaybeName
236+getName (A.At _ expr) =
234237 case expr of
235238 Can.VarLocal name ->
236− Just (FuncName name)
239+ FuncName name
237240
238241 Can.VarTopLevel _ name ->
239− Just (FuncName name)
240−
241− Can.VarKernel _ name ->
242− Just (FuncName name)
242+ FuncName name
243243
244244 Can.VarForeign _ name _ ->
245− Just (FuncName name)
245+ FuncName name
246+
247+ Can.VarCtor _ _ name _ _ ->
248+ CtorName name
246249
247250 Can.VarOperator op _ _ _ ->
248− Just (OpName op)
251+ OpName op
252+
253+ Can.VarKernel _ name ->
254+ FuncName name
249255
250256 _ ->
251− Nothing
257+ NoName
252258
253259
254260
@@ -265,7 +271,7 @@ constrainBinop rtv region op annotation leftExpr rightExpr expected =
265271 let answerType = VarN answerVar
266272 let binopType = leftType ==> rightType ==> answerType
267273
268− let opCon = CInstance region (OpName op) annotation (NoExpectation binopType)
274+ let opCon = CForeign region op annotation (NoExpectation binopType)
269275
270276 leftCon <- constrain rtv leftExpr (FromContext region (OpLeft op) leftType)
271277 rightCon <- constrain rtv rightExpr (FromContext region (OpRight op) rightType)
@@ -275,7 +281,7 @@ constrainBinop rtv region op annotation leftExpr rightExpr expected =
275281 [ opCon
276282 , leftCon
277283 , rightCon
278− , CEqual region (CallResult (Just (OpName op))) answerType expected
284+ , CEqual region (CallResult (OpName op)) answerType expected
279285 ]
280286
281287