Skip to content

Commit 99e6352

Browse files
author
Patrick Thomson
committed
Iterate.
1 parent a999078 commit 99e6352

File tree

3 files changed

+39
-9
lines changed

3 files changed

+39
-9
lines changed

semantic-ast/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ haskell_binary(
7777
"@stackage//:generic-lens",
7878
"@stackage//:lens",
7979
"@stackage//:tree-sitter",
80+
"@stackage//:bazel-runfiles",
8081
"@stackage//:neat-interpolation",
8182
"@stackage//:optparse-generic",
8283
] + all_ts_deps,

semantic-ast/README.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
11
# semantic-ast
22

3-
This package is concerned with the CodeGen generation of strongly-typed ASTs.
3+
This package is concerned with the CodeGen generation of strongly-typed ASTs.
4+
5+
The provided `semantic-ast` executable is responsible for generating ASTs from language definitions. You can run it like so:
6+
7+
```
8+
cabal run semantic-ast -- --language=JSON
9+
```
10+
11+
You can also pass `all` to regenerate every language definition:
12+
13+
```
14+
cabal run semantic-ast -- --language=all
15+
```
416

517
[Documentation](https://github.com/github/semantic/blob/master/docs/codegen.md)

semantic-ast/app/Main.hs

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ module Main (main) where
1515
import AST.GenerateSyntax
1616
import Control.Lens (Traversal', mapped, (%~))
1717
import Control.Monad
18+
import Data.Foldable
1819
import Data.Generics.Product.Typed (typed)
1920
import Data.Maybe
2021
import Data.Text (Text)
@@ -29,20 +30,21 @@ import qualified Options.Generic as Opt
2930
import Source.Language
3031
import System.Directory
3132
import System.Exit
32-
import qualified TreeSitter.Language
3333
import System.IO
3434
import System.Process
3535
import qualified TreeSitter.Go as Go (tree_sitter_go)
3636
import qualified TreeSitter.JSON as JSON (tree_sitter_json)
3737
import qualified TreeSitter.Java as Java (tree_sitter_java)
38+
import qualified TreeSitter.Language
3839
import qualified TreeSitter.PHP as PHP (tree_sitter_php)
3940
import qualified TreeSitter.Python as Python (tree_sitter_python)
4041
import qualified TreeSitter.QL as CodeQL (tree_sitter_ql)
4142
import qualified TreeSitter.Ruby as Ruby (tree_sitter_ruby)
4243
import qualified TreeSitter.TSX as TSX (tree_sitter_tsx)
4344
import qualified TreeSitter.TypeScript as TypeScript (tree_sitter_typescript)
4445

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}
4648
deriving stock (Show, Generic)
4749
deriving anyclass (Opt.ParseRecord)
4850

@@ -66,7 +68,7 @@ adjust = _InstanceD . typed . mapped %~ (values %~ truncate) . (functions %~ tru
6668
parserForLanguage :: Language -> Ptr TreeSitter.Language.Language
6769
parserForLanguage = \case
6870
Unknown -> error "Unknown language encountered"
69-
CodeQL -> CodeQL.tree_sitter_ql
71+
CodeQL -> (CodeQL.tree_sitter_ql)
7072
Go -> Go.tree_sitter_go
7173
Haskell -> error "Haskell backend not implemented yet"
7274
Java -> Java.tree_sitter_java
@@ -80,12 +82,17 @@ parserForLanguage = \case
8082
TypeScript -> TypeScript.tree_sitter_typescript
8183
TSX -> TSX.tree_sitter_tsx
8284

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
8795
decls <- T.pack . pprint . fmap adjust <$> astDeclarationsIO (parserForLanguage lang) path
88-
when (lang == Unknown) (die ("Couldn't determine language for " <> T.unpack language))
8996

9097
let programText =
9198
[trimming|
@@ -145,3 +152,13 @@ $decls
145152
hClose tf
146153
callProcess "ormolu" ["--mode", "inplace", path]
147154
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

Comments
 (0)