Print debug, more comments
This commit is contained in:
parent
cfd18e1008
commit
127aa4688e
5 changed files with 166 additions and 59 deletions
|
|
@ -9,4 +9,7 @@ when defined(Windows):
|
||||||
switch("gc", "markAndSweep")
|
switch("gc", "markAndSweep")
|
||||||
|
|
||||||
# Retain stackTrace for clear errors
|
# Retain stackTrace for clear errors
|
||||||
switch("stackTrace", "on")
|
switch("stackTrace", "on")
|
||||||
|
|
||||||
|
# Path to compiler
|
||||||
|
switch("path", "$nim")
|
||||||
|
|
|
||||||
|
|
@ -1,34 +1,97 @@
|
||||||
import macros, os, strutils, tables, times
|
import macros, os, strutils, tables, times
|
||||||
|
|
||||||
import compiler/[ast, idents, options, renderer]
|
import compiler/[ast, astalgo, idents, options, renderer]
|
||||||
|
|
||||||
import "."/treesitter/api
|
import "."/treesitter/api
|
||||||
|
|
||||||
import "."/[compat, globals, getters]
|
import "."/[compat, globals, getters]
|
||||||
|
|
||||||
proc addConst(nimState: NimState, node: TSNode) =
|
proc addConst(nimState: NimState, node: TSNode) =
|
||||||
echo "Const: " & nimState.getNodeVal(node)
|
# (preproc_def
|
||||||
if node.len() >= 2:
|
# (identifier)
|
||||||
|
# (preproc_arg)
|
||||||
|
# )
|
||||||
|
nimState.printDebug(node)
|
||||||
|
|
||||||
|
if node[0].getName() == "identifier" and
|
||||||
|
node[1].getName() == "preproc_arg":
|
||||||
let
|
let
|
||||||
constDef = newNode(nkConstDef)
|
constDef = newNode(nkConstDef)
|
||||||
|
|
||||||
|
# node[0] = identifier = const name
|
||||||
(name, info) = nimState.getNameInfo(node.getAtom(), nskConst)
|
(name, info) = nimState.getNameInfo(node.getAtom(), nskConst)
|
||||||
|
# TODO - check blank and override
|
||||||
ident = nimState.getIdent(name, info)
|
ident = nimState.getIdent(name, info)
|
||||||
|
|
||||||
|
# node[1] = preproc_arg = value
|
||||||
val = nimState.getNodeVal(node[1]).getLit()
|
val = nimState.getNodeVal(node[1]).getLit()
|
||||||
|
|
||||||
|
# If supported literal
|
||||||
if val.kind != nkNilLit:
|
if val.kind != nkNilLit:
|
||||||
|
# nnkConstDef(
|
||||||
|
# nnkPostfix(
|
||||||
|
# nnkIdent("*"),
|
||||||
|
# nnkIdent(name)
|
||||||
|
# ),
|
||||||
|
# nnkEmpty(),
|
||||||
|
# nnkXLit(val)
|
||||||
|
# )
|
||||||
constDef.add ident
|
constDef.add ident
|
||||||
constDef.add newNode(nkEmpty)
|
constDef.add newNode(nkEmpty)
|
||||||
constDef.add val
|
constDef.add val
|
||||||
|
|
||||||
|
# nnkConstSection.add
|
||||||
nimState.constSection.add constDef
|
nimState.constSection.add constDef
|
||||||
|
|
||||||
|
nimState.printDebug(constDef)
|
||||||
|
|
||||||
proc addType(nimState: NimState, node: TSNode) =
|
proc addType(nimState: NimState, node: TSNode) =
|
||||||
echo "Type: " & nimState.getNodeVal(node)
|
# CASE1:
|
||||||
|
#
|
||||||
|
# typedef struct X Y;
|
||||||
|
#
|
||||||
|
# (type_definition
|
||||||
|
# (struct_specifier
|
||||||
|
# (type_identifier)
|
||||||
|
# )
|
||||||
|
# (type_identifier)
|
||||||
|
# )
|
||||||
|
#
|
||||||
|
# CASE 2
|
||||||
|
#
|
||||||
|
# typedef struct X *Y;
|
||||||
|
#
|
||||||
|
# (type_definition
|
||||||
|
# (struct_specifier
|
||||||
|
# (type_identifier)
|
||||||
|
# )
|
||||||
|
# (pointer_declarator
|
||||||
|
# (type_identifier)
|
||||||
|
# )
|
||||||
|
# )
|
||||||
|
#
|
||||||
|
nimState.printDebug(node)
|
||||||
|
|
||||||
|
let
|
||||||
|
typeDef = newNode(nkTypeDef)
|
||||||
|
|
||||||
|
fdlist = node.inTree("field_declaration_list")
|
||||||
|
|
||||||
|
identNode = if fdlist: node[1] else: node
|
||||||
|
|
||||||
|
(name, info) = nimState.getNameInfo(identNode.getAtom(), nskType)
|
||||||
|
# TODO - check blank and override
|
||||||
|
ident = nimState.getIdent(name, info)
|
||||||
|
|
||||||
|
typeNode =
|
||||||
|
if fdlist: node[0] else: node[1]
|
||||||
|
|
||||||
|
|
||||||
proc addEnum(nimState: NimState, node: TSNode) =
|
proc addEnum(nimState: NimState, node: TSNode) =
|
||||||
echo "Enum: " & nimState.getNodeVal(node)
|
nimState.printDebug(node)
|
||||||
|
|
||||||
proc addProc(nimState: NimState, node: TSNode) =
|
proc addProc(nimState: NimState, node: TSNode) =
|
||||||
echo "Proc: " & nimState.getNodeVal(node)
|
nimState.printDebug(node)
|
||||||
|
|
||||||
proc processNode(nimState: NimState, node: TSNode): bool =
|
proc processNode(nimState: NimState, node: TSNode): bool =
|
||||||
result = true
|
result = true
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ import dynlib, macros, os, sequtils, sets, strformat, strutils, tables, times
|
||||||
|
|
||||||
import regex
|
import regex
|
||||||
|
|
||||||
import compiler/[ast, idents, lineinfos, msgs, pathutils]
|
import compiler/[ast, idents, lineinfos, msgs, pathutils, renderer]
|
||||||
|
|
||||||
import "."/[build, compat, globals, plugin, treesitter/api]
|
import "."/[build, compat, globals, plugin, treesitter/api]
|
||||||
|
|
||||||
|
|
@ -221,6 +221,7 @@ proc getLit*(str: string): PNode =
|
||||||
elif str.contains(re"^[\-]?[\d]*[.]?[\d]+$"): # float
|
elif str.contains(re"^[\-]?[\d]*[.]?[\d]+$"): # float
|
||||||
result = newFloatNode(nkFloatLit, parseFloat(str))
|
result = newFloatNode(nkFloatLit, parseFloat(str))
|
||||||
|
|
||||||
|
# TODO - hex becomes int on render
|
||||||
elif str.contains(re"^0x[\da-fA-F]+$"): # hexadecimal
|
elif str.contains(re"^0x[\da-fA-F]+$"): # hexadecimal
|
||||||
result = newIntNode(nkIntLit, parseHexInt(str))
|
result = newIntNode(nkIntLit, parseHexInt(str))
|
||||||
|
|
||||||
|
|
@ -326,6 +327,96 @@ proc getPxName*(node: TSNode, offset: int): string =
|
||||||
if count == offset and not np.tsNodeIsNull():
|
if count == offset and not np.tsNodeIsNull():
|
||||||
return np.getName()
|
return np.getName()
|
||||||
|
|
||||||
|
proc printLisp*(gState: State, root: TSNode): string =
|
||||||
|
var
|
||||||
|
node = root
|
||||||
|
nextnode: TSNode
|
||||||
|
depth = 0
|
||||||
|
|
||||||
|
while true:
|
||||||
|
if not node.tsNodeIsNull() and depth > -1:
|
||||||
|
if gState.pretty:
|
||||||
|
result &= spaces(depth)
|
||||||
|
let
|
||||||
|
(line, col) = gState.getLineCol(node)
|
||||||
|
result &= &"({$node.tsNodeType()} {line} {col} {node.tsNodeEndByte() - node.tsNodeStartByte()}"
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
|
||||||
|
if node.tsNodeNamedChildCount() != 0:
|
||||||
|
if gState.pretty:
|
||||||
|
result &= "\n"
|
||||||
|
nextnode = node.tsNodeNamedChild(0)
|
||||||
|
depth += 1
|
||||||
|
else:
|
||||||
|
if gState.pretty:
|
||||||
|
result &= ")\n"
|
||||||
|
else:
|
||||||
|
result &= ")"
|
||||||
|
nextnode = node.tsNodeNextNamedSibling()
|
||||||
|
|
||||||
|
if nextnode.tsNodeIsNull():
|
||||||
|
while true:
|
||||||
|
node = node.tsNodeParent()
|
||||||
|
depth -= 1
|
||||||
|
if depth == -1:
|
||||||
|
break
|
||||||
|
if gState.pretty:
|
||||||
|
result &= spaces(depth) & ")\n"
|
||||||
|
else:
|
||||||
|
result &= ")"
|
||||||
|
if node == root:
|
||||||
|
break
|
||||||
|
if not node.tsNodeNextNamedSibling().tsNodeIsNull():
|
||||||
|
node = node.tsNodeNextNamedSibling()
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
node = nextnode
|
||||||
|
|
||||||
|
if node == root:
|
||||||
|
break
|
||||||
|
|
||||||
|
proc getCommented*(str: string): string =
|
||||||
|
"\n# " & str.strip().replace("\n", "\n# ")
|
||||||
|
|
||||||
|
proc printTree*(nimState: NimState, pnode: PNode, offset = "") =
|
||||||
|
if nimState.gState.debug and pnode.kind != nkNone:
|
||||||
|
stdout.write "\n# " & offset & $pnode.kind & "("
|
||||||
|
case pnode.kind
|
||||||
|
of nkCharLit:
|
||||||
|
stdout.write "'" & pnode.intVal.char & "')"
|
||||||
|
of nkIntLit..nkUInt64Lit:
|
||||||
|
stdout.write $pnode.intVal & ")"
|
||||||
|
of nkFloatLit..nkFloat128Lit:
|
||||||
|
stdout.write $pnode.floatVal & ")"
|
||||||
|
of nkStrLit..nkTripleStrLit:
|
||||||
|
stdout.write "\"" & pnode.strVal & "\")"
|
||||||
|
of nkSym:
|
||||||
|
stdout.write $pnode.sym & ")"
|
||||||
|
of nkIdent:
|
||||||
|
stdout.write "\"" & $pnode.ident.s & "\")"
|
||||||
|
else:
|
||||||
|
if pnode.sons.len != 0:
|
||||||
|
for i in 0 ..< pnode.sons.len:
|
||||||
|
nimState.printTree(pnode.sons[i], offset & " ")
|
||||||
|
if i != pnode.sons.len - 1:
|
||||||
|
stdout.write ","
|
||||||
|
stdout.write "\n# " & offset & ")"
|
||||||
|
else:
|
||||||
|
stdout.write ")"
|
||||||
|
if offset.len == 0:
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
proc printDebug*(nimState: NimState, node: TSNode) =
|
||||||
|
if nimState.gState.debug:
|
||||||
|
echo nimState.getNodeVal(node).getCommented()
|
||||||
|
echo nimState.gState.printLisp(node).getCommented()
|
||||||
|
|
||||||
|
proc printDebug*(nimState: NimState, pnode: PNode) =
|
||||||
|
if nimState.gState.debug:
|
||||||
|
echo ($pnode).getCommented()
|
||||||
|
nimState.printTree(pnode)
|
||||||
|
|
||||||
# Compiler shortcuts
|
# Compiler shortcuts
|
||||||
|
|
||||||
proc getLineInfo*(nimState: NimState, node: TSNode): TLineInfo =
|
proc getLineInfo*(nimState: NimState, node: TSNode): TLineInfo =
|
||||||
|
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
--path:"$nim"
|
|
||||||
|
|
@ -4,55 +4,6 @@ import "."/treesitter/[api, c, cpp]
|
||||||
|
|
||||||
import "."/[ast2, compat, globals, getters]
|
import "."/[ast2, compat, globals, getters]
|
||||||
|
|
||||||
proc printLisp(gState: State, root: TSNode) =
|
|
||||||
var
|
|
||||||
node = root
|
|
||||||
nextnode: TSNode
|
|
||||||
depth = 0
|
|
||||||
|
|
||||||
while true:
|
|
||||||
if not node.tsNodeIsNull() and depth > -1:
|
|
||||||
if gState.pretty:
|
|
||||||
stdout.write spaces(depth)
|
|
||||||
let
|
|
||||||
(line, col) = gState.getLineCol(node)
|
|
||||||
stdout.write &"({$node.tsNodeType()} {line} {col} {node.tsNodeEndByte() - node.tsNodeStartByte()}"
|
|
||||||
else:
|
|
||||||
break
|
|
||||||
|
|
||||||
if node.tsNodeNamedChildCount() != 0:
|
|
||||||
if gState.pretty:
|
|
||||||
echo ""
|
|
||||||
nextnode = node.tsNodeNamedChild(0)
|
|
||||||
depth += 1
|
|
||||||
else:
|
|
||||||
if gState.pretty:
|
|
||||||
echo ")"
|
|
||||||
else:
|
|
||||||
stdout.write ")"
|
|
||||||
nextnode = node.tsNodeNextNamedSibling()
|
|
||||||
|
|
||||||
if nextnode.tsNodeIsNull():
|
|
||||||
while true:
|
|
||||||
node = node.tsNodeParent()
|
|
||||||
depth -= 1
|
|
||||||
if depth == -1:
|
|
||||||
break
|
|
||||||
if gState.pretty:
|
|
||||||
echo spaces(depth) & ")"
|
|
||||||
else:
|
|
||||||
stdout.write ")"
|
|
||||||
if node == root:
|
|
||||||
break
|
|
||||||
if not node.tsNodeNextNamedSibling().tsNodeIsNull():
|
|
||||||
node = node.tsNodeNextNamedSibling()
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
node = nextnode
|
|
||||||
|
|
||||||
if node == root:
|
|
||||||
break
|
|
||||||
|
|
||||||
proc process(gState: State, path: string) =
|
proc process(gState: State, path: string) =
|
||||||
doAssert existsFile(path), &"Invalid path {path}"
|
doAssert existsFile(path), &"Invalid path {path}"
|
||||||
|
|
||||||
|
|
@ -91,7 +42,7 @@ proc process(gState: State, path: string) =
|
||||||
tree.tsTreeDelete()
|
tree.tsTreeDelete()
|
||||||
|
|
||||||
if gState.past:
|
if gState.past:
|
||||||
gState.printLisp(root)
|
echo gState.printLisp(root)
|
||||||
elif gState.pnim:
|
elif gState.pnim:
|
||||||
gState.printNim(path, root)
|
gState.printNim(path, root)
|
||||||
elif gState.preprocess:
|
elif gState.preprocess:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue