Merge pull request #28 from robotpy/fix-final-as-name

Allow using 'final' as a name in some contexts
This commit is contained in:
Dustin Spicuzza 2021-11-26 00:50:37 -05:00 committed by GitHub
commit e750418d08
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 79 additions and 2 deletions

View File

@ -1250,7 +1250,16 @@ class CxxParser:
return parts return parts
_pqname_start_tokens = ( _pqname_start_tokens = (
{"auto", "decltype", "NAME", "operator", "template", "typename", "DBL_COLON"} {
"auto",
"decltype",
"NAME",
"operator",
"template",
"typename",
"DBL_COLON",
"final",
}
| _name_compound_start | _name_compound_start
| _fundamentals | _fundamentals
) )
@ -1463,7 +1472,7 @@ class CxxParser:
self.lex.return_tokens(toks[1:-1]) self.lex.return_tokens(toks[1:-1])
# optional name # optional name
tok = self.lex.token_if("NAME") tok = self.lex.token_if("NAME", "final")
if tok: if tok:
param_name = tok.value param_name = tok.value

View File

@ -1,15 +1,20 @@
# Note: testcases generated via `python -m cxxheaderparser.gentest` # Note: testcases generated via `python -m cxxheaderparser.gentest`
from cxxheaderparser.types import ( from cxxheaderparser.types import (
BaseClass,
ClassDecl,
Function, Function,
FundamentalSpecifier, FundamentalSpecifier,
NameSpecifier, NameSpecifier,
PQName, PQName,
Parameter, Parameter,
Token,
Type, Type,
Value,
Variable, Variable,
) )
from cxxheaderparser.simple import ( from cxxheaderparser.simple import (
ClassScope,
Include, Include,
NamespaceScope, NamespaceScope,
Pragma, Pragma,
@ -168,3 +173,66 @@ def test_comment_eof():
assert data == ParsedData( assert data == ParsedData(
namespace=NamespaceScope(namespaces={"a": NamespaceScope(name="a")}) namespace=NamespaceScope(namespaces={"a": NamespaceScope(name="a")})
) )
def test_final():
content = """
// ok here
int fn(const int final);
// ok here
int final = 2;
// but it's a keyword here
struct B final : A {};
"""
data = parse_string(content, cleandoc=True)
assert data == ParsedData(
namespace=NamespaceScope(
classes=[
ClassScope(
class_decl=ClassDecl(
typename=PQName(
segments=[NameSpecifier(name="B")], classkey="struct"
),
bases=[
BaseClass(
access="public",
typename=PQName(segments=[NameSpecifier(name="A")]),
)
],
final=True,
)
)
],
functions=[
Function(
return_type=Type(
typename=PQName(segments=[FundamentalSpecifier(name="int")])
),
name=PQName(segments=[NameSpecifier(name="fn")]),
parameters=[
Parameter(
type=Type(
typename=PQName(
segments=[FundamentalSpecifier(name="int")]
),
const=True,
),
name="final",
)
],
)
],
variables=[
Variable(
name=PQName(segments=[NameSpecifier(name="final")]),
type=Type(
typename=PQName(segments=[FundamentalSpecifier(name="int")])
),
value=Value(tokens=[Token(value="2")]),
)
],
)
)