on master help sign in
Merge pull request #2192 from melted/directive

Make a datatype for directives

commitfe6b07216a687703beeb97d49a340c134f2626e2 authorNiklas Larsson <metaniklas@gmail.com> dateSun 26 Apr 2015, 18:07 (11 years ago) parent8935fed445f6a5
5 files changed+100−44
idris.cabal+1 src/Idris/AbsSyntaxTree.hs+17−1 src/Idris/Directives.hs+65 src/Idris/ElabDecls.hs+2−1 src/Idris/Parser.hs+15−42
idris.cabal+1
@@ -771,6 +771,7 @@ Library
771771 , Idris.DataOpts
772772 , Idris.DeepSeq
773773 , Idris.Delaborate
774+ , Idris.Directives
774775 , Idris.Docs
775776 , Idris.Docstrings
776777 , Idris.ElabDecls
src/Idris/AbsSyntaxTree.hs+17−1
@@ -628,7 +628,7 @@ data PDecl' t
628628 | PDSL Name (DSL' t) -- ^ DSL declaration
629629 | PSyntax FC Syntax -- ^ Syntax definition
630630 | PMutual FC [PDecl' t] -- ^ Mutual block
631− | PDirective (Idris ()) -- ^ Compiler directive. The parser inserts the corresponding action in the Idris monad.
631+ | PDirective Directive -- ^ Compiler directive.
632632 | PProvider (Docstring (Either Err PTerm)) SyntaxInfo FC (ProvideWhat' t) Name -- ^ Type provider. The first t is the type, the second is the term
633633 | PTransform FC Bool t t -- ^ Source-to-source transformation rule. If
634634 -- bool is True, lhs and rhs must be convertible
@@ -638,6 +638,22 @@ deriving instance Binary PDecl'
638638deriving instance NFData PDecl'
639639!-}
640640
641+-- | The set of source directives
642+data Directive = DLib Codegen String |
643+ DLink Codegen String |
644+ DFlag Codegen String |
645+ DInclude Codegen String |
646+ DHide Name |
647+ DFreeze Name |
648+ DAccess Accessibility |
649+ DDefault Bool |
650+ DLogging Integer |
651+ DDynamicLibs [String] |
652+ DNameHint Name [Name] |
653+ DErrorHandlers Name Name [Name] |
654+ DLanguage LanguageExt |
655+ DUsed FC Name Name
656+
641657-- | A set of instructions for things that need to happen in IState
642658-- after a term elaboration when there's been reflected elaboration.
643659data RDeclInstructions = RTyDeclInstrs Name FC [PArg] Type
src/Idris/Directives.hsnew file+65
@@ -0,0 +1,65 @@
1+
2+module Idris.Directives where
3+
4+import Idris.AbsSyntax
5+import Idris.ASTUtils
6+import Idris.Imports
7+
8+import Idris.Core.Evaluate
9+import Idris.Core.TT
10+
11+import Util.DynamicLinker
12+
13+-- | Run the action corresponding to a directive
14+directiveAction :: Directive -> Idris ()
15+directiveAction (DLib cgn lib) = do addLib cgn lib
16+ addIBC (IBCLib cgn lib)
17+
18+directiveAction (DLink cgn obj) = do dirs <- allImportDirs
19+ o <- runIO $ findInPath dirs obj
20+ addIBC (IBCObj cgn obj) -- just name, search on loading ibc
21+ addObjectFile cgn o
22+
23+directiveAction (DFlag cgn flag) = do addIBC (IBCCGFlag cgn flag)
24+ addFlag cgn flag
25+
26+directiveAction (DInclude cgn hdr) = do addHdr cgn hdr
27+ addIBC (IBCHeader cgn hdr)
28+
29+directiveAction (DHide n) = do setAccessibility n Hidden
30+ addIBC (IBCAccess n Hidden)
31+
32+directiveAction (DFreeze n) = do setAccessibility n Frozen
33+ addIBC (IBCAccess n Frozen)
34+
35+directiveAction (DAccess acc) = do updateIState (\i -> i { default_access = acc })
36+
37+directiveAction (DDefault tot) = do updateIState (\i -> i { default_total = tot })
38+
39+directiveAction (DLogging lvl) = setLogLevel (fromInteger lvl)
40+
41+directiveAction (DDynamicLibs libs) = do added <- addDyLib libs
42+ case added of
43+ Left lib -> addIBC (IBCDyLib (lib_name lib))
44+ Right msg -> fail $ msg
45+
46+directiveAction (DNameHint ty ns) = do ty' <- disambiguate ty
47+ mapM_ (addNameHint ty') ns
48+ mapM_ (\n -> addIBC (IBCNameHint (ty', n))) ns
49+
50+directiveAction (DErrorHandlers fn arg ns) = do fn' <- disambiguate fn
51+ ns' <- mapM disambiguate ns
52+ addFunctionErrorHandlers fn' arg ns'
53+ mapM_ (addIBC .
54+ IBCFunctionErrorHandler fn' arg) ns'
55+
56+directiveAction (DLanguage ext) = addLangExt ext
57+
58+directiveAction (DUsed fc fn arg) = addUsedName fc fn arg
59+
60+disambiguate :: Name -> Idris Name
61+disambiguate n = do i <- getIState
62+ case lookupCtxtName n (idris_implicits i) of
63+ [(n', _)] -> return n'
64+ [] -> throwError (NoSuchVariable n)
65+ more -> throwError (CantResolveAlts (map fst more))
src/Idris/ElabDecls.hs+2−1
@@ -8,6 +8,7 @@ import Idris.ASTUtils
88import Idris.DSL
99import Idris.Error
1010import Idris.Delaborate
11+import Idris.Directives
1112import Idris.Imports
1213import Idris.Elab.Term
1314import Idris.Coverage
@@ -250,7 +251,7 @@ elabDecl' _ info (PDSL n dsl)
250251 putIState (i { idris_dsls = addDef n dsl (idris_dsls i) })
251252 addIBC (IBCDSL n)
252253elabDecl' what info (PDirective i)
253− | what /= EDefns = i
254+ | what /= EDefns = directiveAction i
254255elabDecl' what info (PProvider doc syn fc provWhat n)
255256 | what /= EDefns
256257 = do iLOG $ "Elaborating type provider " ++ show n
src/Idris/Parser.hs+15−42
@@ -1077,71 +1077,44 @@ Directive' ::= 'lib' CodeGen String_t
10771077-}
10781078directive :: SyntaxInfo -> IdrisParser [PDecl]
10791079directive syn = do try (lchar '%' *> reserved "lib"); cgn <- codegen_; lib <- stringLiteral;
1080− return [PDirective (do addLib cgn lib
1081− addIBC (IBCLib cgn lib))]
1080+ return [PDirective (DLib cgn lib)]
10821081 <|> do try (lchar '%' *> reserved "link"); cgn <- codegen_; obj <- stringLiteral;
1083− return [PDirective (do dirs <- allImportDirs
1084− o <- liftIO $ findInPath dirs obj
1085− addIBC (IBCObj cgn obj) -- just name, search on loading ibc
1086− addObjectFile cgn o)]
1087− <|> do try (lchar '%' *> reserved "flag"); cgn <- codegen_;
1088− flag <- stringLiteral
1089− return [PDirective (do addIBC (IBCCGFlag cgn flag)
1090− addFlag cgn flag)]
1082+ return [PDirective (DLink cgn obj)]
1083+ <|> do try (lchar '%' *> reserved "flag"); cgn <- codegen_; flag <- stringLiteral
1084+ return [PDirective (DFlag cgn flag)]
10911085 <|> do try (lchar '%' *> reserved "include"); cgn <- codegen_; hdr <- stringLiteral;
1092− return [PDirective (do addHdr cgn hdr
1093− addIBC (IBCHeader cgn hdr))]
1086+ return [PDirective (DInclude cgn hdr)]
10941087 <|> do try (lchar '%' *> reserved "hide"); n <- fnName
1095− return [PDirective (do setAccessibility n Hidden
1096− addIBC (IBCAccess n Hidden))]
1088+ return [PDirective (DHide n)]
10971089 <|> do try (lchar '%' *> reserved "freeze"); n <- iName []
1098− return [PDirective (do setAccessibility n Frozen
1099− addIBC (IBCAccess n Frozen))]
1090+ return [PDirective (DFreeze n)]
11001091 <|> do try (lchar '%' *> reserved "access"); acc <- accessibility
1101− return [PDirective (do i <- get
1102− put(i { default_access = acc }))]
1092+ return [PDirective (DAccess acc)]
11031093 <|> do try (lchar '%' *> reserved "default"); tot <- totality
11041094 i <- get
11051095 put (i { default_total = tot } )
1106− return [PDirective (do i <- get
1107− put(i { default_total = tot }))]
1096+ return [PDirective (DDefault tot)]
11081097 <|> do try (lchar '%' *> reserved "logging"); i <- natural;
1109− return [PDirective (setLogLevel (fromInteger i))]
1098+ return [PDirective (DLogging i)]
11101099 <|> do try (lchar '%' *> reserved "dynamic"); libs <- sepBy1 stringLiteral (lchar ',');
1111− return [PDirective (do added <- addDyLib libs
1112− case added of
1113− Left lib -> addIBC (IBCDyLib (lib_name lib))
1114− Right msg ->
1115− fail $ msg)]
1100+ return [PDirective (DDynamicLibs libs)]
11161101 <|> do try (lchar '%' *> reserved "name")
11171102 ty <- fnName
11181103 ns <- sepBy1 name (lchar ',')
1119− return [PDirective (do ty' <- disambiguate ty
1120− mapM_ (addNameHint ty') ns
1121− mapM_ (\n -> addIBC (IBCNameHint (ty', n))) ns)]
1104+ return [PDirective (DNameHint ty ns)]
11221105 <|> do try (lchar '%' *> reserved "error_handlers")
11231106 fn <- fnName
11241107 arg <- fnName
11251108 ns <- sepBy1 name (lchar ',')
1126− return [PDirective (do fn' <- disambiguate fn
1127− ns' <- mapM disambiguate ns
1128− addFunctionErrorHandlers fn' arg ns'
1129− mapM_ (addIBC . IBCFunctionErrorHandler fn' arg) ns')]
1109+ return [PDirective (DErrorHandlers fn arg ns) ]
11301110 <|> do try (lchar '%' *> reserved "language"); ext <- pLangExt;
1131− return [PDirective (addLangExt ext)]
1111+ return [PDirective (DLanguage ext)]
11321112 <|> do fc <- getFC
11331113 try (lchar '%' *> reserved "used")
11341114 fn <- fnName
11351115 arg <- iName []
1136− return [PDirective (addUsedName fc fn arg)]
1137−
1116+ return [PDirective (DUsed fc fn arg)]
11381117 <?> "directive"
1139− where disambiguate :: Name -> Idris Name
1140− disambiguate n = do i <- getIState
1141− case lookupCtxtName n (idris_implicits i) of
1142− [(n', _)] -> return n'
1143− [] -> throwError (NoSuchVariable n)
1144− more -> throwError (CantResolveAlts (map fst more))
11451118
11461119pLangExt :: IdrisParser LanguageExt
11471120pLangExt = (reserved "TypeProviders" >> return TypeProviders)