Support using 'typename' qualifier before type names

- Fixes #7
This commit is contained in:
Dustin Spicuzza
2021-01-09 12:54:45 -05:00
parent 07b63127f7
commit 3c51a30efe
4 changed files with 125 additions and 11 deletions

View File

@@ -17,6 +17,7 @@ from cxxheaderparser.types import (
TemplateTypeParam,
Token,
Type,
Value,
)
from cxxheaderparser.simple import (
NamespaceScope,
@@ -71,6 +72,61 @@ def test_fn_returns_class():
)
def test_fn_returns_typename():
content = """
typename ns::X fn();
"""
data = parse_string(content, cleandoc=True)
assert data == ParsedData(
namespace=NamespaceScope(
functions=[
Function(
return_type=Type(
typename=PQName(
segments=[
NameSpecifier(name="ns"),
NameSpecifier(name="X"),
],
has_typename=True,
)
),
name=PQName(segments=[NameSpecifier(name="fn")]),
parameters=[],
)
]
)
)
def test_fn_returns_typename_const():
content = """
const typename ns::X fn();
"""
data = parse_string(content, cleandoc=True)
assert data == ParsedData(
namespace=NamespaceScope(
functions=[
Function(
return_type=Type(
typename=PQName(
segments=[
NameSpecifier(name="ns"),
NameSpecifier(name="X"),
],
has_typename=True,
),
const=True,
),
name=PQName(segments=[NameSpecifier(name="fn")]),
parameters=[],
)
]
)
)
def test_fn_pointer_params():
content = """
int fn1(int *);
@@ -194,6 +250,58 @@ def test_fn_array_param():
)
def test_fn_typename_param():
content = """
void MethodA(const mynamespace::SomeObject &x,
typename mynamespace::SomeObject * = 0);
"""
data = parse_string(content, cleandoc=True)
assert data == ParsedData(
namespace=NamespaceScope(
functions=[
Function(
return_type=Type(
typename=PQName(segments=[FundamentalSpecifier(name="void")])
),
name=PQName(segments=[NameSpecifier(name="MethodA")]),
parameters=[
Parameter(
type=Reference(
ref_to=Type(
typename=PQName(
segments=[
NameSpecifier(name="mynamespace"),
NameSpecifier(name="SomeObject"),
]
),
const=True,
)
),
name="x",
),
Parameter(
type=Pointer(
ptr_to=Type(
typename=PQName(
segments=[
NameSpecifier(name="mynamespace"),
NameSpecifier(name="SomeObject"),
],
has_typename=True,
)
)
),
default=Value(tokens=[Token(value="0")]),
),
],
)
]
)
)
def test_fn_weird_refs():
content = """
int aref(int(&x));