# declarators [CDeclaratorNode]
# in_pxd boolean
# api boolean
- # properties [entry]
# decorators [cython.locals(...)] or None
# directive_locals { string : NameNode } locals defined by cython.locals(...)
child_attrs = ["base_type", "declarators"]
- properties = ()
decorators = None
directive_locals = {}
# a property; made in AnalyseDeclarationsTransform).
if (dest_scope.is_c_class_scope
and self.visibility in ('public', 'readonly')):
- self.properties = []
need_property = True
else:
need_property = False
"Only 'extern' C variable declaration allowed in .pxd file")
entry = dest_scope.declare_var(name, type, declarator.pos,
cname = cname, visibility = visibility, is_cdef = 1)
- if need_property:
- self.properties.append(entry)
+ entry.needs_property = need_property
class CStructOrUnionDefNode(StatNode):
self.visitchildren(node)
self.env_stack.pop()
return node
+
+ def visit_CClassDefNode(self, node):
+ node = self.visit_ClassDefNode(node)
+ if node.scope and node.scope.implemented:
+ stats = []
+ for entry in node.scope.var_entries:
+ if entry.needs_property:
+ property = self.create_Property(entry)
+ property.analyse_declarations(node.scope)
+ self.visit(property)
+ stats.append(property)
+ if stats:
+ node.body.stats += stats
+ return node
def visit_FuncDefNode(self, node):
self.seen_vars_stack.append(set())
return node
def visit_CVarDefNode(self, node):
-
# to ensure all CNameDeclaratorNodes are visited.
self.visitchildren(node)
-
- if node.properties:
- stats = []
- for entry in node.properties:
- property = self.create_Property(entry)
- property.analyse_declarations(node.dest_scope)
- self.visit(property)
- stats.append(property)
- return StatListNode(pos=node.pos, stats=stats)
- else:
- return None
+ return None
def create_Property(self, entry):
if entry.visibility == 'public':