Correctly parse constructor implementations outside of a class

- Fixes #32
This commit is contained in:
Dustin Spicuzza 2022-12-08 02:00:05 -05:00
parent 15e4e0b879
commit 919e35e45f
2 changed files with 38 additions and 4 deletions

View File

@ -2131,12 +2131,22 @@ class CxxParser:
tok = self.lex.token_if("(") tok = self.lex.token_if("(")
if tok: if tok:
# Check to see if this is a constructor/destructor dsegments: typing.List[PQNameSegment] = []
if isinstance(state, ClassBlockState) and isinstance(dtype, Type): if isinstance(dtype, Type):
dsegments = dtype.typename.segments dsegments = dtype.typename.segments
if not is_friend: # Check to see if this is a constructor/destructor by matching
# the method name to the class name
is_class_block = isinstance(state, ClassBlockState)
if (is_class_block or len(dsegments) > 1) and isinstance(dtype, Type):
if not is_class_block:
# must be an instance of a class
cls_name = getattr(dsegments[-2], "name", None)
elif not is_friend:
assert isinstance(state, ClassBlockState)
# class name to match against is this class # class name to match against is this class
cls_name = getattr( cls_name = getattr(
state.class_decl.typename.segments[-1], "name", None state.class_decl.typename.segments[-1], "name", None

View File

@ -3236,3 +3236,27 @@ def test_method_outside_class() -> None:
] ]
) )
) )
def test_constructor_outside_class() -> None:
content = """
inline foo::foo() {}
"""
data = parse_string(content, cleandoc=True)
assert data == ParsedData(
namespace=NamespaceScope(
method_impls=[
Method(
return_type=None,
name=PQName(
segments=[NameSpecifier(name="foo"), NameSpecifier(name="foo")]
),
parameters=[],
inline=True,
has_body=True,
constructor=True,
)
]
)
)