WIP Ast printing

This commit is contained in:
Joey Yakimowich-Payne 2020-04-14 20:38:35 -06:00
commit 80018f43cf
2 changed files with 44 additions and 7 deletions

View file

@ -4,10 +4,35 @@ import regex
import compiler/[ast, idents, lineinfos, modulegraphs, msgs, options, parser, renderer] import compiler/[ast, idents, lineinfos, modulegraphs, msgs, options, parser, renderer]
import "."/treesitter/api import "."/treesitter/[api, c, cpp]
import "."/[globals, getters] import "."/[globals, getters]
proc getCCodeAst*(gState: State, code: string): string =
var parser = tsParserNew()
var code = code
defer:
parser.tsParserDelete()
doAssert code.nBl, "Empty code"
if gState.mode == "c":
doAssert parser.tsParserSetLanguage(treeSitterC()), "Failed to load C parser"
elif gState.mode == "cpp":
doAssert parser.tsParserSetLanguage(treeSitterCpp()), "Failed to load C++ parser"
else:
doAssert false, &"Invalid parser {gState.mode}"
var
tree = parser.tsParserParseString(nil, code.cstring, code.len.uint32)
root = tree.tsTreeRootNode()
defer:
tree.tsTreeDelete()
return code.printLisp(root)
proc getPtrType*(str: string): string = proc getPtrType*(str: string): string =
result = case str: result = case str:
of "cchar": of "cchar":
@ -59,6 +84,9 @@ proc getLit*(gState: State, str: string, expression = false): PNode =
result = newStrNode(nkStrLit, str[1 .. ^2]) result = newStrNode(nkStrLit, str[1 .. ^2])
else: else:
decho "Macro AST:"
decho str
decho nimState.gState.getCCodeAst(str)
let let
str = str =
if expression: gState.getNimExpression(str) if expression: gState.getNimExpression(str)

View file

@ -228,9 +228,12 @@ proc getName*(node: TSNode): string {.inline.} =
if not node.isNil: if not node.isNil:
return $node.tsNodeType() return $node.tsNodeType()
proc getNodeVal*(gState: State, node: TSNode): string = proc getNodeVal*(code: var string, node: TSNode): string =
if not node.isNil: if not node.isNil:
return gState.code[node.tsNodeStartByte() .. node.tsNodeEndByte()-1].strip() return code[node.tsNodeStartByte() .. node.tsNodeEndByte()-1].strip()
proc getNodeVal*(gState: State, node: TSNode): string =
gState.code.getNodeVal(node)
proc getAtom*(node: TSNode): TSNode = proc getAtom*(node: TSNode): TSNode =
if not node.isNil: if not node.isNil:
@ -349,13 +352,16 @@ proc inChildren*(node: TSNode, ntype: string): bool =
result = true result = true
break break
proc getLineCol*(gState: State, node: TSNode): tuple[line, col: int] = proc getLineCol*(code: var string, node: TSNode): tuple[line, col: int] =
# Get line number and column info for node # Get line number and column info for node
let let
point = node.tsNodeStartPoint() point = node.tsNodeStartPoint()
result.line = point.row.int + 1 result.line = point.row.int + 1
result.col = point.column.int + 1 result.col = point.column.int + 1
proc getLineCol*(gState: State, node: TSNode): tuple[line, col: int] =
getLineCol(gState.code, node)
proc getTSNodeNamedChildCountSansComments*(node: TSNode): int = proc getTSNodeNamedChildCountSansComments*(node: TSNode): int =
for i in 0 ..< node.len: for i in 0 ..< node.len:
if node.getName() != "comment": if node.getName() != "comment":
@ -374,7 +380,7 @@ proc getPxName*(node: TSNode, offset: int): string =
if count == offset and not np.isNil: if count == offset and not np.isNil:
return np.getName() return np.getName()
proc printLisp*(gState: State, root: TSNode): string = proc printLisp*(code: var string, root: TSNode): string =
var var
node = root node = root
nextnode: TSNode nextnode: TSNode
@ -384,10 +390,10 @@ proc printLisp*(gState: State, root: TSNode): string =
if not node.isNil and depth > -1: if not node.isNil and depth > -1:
result &= spaces(depth) result &= spaces(depth)
let let
(line, col) = gState.getLineCol(node) (line, col) = code.getLineCol(node)
result &= &"({$node.tsNodeType()} {line} {col} {node.tsNodeEndByte() - node.tsNodeStartByte()}" result &= &"({$node.tsNodeType()} {line} {col} {node.tsNodeEndByte() - node.tsNodeStartByte()}"
let let
val = gState.getNodeVal(node) val = code.getNodeVal(node)
if "\n" notin val and " " notin val: if "\n" notin val and " " notin val:
result &= &" \"{val}\"" result &= &" \"{val}\""
else: else:
@ -419,6 +425,9 @@ proc printLisp*(gState: State, root: TSNode): string =
if node == root: if node == root:
break break
proc printLisp*(gState: State, root: TSNode): string =
printLisp(gState.code, root)
proc getCommented*(str: string): string = proc getCommented*(str: string): string =
"\n# " & str.strip().replace("\n", "\n# ") "\n# " & str.strip().replace("\n", "\n# ")