Skip to content

Commit 18f168b

Browse files
committed
semantic: Add semantic-c support
1 parent 80e294d commit 18f168b

File tree

5 files changed

+22
-2
lines changed

5 files changed

+22
-2
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ Available options:
3636

3737
| Language | Parse | AST Symbols† | Stack graphs |
3838
| :------------- | :---: | :---: | :---: |
39+
| C || ⬜️ | |
3940
| Ruby ||| |
4041
| JavaScript ||| |
4142
| TypeScript ||| 🚧 |

semantic/BUILD.bazel

+1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ haskell_library(
5656
"//:deepseq",
5757
"//:filepath",
5858
"//:template-haskell",
59+
"//semantic-c",
5960
"//semantic-codeql",
6061
"//semantic-go",
6162
"//semantic-java",

semantic/semantic.cabal

+1
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ library
125125
, proto-lens >= 0.5 && < 0.8
126126
, semantic-analysis ^>= 0
127127
, semantic-ast
128+
, semantic-c ^>= 0
128129
, semantic-codeql ^>= 0
129130
, semantic-go ^>= 0
130131
, semantic-java ^>= 0

semantic/src/Parsing/Parser.hs

+9-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ module Parsing.Parser
1111
-- * Parsers
1212
-- $abstract
1313
, SomeParser(..)
14+
, cParser
1415
, goParser
1516
, javaParser
1617
, javascriptParser
@@ -30,6 +31,7 @@ import AST.Unmarshal
3031
import Data.Map (Map)
3132
import qualified Data.Map as Map
3233
import Foreign.Ptr
34+
import qualified Language.C as CPrecise
3335
import qualified Language.CodeQL as CodeQLPrecise
3436
import qualified Language.Go as GoPrecise
3537
import qualified Language.Java as Java
@@ -80,6 +82,9 @@ data Parser term where
8082
data SomeParser c a where
8183
SomeParser :: c t => Parser (t a) -> SomeParser c a
8284

85+
cParser :: c CPrecise.Term => (Language, SomeParser c Loc)
86+
cParser = (C, SomeParser (UnmarshalParser @CPrecise.Term CPrecise.tree_sitter_c))
87+
8388
goParser :: c GoPrecise.Term => (Language, SomeParser c Loc)
8489
goParser = (Go, SomeParser (UnmarshalParser @GoPrecise.Term GoPrecise.tree_sitter_go))
8590

@@ -115,7 +120,8 @@ typescriptParser = (TypeScript, SomeParser (UnmarshalParser @TypeScriptPrecise.T
115120

116121
-- | The canonical set of parsers producing precise terms.
117122
preciseParsers
118-
:: ( c Java.Term
123+
:: ( c CPrecise.Term
124+
, c Java.Term
119125
, c JSON.Term
120126
, c PythonPrecise.Term
121127
, c CodeQLPrecise.Term
@@ -127,7 +133,8 @@ preciseParsers
127133
)
128134
=> Map Language (SomeParser c Loc)
129135
preciseParsers = Map.fromList
130-
[ goParser
136+
[ cParser
137+
, goParser
131138
, javascriptParser
132139
, jsonParser
133140
, jsxParser

semantic/src/Semantic/Api/Terms.hs

+10
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import Data.ByteString.Builder
2424
import Data.Either
2525
import Data.Foldable (fold)
2626
import Data.Map.Strict (Map)
27+
import qualified Language.C as C
2728
import qualified Language.CodeQL as CodeQL
2829
import qualified Language.Go as Go
2930
import qualified Language.Java as Java
@@ -74,6 +75,9 @@ showTermParsers = preciseParsers
7475
class ShowTerm term where
7576
showTerm :: (Has (Reader Config) sig m) => term Loc -> m Builder
7677

78+
instance ShowTerm C.Term where
79+
showTerm = serialize Show . void . C.getTerm
80+
7781
instance ShowTerm Go.Term where
7882
showTerm = serialize Show . void . Go.getTerm
7983

@@ -107,6 +111,9 @@ jsonTermParsers = preciseParsers
107111
class JSONTerm term where
108112
jsonTerm :: (Has (Reader Config) sig m) => term Loc -> m Builder
109113

114+
instance JSONTerm C.Term where
115+
jsonTerm = serialize Marshal . C.getTerm
116+
110117
instance JSONTerm Go.Term where
111118
jsonTerm = serialize Marshal . Go.getTerm
112119

@@ -140,6 +147,9 @@ sexprTermParsers = preciseParsers
140147
class SExprTerm term where
141148
sexprTerm :: term Loc -> Builder
142149

150+
instance SExprTerm C.Term where
151+
sexprTerm = SExpr.Precise.serializeSExpression . C.getTerm
152+
143153
instance SExprTerm Go.Term where
144154
sexprTerm = SExpr.Precise.serializeSExpression . Go.getTerm
145155

0 commit comments

Comments
 (0)