mypy: add assertions/logic to ensure that ClassScope/NamespaceScope are correct
This commit is contained in:
@@ -1133,7 +1133,11 @@ class CxxParser:
|
|||||||
|
|
||||||
state = self.state
|
state = self.state
|
||||||
state.location = location
|
state.location = location
|
||||||
is_class_block = isinstance(state, ClassBlockState)
|
if isinstance(state, ClassBlockState):
|
||||||
|
is_class_block = True
|
||||||
|
class_state = state
|
||||||
|
else:
|
||||||
|
is_class_block = False
|
||||||
name = None
|
name = None
|
||||||
bits = None
|
bits = None
|
||||||
default = None
|
default = None
|
||||||
@@ -1207,7 +1211,7 @@ class CxxParser:
|
|||||||
doxygen=doxygen,
|
doxygen=doxygen,
|
||||||
**props,
|
**props,
|
||||||
)
|
)
|
||||||
self.visitor.on_class_field(state, f)
|
self.visitor.on_class_field(class_state, f)
|
||||||
else:
|
else:
|
||||||
v = Variable(
|
v = Variable(
|
||||||
pqname, dtype, default, doxygen=doxygen, template=template, **props
|
pqname, dtype, default, doxygen=doxygen, template=template, **props
|
||||||
@@ -1703,6 +1707,8 @@ class CxxParser:
|
|||||||
params, vararg = self._parse_parameters()
|
params, vararg = self._parse_parameters()
|
||||||
|
|
||||||
if is_class_block and not is_typedef:
|
if is_class_block and not is_typedef:
|
||||||
|
assert isinstance(state, ClassBlockState)
|
||||||
|
|
||||||
props.update(dict.fromkeys(mods.meths.keys(), True))
|
props.update(dict.fromkeys(mods.meths.keys(), True))
|
||||||
|
|
||||||
method: Method
|
method: Method
|
||||||
@@ -2111,6 +2117,8 @@ class CxxParser:
|
|||||||
if not self.lex.token_if(";"):
|
if not self.lex.token_if(";"):
|
||||||
raise self._parse_error(None)
|
raise self._parse_error(None)
|
||||||
|
|
||||||
|
assert isinstance(state, ClassBlockState)
|
||||||
|
|
||||||
fwd = ForwardDecl(
|
fwd = ForwardDecl(
|
||||||
parsed_type.typename,
|
parsed_type.typename,
|
||||||
template,
|
template,
|
||||||
@@ -2283,12 +2291,14 @@ class CxxParser:
|
|||||||
fdecl = ForwardDecl(
|
fdecl = ForwardDecl(
|
||||||
parsed_type.typename, template, doxygen, access=self._current_access
|
parsed_type.typename, template, doxygen, access=self._current_access
|
||||||
)
|
)
|
||||||
self.state.location = location
|
state = self.state
|
||||||
|
state.location = location
|
||||||
if is_friend:
|
if is_friend:
|
||||||
|
assert isinstance(state, ClassBlockState)
|
||||||
friend = FriendDecl(cls=fdecl)
|
friend = FriendDecl(cls=fdecl)
|
||||||
self.visitor.on_class_friend(self.state, friend)
|
self.visitor.on_class_friend(state, friend)
|
||||||
else:
|
else:
|
||||||
self.visitor.on_forward_decl(self.state, fdecl)
|
self.visitor.on_forward_decl(state, fdecl)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
tok = self.lex.token_if_in_set(self._class_enum_stage2)
|
tok = self.lex.token_if_in_set(self._class_enum_stage2)
|
||||||
|
|||||||
@@ -236,6 +236,8 @@ class SimpleCxxVisitor:
|
|||||||
parent_ns.namespaces[name] = ns
|
parent_ns.namespaces[name] = ns
|
||||||
parent_ns = ns
|
parent_ns = ns
|
||||||
|
|
||||||
|
assert ns is not None
|
||||||
|
|
||||||
self.block = ns
|
self.block = ns
|
||||||
self.namespace = ns
|
self.namespace = ns
|
||||||
|
|
||||||
@@ -247,15 +249,18 @@ class SimpleCxxVisitor:
|
|||||||
self.block.forward_decls.append(fdecl)
|
self.block.forward_decls.append(fdecl)
|
||||||
|
|
||||||
def on_variable(self, state: State, v: Variable) -> None:
|
def on_variable(self, state: State, v: Variable) -> None:
|
||||||
|
assert isinstance(self.block, NamespaceScope)
|
||||||
self.block.variables.append(v)
|
self.block.variables.append(v)
|
||||||
|
|
||||||
def on_function(self, state: State, fn: Function) -> None:
|
def on_function(self, state: State, fn: Function) -> None:
|
||||||
|
assert isinstance(self.block, NamespaceScope)
|
||||||
self.block.functions.append(fn)
|
self.block.functions.append(fn)
|
||||||
|
|
||||||
def on_typedef(self, state: State, typedef: Typedef) -> None:
|
def on_typedef(self, state: State, typedef: Typedef) -> None:
|
||||||
self.block.typedefs.append(typedef)
|
self.block.typedefs.append(typedef)
|
||||||
|
|
||||||
def on_using_namespace(self, state: State, namespace: typing.List[str]) -> None:
|
def on_using_namespace(self, state: State, namespace: typing.List[str]) -> None:
|
||||||
|
assert isinstance(self.block, NamespaceScope)
|
||||||
ns = UsingNamespace("::".join(namespace))
|
ns = UsingNamespace("::".join(namespace))
|
||||||
self.block.using_ns.append(ns)
|
self.block.using_ns.append(ns)
|
||||||
|
|
||||||
@@ -283,12 +288,15 @@ class SimpleCxxVisitor:
|
|||||||
self.block = block
|
self.block = block
|
||||||
|
|
||||||
def on_class_field(self, state: State, f: Field) -> None:
|
def on_class_field(self, state: State, f: Field) -> None:
|
||||||
|
assert isinstance(self.block, ClassScope)
|
||||||
self.block.fields.append(f)
|
self.block.fields.append(f)
|
||||||
|
|
||||||
def on_class_method(self, state: ClassBlockState, method: Method) -> None:
|
def on_class_method(self, state: ClassBlockState, method: Method) -> None:
|
||||||
|
assert isinstance(self.block, ClassScope)
|
||||||
self.block.methods.append(method)
|
self.block.methods.append(method)
|
||||||
|
|
||||||
def on_class_friend(self, state: ClassBlockState, friend: FriendDecl) -> None:
|
def on_class_friend(self, state: ClassBlockState, friend: FriendDecl) -> None:
|
||||||
|
assert isinstance(self.block, ClassScope)
|
||||||
self.block.friends.append(friend)
|
self.block.friends.append(friend)
|
||||||
|
|
||||||
def on_class_end(self, state: ClassBlockState) -> None:
|
def on_class_end(self, state: ClassBlockState) -> None:
|
||||||
|
|||||||
Reference in New Issue
Block a user