mypy: add assertions/logic to ensure that ClassScope/NamespaceScope are correct

This commit is contained in:
Dustin Spicuzza 2022-01-02 21:48:49 -05:00
parent 2eb13496fa
commit b05b1b16c1
2 changed files with 23 additions and 5 deletions

View File

@ -1133,7 +1133,11 @@ class CxxParser:
state = self.state
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
bits = None
default = None
@ -1207,7 +1211,7 @@ class CxxParser:
doxygen=doxygen,
**props,
)
self.visitor.on_class_field(state, f)
self.visitor.on_class_field(class_state, f)
else:
v = Variable(
pqname, dtype, default, doxygen=doxygen, template=template, **props
@ -1703,6 +1707,8 @@ class CxxParser:
params, vararg = self._parse_parameters()
if is_class_block and not is_typedef:
assert isinstance(state, ClassBlockState)
props.update(dict.fromkeys(mods.meths.keys(), True))
method: Method
@ -2111,6 +2117,8 @@ class CxxParser:
if not self.lex.token_if(";"):
raise self._parse_error(None)
assert isinstance(state, ClassBlockState)
fwd = ForwardDecl(
parsed_type.typename,
template,
@ -2283,12 +2291,14 @@ class CxxParser:
fdecl = ForwardDecl(
parsed_type.typename, template, doxygen, access=self._current_access
)
self.state.location = location
state = self.state
state.location = location
if is_friend:
assert isinstance(state, ClassBlockState)
friend = FriendDecl(cls=fdecl)
self.visitor.on_class_friend(self.state, friend)
self.visitor.on_class_friend(state, friend)
else:
self.visitor.on_forward_decl(self.state, fdecl)
self.visitor.on_forward_decl(state, fdecl)
return True
tok = self.lex.token_if_in_set(self._class_enum_stage2)

View File

@ -236,6 +236,8 @@ class SimpleCxxVisitor:
parent_ns.namespaces[name] = ns
parent_ns = ns
assert ns is not None
self.block = ns
self.namespace = ns
@ -247,15 +249,18 @@ class SimpleCxxVisitor:
self.block.forward_decls.append(fdecl)
def on_variable(self, state: State, v: Variable) -> None:
assert isinstance(self.block, NamespaceScope)
self.block.variables.append(v)
def on_function(self, state: State, fn: Function) -> None:
assert isinstance(self.block, NamespaceScope)
self.block.functions.append(fn)
def on_typedef(self, state: State, typedef: Typedef) -> None:
self.block.typedefs.append(typedef)
def on_using_namespace(self, state: State, namespace: typing.List[str]) -> None:
assert isinstance(self.block, NamespaceScope)
ns = UsingNamespace("::".join(namespace))
self.block.using_ns.append(ns)
@ -283,12 +288,15 @@ class SimpleCxxVisitor:
self.block = block
def on_class_field(self, state: State, f: Field) -> None:
assert isinstance(self.block, ClassScope)
self.block.fields.append(f)
def on_class_method(self, state: ClassBlockState, method: Method) -> None:
assert isinstance(self.block, ClassScope)
self.block.methods.append(method)
def on_class_friend(self, state: ClassBlockState, friend: FriendDecl) -> None:
assert isinstance(self.block, ClassScope)
self.block.friends.append(friend)
def on_class_end(self, state: ClassBlockState) -> None: