Preserve type array ast
This commit is contained in:
parent
ec5ba997b7
commit
3bbdbeb870
3 changed files with 12 additions and 10 deletions
|
|
@ -952,10 +952,7 @@ proc getTypeArray(gState: State, node: TSNode, tident: PNode, name: string): PNo
|
||||||
var size: PNode
|
var size: PNode
|
||||||
let cnodeVal = gState.getNodeVal(cnode[1])
|
let cnodeVal = gState.getNodeVal(cnode[1])
|
||||||
# Size of array could be a Nim expression
|
# Size of array could be a Nim expression
|
||||||
size = gState.parseCExpression(cnodeVal)
|
size = gState.parseCExpression(cnodeVal, skipIdentValidation = true)
|
||||||
if size.kind == nkNone:
|
|
||||||
# If the size could not be parsed, leave it alone
|
|
||||||
size = gState.getIdent(cnodeVal)
|
|
||||||
|
|
||||||
result = gState.newArrayTree(cnode, result, size)
|
result = gState.newArrayTree(cnode, result, size)
|
||||||
cnode = cnode[0]
|
cnode = cnode[0]
|
||||||
|
|
|
||||||
|
|
@ -45,14 +45,14 @@ proc getExprIdent*(gState: State, identName: string, kind = nskConst, parent = "
|
||||||
##
|
##
|
||||||
## Returns PNode(nkNone) if the identifier is blank
|
## Returns PNode(nkNone) if the identifier is blank
|
||||||
result = newNode(nkNone)
|
result = newNode(nkNone)
|
||||||
if identName notin gState.skippedSyms:
|
if gState.currentExprSkipIdentValidation or identName notin gState.skippedSyms:
|
||||||
var ident = identName
|
var ident = identName
|
||||||
if ident != "_":
|
if ident != "_":
|
||||||
# Process the identifier through cPlugin
|
# Process the identifier through cPlugin
|
||||||
ident = gState.getIdentifier(ident, kind, parent)
|
ident = gState.getIdentifier(ident, kind, parent)
|
||||||
if kind == nskType:
|
if kind == nskType:
|
||||||
result = gState.getIdent(ident)
|
result = gState.getIdent(ident)
|
||||||
elif ident.nBl and ident in gState.constIdentifiers:
|
elif gState.currentExprSkipIdentValidation or ident.nBl and ident in gState.constIdentifiers:
|
||||||
if gState.currentTyCastName.nBl:
|
if gState.currentTyCastName.nBl:
|
||||||
ident = ident & "." & gState.currentTyCastName
|
ident = ident & "." & gState.currentTyCastName
|
||||||
result = gState.getIdent(ident)
|
result = gState.getIdent(ident)
|
||||||
|
|
@ -591,7 +591,7 @@ proc processTSNode(gState: State, node: TSNode, typeofNode: var PNode): PNode =
|
||||||
|
|
||||||
decho "NODE RESULT: ", result
|
decho "NODE RESULT: ", result
|
||||||
|
|
||||||
proc parseCExpression*(gState: State, codeRoot: TSNode, name = ""): PNode =
|
proc parseCExpression*(gState: State, codeRoot: TSNode): PNode =
|
||||||
## Parse a c expression from a root ts node
|
## Parse a c expression from a root ts node
|
||||||
|
|
||||||
# This var is used for keeping track of the type of the first
|
# This var is used for keeping track of the type of the first
|
||||||
|
|
@ -607,14 +607,16 @@ proc parseCExpression*(gState: State, codeRoot: TSNode, name = ""): PNode =
|
||||||
decho "UNEXPECTED EXCEPTION: ", e.msg
|
decho "UNEXPECTED EXCEPTION: ", e.msg
|
||||||
result = newNode(nkNone)
|
result = newNode(nkNone)
|
||||||
|
|
||||||
proc parseCExpression*(gState: State, code: string, name = ""): PNode =
|
proc parseCExpression*(gState: State, code: string, name = "", skipIdentValidation = false): PNode =
|
||||||
## Convert the C string to a nim PNode tree
|
## Convert the C string to a nim PNode tree
|
||||||
gState.currentExpr = code
|
gState.currentExpr = code
|
||||||
gState.currentTyCastName = name
|
gState.currentTyCastName = name
|
||||||
|
gState.currentExprSkipIdentValidation = skipIdentValidation
|
||||||
|
|
||||||
withCodeAst(gState.currentExpr, gState.mode):
|
withCodeAst(gState.currentExpr, gState.mode):
|
||||||
result = gState.parseCExpression(root, name)
|
result = gState.parseCExpression(root)
|
||||||
|
|
||||||
# Clear the state
|
# Clear the state
|
||||||
gState.currentExpr = ""
|
gState.currentExpr = ""
|
||||||
gState.currentTyCastName = ""
|
gState.currentTyCastName = ""
|
||||||
|
gState.currentExprSkipIdentValidation = false
|
||||||
|
|
@ -114,6 +114,9 @@ type
|
||||||
|
|
||||||
# Used for the exprparser.nim module
|
# Used for the exprparser.nim module
|
||||||
currentExpr*, currentTyCastName*: string
|
currentExpr*, currentTyCastName*: string
|
||||||
|
# Controls whether or not the current expression
|
||||||
|
# should validate idents against currently defined idents
|
||||||
|
currentExprSkipIdentValidation*: bool
|
||||||
|
|
||||||
# Legacy AST fields, remove when ast2 becomes default
|
# Legacy AST fields, remove when ast2 becomes default
|
||||||
constStr*, enumStr*, procStr*, typeStr*: string
|
constStr*, enumStr*, procStr*, typeStr*: string
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue