2#if !(MIN_VERSION_base(4,8,0))
3{-# LANGUAGE OverlappingInstances #-}
6module Pkg.PParser where
8import Text.Trifecta hiding (span, charLiteral, natural, symbol, char, string, whiteSpace)
12import Idris.AbsSyntaxTree
13import Idris.ParseHelpers hiding (stringLiteral)
14import Idris.CmdOptions
16import Control.Monad.State.Strict
17import Control.Applicative
22type PParser = StateT PkgDesc IdrisInnerParser
24data PkgDesc = PkgDesc { pkgname :: String,
27 makefile :: Maybe String,
32 execout :: Maybe String,
37instance HasLastTokenSpan PParser where
38 getLastTokenSpan = return Nothing
40#if MIN_VERSION_base(4,8,0)
41instance {-# OVERLAPPING #-} TokenParsing PParser where
43instance TokenParsing PParser where
45 someSpace = many (simpleWhiteSpace <|> singleLineComment <|> multiLineComment) *> pure ()
48defaultPkg = PkgDesc "" [] [] Nothing [] "" [] (sUN "") Nothing []
50parseDesc :: FilePath -> IO PkgDesc
51parseDesc fp = do p <- readFile fp
52 case runparser pPkg defaultPkg fp p of
53 Failure err -> fail (show err)
56pPkg :: PParser PkgDesc
57pPkg = do reserved "package"; p <- fst <$> identifier
59 put (st { pkgname = p })
66pClause = do reserved "executable"; lchar '=';
67 exec <- fst <$> iName []
69 put (st { execout = Just (if isWindows
70 then ((show exec) ++ ".exe")
73 <|> do reserved "main"; lchar '=';
74 main <- fst <$> iName []
76 put (st { idris_main = main })
77 <|> do reserved "sourcedir"; lchar '=';
78 src <- fst <$> identifier
80 put (st { sourcedir = src })
81 <|> do reserved "opts"; lchar '=';
84 let args = pureArgParser (words opts)
85 put (st { idris_opts = args })
86 <|> do reserved "modules"; lchar '=';
87 ms <- sepBy1 (fst <$> iName []) (lchar ',')
89 put (st { modules = modules st ++ ms })
90 <|> do reserved "libs"; lchar '=';
91 ls <- sepBy1 (fst <$> identifier) (lchar ',')
93 put (st { libdeps = libdeps st ++ ls })
94 <|> do reserved "objs"; lchar '=';
95 ls <- sepBy1 (fst <$> identifier) (lchar ',')
97 put (st { objs = libdeps st ++ ls })
98 <|> do reserved "makefile"; lchar '=';
99 mk <- fst <$> iName []
101 put (st { makefile = Just (show mk) })
102 <|> do reserved "tests"; lchar '=';
103 ts <- sepBy1 (fst <$> iName []) (lchar ',')
105 put st { idris_tests = idris_tests st ++ ts }
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list