Partial fix for #52 - only when names differ
This commit is contained in:
parent
bf685d1dfc
commit
d6e9a49194
3 changed files with 80 additions and 25 deletions
|
|
@ -154,6 +154,25 @@ proc initGrammar() =
|
|||
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) =
|
||||
var
|
||||
nname = name.getIdentifier()
|
||||
|
|
@ -250,12 +269,7 @@ proc initGrammar() =
|
|||
|
||||
if node.tsNodeType() == "type_definition" and
|
||||
gStateRT.data[^1].name == "type_identifier" and gStateRT.data[^1].val.len != 0:
|
||||
let
|
||||
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"
|
||||
pDupTypeCommon(nname, fend, false)
|
||||
|
||||
let
|
||||
fieldGrammar = &"""
|
||||
|
|
@ -313,16 +327,20 @@ proc initGrammar() =
|
|||
""",
|
||||
proc (ast: ref Ast, node: TSNode) =
|
||||
var
|
||||
offset = 0
|
||||
fstart = 0
|
||||
fend = 1
|
||||
|
||||
if gStateRT.data[^2].name == "pointer_declarator":
|
||||
fend = 2
|
||||
|
||||
if gStateRT.data.len > 1 and
|
||||
gStateRT.data[0].name == "type_identifier" and
|
||||
gStateRT.data[1].name != "field_identifier":
|
||||
|
||||
offset = 1
|
||||
pStructCommon(ast, node, gStateRT.data[0].val, offset, 1)
|
||||
fstart = 1
|
||||
pStructCommon(ast, node, gStateRT.data[0].val, fstart, fend)
|
||||
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) =
|
||||
|
|
@ -347,19 +365,24 @@ proc initGrammar() =
|
|||
i += 1
|
||||
continue
|
||||
|
||||
if gStateRT.consts.addNewIdentifer(fname):
|
||||
if i+1 < gStateRT.data.len-fend and
|
||||
gStateRT.data[i+1].name in gEnumVals:
|
||||
if i+1 < gStateRT.data.len-fend and
|
||||
gStateRT.data[i+1].name in gEnumVals:
|
||||
if gStateRT.consts.addNewIdentifer(fname):
|
||||
gStateRT.constStr &= &" {fname}* = ({gStateRT.data[i+1].val.getNimExpression()}).{nname}\n"
|
||||
try:
|
||||
count = gStateRT.data[i+1].val.parseInt() + 1
|
||||
except:
|
||||
count += 1
|
||||
i += 2
|
||||
else:
|
||||
gStateRT.constStr &= &" {fname}* = {count}.{nname}\n"
|
||||
i += 1
|
||||
try:
|
||||
count = gStateRT.data[i+1].val.parseInt() + 1
|
||||
except:
|
||||
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 {}
|
||||
gStateRT.grammar.add(("""
|
||||
|
|
@ -389,17 +412,26 @@ proc initGrammar() =
|
|||
gStateRT.grammar.add((&"""
|
||||
(type_definition
|
||||
{gStateRT.grammar[^1].grammar}
|
||||
(type_identifier)
|
||||
(type_identifier!)
|
||||
(pointer_declarator
|
||||
(type_identifier)
|
||||
)
|
||||
)
|
||||
""",
|
||||
proc (ast: ref Ast, node: TSNode) =
|
||||
var
|
||||
offset = 0
|
||||
fstart = 0
|
||||
fend = 1
|
||||
|
||||
if gStateRT.data[^2].name == "pointer_declarator":
|
||||
fend = 2
|
||||
|
||||
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, ...)
|
||||
|
|
|
|||
|
|
@ -115,6 +115,20 @@ void
|
|||
*multiline2(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
|
||||
}
|
||||
#endif
|
||||
|
|
@ -115,6 +115,15 @@ multiline1()
|
|||
let p = multiline2()
|
||||
multiline3()
|
||||
|
||||
# Issue #52
|
||||
var
|
||||
s6: struct6
|
||||
s6p: STRUCT6
|
||||
e6: enum6t
|
||||
e6p: ENUM6
|
||||
u3: union3
|
||||
u3p: UNION3
|
||||
|
||||
cAddStdDir()
|
||||
|
||||
## failing tests
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue