Bitfield support, space after comments

This commit is contained in:
Ganesh Viswanathan 2019-06-09 15:58:01 -05:00
commit 68ab2dbec1
4 changed files with 31 additions and 14 deletions

View file

@ -7,24 +7,28 @@ import "."/[getters, globals, grammar, treesitter/api]
proc saveNodeData(node: TSNode, nimState: NimState): bool = proc saveNodeData(node: TSNode, nimState: NimState): bool =
let name = $node.tsNodeType() let name = $node.tsNodeType()
if name in gAtoms: if name in gAtoms:
var
val = nimState.getNodeVal(node)
if name == "primitive_type" and node.tsNodeParent.tsNodeType() == "sized_type_specifier":
return true
if name in ["number_literal", "identifier"] and $node.tsNodeParent.tsNodeType() in gExpressions:
return true
if name in ["primitive_type", "sized_type_specifier"]:
val = val.getType()
let let
pname = node.getPxName(1) pname = node.getPxName(1)
ppname = node.getPxName(2) ppname = node.getPxName(2)
pppname = node.getPxName(3) pppname = node.getPxName(3)
ppppname = node.getPxName(4) ppppname = node.getPxName(4)
var
val = nimState.getNodeVal(node)
if name == "primitive_type" and pname == "sized_type_specifier":
return true
if name in ["number_literal", "identifier"] and pname in gExpressions:
return true
if name in ["number_literal"] and pname == "bitfield_clause":
nimState.data.add(("bitfield_clause", val))
return true
if name in ["primitive_type", "sized_type_specifier"]:
val = val.getType()
if node.tsNodePrevNamedSibling().tsNodeIsNull(): if node.tsNodePrevNamedSibling().tsNodeIsNull():
if pname == "pointer_declarator": if pname == "pointer_declarator":
if ppname notin ["function_declarator", "array_declarator"]: if ppname notin ["function_declarator", "array_declarator"]:
@ -43,7 +47,7 @@ proc saveNodeData(node: TSNode, nimState: NimState): bool =
nimState.data.add((name, val)) nimState.data.add((name, val))
if node.tsNodeType() == "field_identifier" and if name == "field_identifier" and
pname == "pointer_declarator" and pname == "pointer_declarator" and
ppname == "function_declarator": ppname == "function_declarator":
if pppname == "pointer_declarator": if pppname == "pointer_declarator":

View file

@ -290,6 +290,11 @@ proc initGrammar(): Grammar =
flen = nimState.data[i+1].val.getNimExpression() flen = nimState.data[i+1].val.getNimExpression()
nimState.typeStr &= &"{nimState.getComments()}\n {fname}*: {aptr}array[{flen}, {getPtrType(fptr&ftyp)}]" nimState.typeStr &= &"{nimState.getComments()}\n {fname}*: {aptr}array[{flen}, {getPtrType(fptr&ftyp)}]"
i += 2 i += 2
elif i+1 < nimState.data.len-fend and nimState.data[i+1].name == "bitfield_clause":
let
size = nimState.data[i+1].val
nimState.typeStr &= &"{nimState.getComments()}\n {fname}* {{.bitsize: {size}.}} : {getPtrType(fptr&ftyp)} "
i += 2
elif i+1 < nimState.data.len-fend and nimState.data[i+1].name == "function_declarator": elif i+1 < nimState.data.len-fend and nimState.data[i+1].name == "function_declarator":
var var
pout, pname, ptyp, pptr = "" pout, pname, ptyp, pptr = ""
@ -327,6 +332,9 @@ proc initGrammar(): Grammar =
let let
fieldGrammar = &""" fieldGrammar = &"""
(field_identifier!) (field_identifier!)
(bitfield_clause!
(number_literal)
)
(array_declarator! (array_declarator!
(field_identifier!) (field_identifier!)
(pointer_declarator (pointer_declarator

View file

@ -88,6 +88,7 @@ typedef struct {
enum ENUM field3[TEST_INT]; enum ENUM field3[TEST_INT];
int *field4[TEST_INT]; int *field4[TEST_INT];
ENUM4 *field5[TEST_INT+TEST_INT]; ENUM4 *field5[TEST_INT+TEST_INT];
int field6 : 1;
} STRUCT4; } STRUCT4;
typedef struct struct5 { typedef struct struct5 {

View file

@ -78,6 +78,10 @@ when defined(cpp):
else: else:
s4.field3[3] = enum1 s4.field3[3] = enum1
s4.field6 = 1
s4.field6 += 1
check s4.field6 == 0
s5.tci = test_call_int s5.tci = test_call_int
s5.tcp = test_call_param s5.tcp = test_call_param
s5.tcp8 = test_call_param8 s5.tcp8 = test_call_param8