Partial fix for #52 - only when names differ

This commit is contained in:
Ganesh Viswanathan 2019-01-22 23:03:51 -06:00
commit d6e9a49194
3 changed files with 80 additions and 25 deletions

View file

@ -154,6 +154,25 @@ proc initGrammar() =
gStateRT.typeStr &= &" {name}* = {getPtrType(tptr&typ)}\n" gStateRT.typeStr &= &" {name}* = {getPtrType(tptr&typ)}\n"
)) ))
proc pDupTypeCommon(nname: string, fend: int, isEnum=false) =
var
dname = gStateRT.data[^1].val
ndname = gStateRT.data[^1].val.getIdentifier()
dptr =
if fend == 2:
"ptr "
else:
""
if ndname != nname:
if isEnum:
if gStateRT.enums.addNewIdentifer(ndname):
gStateRT.enumStr &= &"type {ndname}* = {dptr}{nname}\n"
else:
if gStateRT.types.addNewIdentifer(ndname):
gStateRT.typeStr &=
&" {ndname}* {{.importc: \"{dname}\", header: {gStateRT.currentHeader}, bycopy.}} = {dptr}{nname}\n"
proc pStructCommon(ast: ref Ast, node: TSNode, name: string, fstart, fend: int) = proc pStructCommon(ast: ref Ast, node: TSNode, name: string, fstart, fend: int) =
var var
nname = name.getIdentifier() nname = name.getIdentifier()
@ -250,12 +269,7 @@ proc initGrammar() =
if node.tsNodeType() == "type_definition" and if node.tsNodeType() == "type_definition" and
gStateRT.data[^1].name == "type_identifier" and gStateRT.data[^1].val.len != 0: gStateRT.data[^1].name == "type_identifier" and gStateRT.data[^1].val.len != 0:
let pDupTypeCommon(nname, fend, false)
dname = gStateRT.data[^1].val
ndname = gStateRT.data[^1].val.getIdentifier()
if gStateRT.types.addNewIdentifer(ndname):
gStateRT.typeStr &= &" {ndname}* {{.importc: \"{dname}\", header: {gStateRT.currentHeader}, bycopy.}} = {nname}\n"
let let
fieldGrammar = &""" fieldGrammar = &"""
@ -313,16 +327,20 @@ proc initGrammar() =
""", """,
proc (ast: ref Ast, node: TSNode) = proc (ast: ref Ast, node: TSNode) =
var var
offset = 0 fstart = 0
fend = 1
if gStateRT.data[^2].name == "pointer_declarator":
fend = 2
if gStateRT.data.len > 1 and if gStateRT.data.len > 1 and
gStateRT.data[0].name == "type_identifier" and gStateRT.data[0].name == "type_identifier" and
gStateRT.data[1].name != "field_identifier": gStateRT.data[1].name != "field_identifier":
offset = 1 fstart = 1
pStructCommon(ast, node, gStateRT.data[0].val, offset, 1) pStructCommon(ast, node, gStateRT.data[0].val, fstart, fend)
else: else:
pStructCommon(ast, node, gStateRT.data[^1].val, offset, 1) pStructCommon(ast, node, gStateRT.data[^1].val, fstart, fend)
)) ))
proc pEnumCommon(ast: ref Ast, node: TSNode, name: string, fstart, fend: int) = proc pEnumCommon(ast: ref Ast, node: TSNode, name: string, fstart, fend: int) =
@ -347,19 +365,24 @@ proc initGrammar() =
i += 1 i += 1
continue continue
if gStateRT.consts.addNewIdentifer(fname): if i+1 < gStateRT.data.len-fend and
if i+1 < gStateRT.data.len-fend and gStateRT.data[i+1].name in gEnumVals:
gStateRT.data[i+1].name in gEnumVals: if gStateRT.consts.addNewIdentifer(fname):
gStateRT.constStr &= &" {fname}* = ({gStateRT.data[i+1].val.getNimExpression()}).{nname}\n" gStateRT.constStr &= &" {fname}* = ({gStateRT.data[i+1].val.getNimExpression()}).{nname}\n"
try: try:
count = gStateRT.data[i+1].val.parseInt() + 1 count = gStateRT.data[i+1].val.parseInt() + 1
except: except:
count += 1
i += 2
else:
gStateRT.constStr &= &" {fname}* = {count}.{nname}\n"
i += 1
count += 1 count += 1
i += 2
else:
if gStateRT.consts.addNewIdentifer(fname):
gStateRT.constStr &= &" {fname}* = {count}.{nname}\n"
i += 1
count += 1
if node.tsNodeType() == "type_definition" and
gStateRT.data[^1].name == "type_identifier" and gStateRT.data[^1].val.len != 0:
pDupTypeCommon(nname, fend, true)
# enum X {} # enum X {}
gStateRT.grammar.add((""" gStateRT.grammar.add(("""
@ -389,17 +412,26 @@ proc initGrammar() =
gStateRT.grammar.add((&""" gStateRT.grammar.add((&"""
(type_definition (type_definition
{gStateRT.grammar[^1].grammar} {gStateRT.grammar[^1].grammar}
(type_identifier) (type_identifier!)
(pointer_declarator
(type_identifier)
)
) )
""", """,
proc (ast: ref Ast, node: TSNode) = proc (ast: ref Ast, node: TSNode) =
var var
offset = 0 fstart = 0
fend = 1
if gStateRT.data[^2].name == "pointer_declarator":
fend = 2
if gStateRT.data[0].name == "type_identifier": if gStateRT.data[0].name == "type_identifier":
offset = 1 fstart = 1
pEnumCommon(ast, node, gStateRT.data[^1].val, offset, 1) pEnumCommon(ast, node, gStateRT.data[0].val, fstart, fend)
else:
pEnumCommon(ast, node, gStateRT.data[^1].val, fstart, fend)
)) ))
# typ function(typ param1, ...) # typ function(typ param1, ...)

View file

@ -115,6 +115,20 @@ void
*multiline2(void), *multiline2(void),
multiline3(void); multiline3(void);
// Issue #52
typedef struct struct6 { char name; } *STRUCT6;
typedef enum enum6t { enum16 } *ENUM6;
typedef union union3 { char name; } *UNION3;
struct struct6 test_call_stype6();
STRUCT6 test_call_stype_ptr6();
enum enum6t test_call_etype6();
ENUM6 test_call_etype_ptr6();
union union3 test_call_utype3();
UNION3 test_call_etype_ptr3();
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View file

@ -115,6 +115,15 @@ multiline1()
let p = multiline2() let p = multiline2()
multiline3() multiline3()
# Issue #52
var
s6: struct6
s6p: STRUCT6
e6: enum6t
e6p: ENUM6
u3: union3
u3p: UNION3
cAddStdDir() cAddStdDir()
## failing tests ## failing tests