Correctly parse constructor implementations outside of a class
- Fixes #32
This commit is contained in:
parent
15e4e0b879
commit
919e35e45f
@ -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
|
||||||
|
@ -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,
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user