@@ -15,6 +15,7 @@ module Main (main) where
15
15
import AST.GenerateSyntax
16
16
import Control.Lens (Traversal' , mapped , (%~) )
17
17
import Control.Monad
18
+ import Data.Foldable
18
19
import Data.Generics.Product.Typed (typed )
19
20
import Data.Maybe
20
21
import Data.Text (Text )
@@ -29,20 +30,21 @@ import qualified Options.Generic as Opt
29
30
import Source.Language
30
31
import System.Directory
31
32
import System.Exit
32
- import qualified TreeSitter.Language
33
33
import System.IO
34
34
import System.Process
35
35
import qualified TreeSitter.Go as Go (tree_sitter_go )
36
36
import qualified TreeSitter.JSON as JSON (tree_sitter_json )
37
37
import qualified TreeSitter.Java as Java (tree_sitter_java )
38
+ import qualified TreeSitter.Language
38
39
import qualified TreeSitter.PHP as PHP (tree_sitter_php )
39
40
import qualified TreeSitter.Python as Python (tree_sitter_python )
40
41
import qualified TreeSitter.QL as CodeQL (tree_sitter_ql )
41
42
import qualified TreeSitter.Ruby as Ruby (tree_sitter_ruby )
42
43
import qualified TreeSitter.TSX as TSX (tree_sitter_tsx )
43
44
import qualified TreeSitter.TypeScript as TypeScript (tree_sitter_typescript )
44
45
45
- data Config = Config { language :: Text , path :: FilePath }
46
+ -- As a special case, you can pass
47
+ data Config = Config { language :: Text , path :: FilePath , rootdir :: Maybe FilePath }
46
48
deriving stock (Show , Generic )
47
49
deriving anyclass (Opt.ParseRecord )
48
50
@@ -66,7 +68,7 @@ adjust = _InstanceD . typed . mapped %~ (values %~ truncate) . (functions %~ tru
66
68
parserForLanguage :: Language -> Ptr TreeSitter.Language. Language
67
69
parserForLanguage = \ case
68
70
Unknown -> error " Unknown language encountered"
69
- CodeQL -> CodeQL. tree_sitter_ql
71
+ CodeQL -> ( CodeQL. tree_sitter_ql)
70
72
Go -> Go. tree_sitter_go
71
73
Haskell -> error " Haskell backend not implemented yet"
72
74
Java -> Java. tree_sitter_java
@@ -80,12 +82,17 @@ parserForLanguage = \case
80
82
TypeScript -> TypeScript. tree_sitter_typescript
81
83
TSX -> TSX. tree_sitter_tsx
82
84
83
- main :: IO ()
84
- main = do
85
- Config language path <- Opt. getRecord " generate-ast"
86
- let lang = textToLanguage language
85
+ -- nodeTypesPathForLanguage :: Bazel.Runfiles -> Language -> FilePath
86
+ -- nodeTypesPathForLanguage rf = \case
87
+ -- CodeQL -> r
88
+
89
+ validLanguages :: [Language ]
90
+ validLanguages = [CodeQL , Go , Java , JavaScript , JSON , JSX , PHP , Python , Ruby , TypeScript , TSX ]
91
+
92
+ emit :: FilePath -> Language -> IO ()
93
+ emit path lang = do
94
+ let language = languageToText lang
87
95
decls <- T. pack . pprint . fmap adjust <$> astDeclarationsIO (parserForLanguage lang) path
88
- when (lang == Unknown ) (die (" Couldn't determine language for " <> T. unpack language))
89
96
90
97
let programText =
91
98
[trimming |
@@ -145,3 +152,13 @@ $decls
145
152
hClose tf
146
153
callProcess " ormolu" [" --mode" , " inplace" , path]
147
154
T. readFile path >>= T. putStrLn
155
+
156
+ main :: IO ()
157
+ main = do
158
+ Config language path _root <- Opt. getRecord " generate-ast"
159
+ if language == " all"
160
+ then traverse_ (emit path) validLanguages
161
+ else do
162
+ let lang = textToLanguage language
163
+ when (lang == Unknown ) (die (" Couldn't determine language for " <> T. unpack language))
164
+ emit path lang
0 commit comments