| 535 | | {- |
| 536 | | inferExpCxt :: Exp -- ^ Expression to find the context of |
| 537 | | -> Eval Cxt |
| 538 | | inferExpCxt (Ann (Pos {}) exp) = inferExpCxt exp |
| 539 | | inferExpCxt (Ann (Cxt cxt) _) = return cxt |
| 540 | | inferExpCxt (Syn "," _) = return cxtSlurpyAny |
| 541 | | inferExpCxt (Syn "[]" [_, exp]) = inferExpCxt exp |
| 542 | | inferExpCxt (Syn "{}" [_, exp]) = inferExpCxt exp |
| 543 | | inferExpCxt (Syn (sigil:"{}") _) = return $ cxtOfSigil sigil |
| 544 | | inferExpCxt (Val (VList {})) = return cxtSlurpyAny |
| 545 | | inferExpCxt (Val (VRef ref)) = do |
| 546 | | cls <- asks envClasses |
| 547 | | let typ = refType ref |
| 548 | | return $ if isaType cls "List" typ |
| 549 | | then cxtSlurpyAny |
| 550 | | else CxtItem typ |
| 551 | | inferExpCxt (Val {}) = return cxtItemAny |
| 552 | | inferExpCxt (Var (sigil:_)) = return $ cxtOfSigil sigil |
| 553 | | inferExpCxt (App (Var "&list") _ _) = return cxtSlurpyAny |
| 554 | | inferExpCxt (App (Var "&item") _ _) = return cxtSlurpyAny |
| 555 | | inferExpCxt (App (Var name) invs args) = do |
| 556 | | -- inspect the return type of the function here |
| 557 | | env <- ask |
| 558 | | sub <- findSub name invs args |
| 559 | | return $ case sub of |
| 560 | | Right sub |
| 561 | | | isaType (envClasses env) "Scalar" (subReturns sub) |
| 562 | | -> CxtItem (subReturns sub) |
| 563 | | _ -> cxtSlurpyAny |
| 564 | | inferExpCxt _ = return cxtSlurpyAny |
| 565 | | -} |