13
13
module Main (main ) where
14
14
15
15
import AST.GenerateSyntax
16
+ import qualified Bazel.Runfiles as Bazel
16
17
import Control.Lens (Traversal' , mapped , (%~) )
17
18
import Control.Monad
18
19
import Data.Foldable
@@ -28,10 +29,12 @@ import Language.Haskell.TH.Lens
28
29
import NeatInterpolation
29
30
import qualified Options.Generic as Opt
30
31
import Source.Language
32
+ import System.FilePath
31
33
import System.Directory
32
34
import System.Exit
33
35
import System.IO
34
36
import System.Process
37
+ import Text.Printf
35
38
import qualified TreeSitter.Go as Go (tree_sitter_go )
36
39
import qualified TreeSitter.JSON as JSON (tree_sitter_json )
37
40
import qualified TreeSitter.Java as Java (tree_sitter_java )
@@ -44,7 +47,7 @@ import qualified TreeSitter.TSX as TSX (tree_sitter_tsx)
44
47
import qualified TreeSitter.TypeScript as TypeScript (tree_sitter_typescript )
45
48
46
49
-- As a special case, you can pass
47
- data Config = Config { language :: Text , path :: FilePath , rootdir :: Maybe FilePath }
50
+ data Config = Config { language :: Text , rootdir :: FilePath }
48
51
deriving stock (Show , Generic )
49
52
deriving anyclass (Opt.ParseRecord )
50
53
@@ -65,6 +68,37 @@ adjust = _InstanceD . typed . mapped %~ (values %~ truncate) . (functions %~ tru
65
68
truncate :: Name -> Name
66
69
truncate = mkName . nameBase
67
70
71
+ pathForLanguage :: Bazel. Runfiles -> Language -> FilePath
72
+ pathForLanguage rf =
73
+ let loc = Bazel. rlocation rf
74
+ in \ case
75
+ CodeQL -> loc " tree-sitter-ql/vendor/tree-sitter-ql/src/node-types.json"
76
+ Go -> loc " tree-sitter-go/vendor/tree-sitter-go/src/node-types.json"
77
+ PHP -> loc " tree-sitter-php/vendor/tree-sitter-php/src/node-types.json"
78
+ Python -> loc " tree-sitter-python/vendor/tree-sitter-python/src/node-types.json"
79
+ Ruby -> loc " tree-sitter-ruby/vendor/tree-sitter-ruby/src/node-types.json"
80
+ TypeScript -> loc " tree-sitter-typescript/vendor/tree-sitter-typescript/typescript/src/node-types.json"
81
+ TSX -> loc " tree-sitter-tsx/vendor/tree-sitter-typescript/tsx/src/node-types.json"
82
+ JavaScript -> loc " tree-sitter-typescript/vendor/tree-sitter-typescript/typescript/src/node-types.json"
83
+ JSX -> loc " tree-sitter-typescript/vendor/tree-sitter-typescript/src/tsx/node-types.json"
84
+ Java -> loc " tree-sitter-java/vendor/tree-sitter-java/src/node-types.json"
85
+ other -> error (" Couldn't find path for " <> show other)
86
+
87
+ targetForLanguage :: Language -> FilePath
88
+ targetForLanguage x =
89
+ let go lc = printf " semantic-%s/src/Language/%s/AST.hs" (lc :: String ) (show x)
90
+ in case x of
91
+ CodeQL -> go " codeql"
92
+ Go -> go " go"
93
+ PHP -> go " php"
94
+ Python -> go " python"
95
+ Ruby -> go " ruby"
96
+ TypeScript -> go " typescript"
97
+ TSX -> go " tsx"
98
+ JavaScript -> go " javascript"
99
+ Java -> go " java"
100
+ other -> error (" Couldn't find path for " <> show other)
101
+
68
102
parserForLanguage :: Language -> Ptr TreeSitter.Language. Language
69
103
parserForLanguage = \ case
70
104
Unknown -> error " Unknown language encountered"
@@ -87,11 +121,13 @@ parserForLanguage = \case
87
121
-- CodeQL -> r
88
122
89
123
validLanguages :: [Language ]
90
- validLanguages = [CodeQL , Go , Java , JavaScript , JSON , JSX , PHP , Python , Ruby , TypeScript , TSX ]
124
+ validLanguages = [CodeQL , Go , Java , PHP , Python , Ruby , TypeScript , TSX ]
91
125
92
126
emit :: FilePath -> Language -> IO ()
93
- emit path lang = do
127
+ emit root lang = do
128
+ rf <- Bazel. create
94
129
let language = languageToText lang
130
+ let path = pathForLanguage rf lang
95
131
decls <- T. pack . pprint . fmap adjust <$> astDeclarationsIO (parserForLanguage lang) path
96
132
97
133
let programText =
@@ -151,14 +187,14 @@ $decls
151
187
T. hPutStrLn tf programText
152
188
hClose tf
153
189
callProcess " ormolu" [" --mode" , " inplace" , path]
154
- T. readFile path >>= T. putStrLn
190
+ callProcess " cp " [ path, root </> targetForLanguage lang]
155
191
156
192
main :: IO ()
157
193
main = do
158
- Config language path _root <- Opt. getRecord " generate-ast"
194
+ Config language root <- Opt. getRecord " generate-ast"
159
195
if language == " all"
160
- then traverse_ (emit path ) validLanguages
196
+ then traverse_ (emit root ) validLanguages
161
197
else do
162
198
let lang = textToLanguage language
163
199
when (lang == Unknown ) (die (" Couldn't determine language for " <> T. unpack language))
164
- emit path lang
200
+ emit root lang
0 commit comments