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"
|
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, ...)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue