42
42
import Agda.Syntax.Scope.Monad
43
43
import Agda.Syntax.Strict
45
import Agda.TypeChecking.Monad.Base (TypeError(..), Call(..), typeError, TCErr(..))
45
import Agda.TypeChecking.Monad.Base (TypeError(..), Call(..), typeError,
46
TCErr(..), TCErr'(..))
46
47
import Agda.TypeChecking.Monad.Trace (traceCall, traceCallCPS, setCurrentRange)
47
48
import Agda.TypeChecking.Monad.State
48
49
import Agda.TypeChecking.Monad.Options
825
829
NoWhere -> (Nothing, [])
826
830
AnyWhere ds -> (Nothing, ds)
827
831
SomeWhere m ds -> (Just m, ds)
830
rhs <- toAbstract =<< toAbstractCtx TopCtx (RightHandSide with wcs' rhs)
834
rhs <- toAbstract =<< toAbstractCtx TopCtx (RightHandSide eqs with wcs' rhs whds)
831
835
return $ A.Clause lhs' rhs []
833
m <- maybe (nameConcrete <$> freshNoName noRange) return whname
834
let acc = maybe PrivateAccess (const PublicAccess) whname -- unnamed where's are private
836
old <- getCurrentModule
837
am <- toAbstract (NewModuleName m)
838
(scope, ds) <- scopeCheckModule (getRange wh) (C.QName m) am tel whds
840
837
-- the right hand side is checked inside the module of the local definitions
841
rhs <- toAbstractCtx TopCtx (RightHandSide with wcs' rhs)
838
(rhs, ds) <- whereToAbstract (getRange wh) whname whds $
839
toAbstractCtx TopCtx (RightHandSide eqs with wcs' rhs [])
844
840
rhs <- toAbstract rhs
845
841
return $ A.Clause lhs' rhs ds
847
data RightHandSide = RightHandSide [C.Expr] [C.Clause] C.RHS
843
whereToAbstract :: Range -> Maybe C.Name -> [C.Declaration] -> ScopeM a -> ScopeM (a, [A.Declaration])
844
whereToAbstract _ _ [] inner = do
847
whereToAbstract r whname whds inner = do
848
m <- maybe (nameConcrete <$> freshNoName noRange) return whname
849
let acc = maybe PrivateAccess (const PublicAccess) whname -- unnamed where's are private
851
old <- getCurrentModule
852
am <- toAbstract (NewModuleName m)
853
(scope, ds) <- scopeCheckModule r (C.QName m) am tel whds
860
data RightHandSide = RightHandSide [C.Expr] [C.Expr] [C.Clause] C.RHS [C.Declaration]
848
861
data AbstractRHS = AbsurdRHS'
849
862
| WithRHS' [A.Expr] [C.Clause] -- ^ The with clauses haven't been translated yet
864
| RewriteRHS' [A.Expr] AbstractRHS [A.Declaration]
866
withFunctionName :: String -> ScopeM A.QName
867
withFunctionName s = do
868
m <- getCurrentModule
870
A.qualify m <$> freshName_ (s ++ show i)
852
872
instance ToAbstract AbstractRHS A.RHS where
853
toAbstract AbsurdRHS' = return A.AbsurdRHS
854
toAbstract (RHS' e) = return $ A.RHS e
873
toAbstract AbsurdRHS' = return A.AbsurdRHS
874
toAbstract (RHS' e) = return $ A.RHS e
875
toAbstract (RewriteRHS' eqs rhs wh) = do
876
auxs <- replicateM (length eqs) $ withFunctionName "rewrite-"
877
rhs <- toAbstract rhs
878
return $ RewriteRHS auxs eqs rhs wh
855
879
toAbstract (WithRHS' es cs) = do
856
m <- getCurrentModule
859
aux <- A.qualify m <$> freshName_ ("aux" ++ show i)
880
aux <- withFunctionName "with-"
860
881
A.WithRHS aux es <$> toAbstract cs
862
883
instance ToAbstract RightHandSide AbstractRHS where
863
toAbstract (RightHandSide [] (_ : _) _) = __IMPOSSIBLE__
864
toAbstract (RightHandSide (_ : _) _ (C.RHS _)) = typeError $ BothWithAndRHS
865
toAbstract (RightHandSide [] [] rhs) = toAbstract rhs
866
toAbstract (RightHandSide es cs C.AbsurdRHS) = do
884
toAbstract (RightHandSide eqs@(_:_) es cs rhs wh) = do
885
eqs <- toAbstractCtx TopCtx eqs
886
-- TODO: remember named where
887
(rhs, ds) <- whereToAbstract (getRange wh) Nothing wh $
888
toAbstract (RightHandSide [] es cs rhs [])
889
return $ RewriteRHS' eqs rhs ds
890
toAbstract (RightHandSide [] [] (_ : _) _ _) = __IMPOSSIBLE__
891
toAbstract (RightHandSide [] (_ : _) _ (C.RHS _) _) = typeError $ BothWithAndRHS
892
toAbstract (RightHandSide [] [] [] rhs []) = toAbstract rhs
893
toAbstract (RightHandSide [] es cs C.AbsurdRHS []) = do
867
894
es <- toAbstractCtx TopCtx es
868
895
return $ WithRHS' es cs
896
-- TODO: some of these might be possible
897
toAbstract (RightHandSide [] (_ : _) _ C.AbsurdRHS (_ : _)) = __IMPOSSIBLE__
898
toAbstract (RightHandSide [] [] [] (C.RHS _) (_ : _)) = __IMPOSSIBLE__
899
toAbstract (RightHandSide [] [] [] C.AbsurdRHS (_ : _)) = __IMPOSSIBLE__
870
901
instance ToAbstract C.RHS AbstractRHS where
871
902
toAbstract C.AbsurdRHS = return $ AbsurdRHS'