# attributes [CVarDefNode] or None
# entry Entry
# base_classes [string]
- # namespace string or None
def analyse_declarations(self, env):
scope = None
base_class_types.append(base_class_entry.type)
self.entry = env.declare_cpp_class(
self.name, "cppclass", scope, 0, self.pos,
- self.cname, base_class_types, self.namespace, visibility = self.visibility)
+ self.cname, base_class_types, visibility = self.visibility)
if self.attributes is not None:
if self.in_pxd and not env.in_cinclude:
self.entry.defined_in_pxd = 1
error(s.position(), "Empty declarator")
name = ""
cname = None
+ if cname is None and ctx.namespace is not None:
+ cname = ctx.namespace + "::" + name
result = Nodes.CNameDeclaratorNode(pos,
name = name, cname = cname, default = rhs)
result.calling_convention = calling_convention
_, include_file = p_string_literal(s)
if s.systring == "namespace":
s.next()
- ctx.namespace = p_ident(s)
+ ctx.namespace = p_dotted_name(s, as_allowed=False)[2].replace('.', '::')
ctx = ctx(cdef_flag = 1, visibility = 'extern')
if p_nogil(s):
ctx.nogil = 1
name = s.systring
s.next()
cname = p_opt_cname(s)
+ if cname is None and ctx.namespace is not None:
+ cname = ctx.namespace + "::" + name
else:
name = None
cname = None
s.next()
name = p_ident(s)
cname = p_opt_cname(s)
+ if cname is None and ctx.namespace is not None:
+ cname = ctx.namespace + "::" + name
attributes = None
if s.sy == ':':
s.next()
s.next()
module_path = []
class_name = p_ident(s)
+ cname = p_opt_cname(s)
+ if cname is None and ctx.namespace is not None:
+ cname = ctx.namespace + "::" + class_name
if s.sy == '.':
error(pos, "Qualified class name not allowed C++ class")
base_classes = []
objstruct_name = None
typeobj_name = None
- base_class_module = None
- base_class_name = None
if s.sy == '(':
base_class = True
while (base_class):
s.expect_newline("Syntax error in C++ class definition")
return Nodes.CppClassNode(pos,
name = class_name,
- cname = None,
+ cname = cname,
base_classes = base_classes,
- namespace = ctx.namespace,
visibility = ctx.visibility,
in_pxd = ctx.level == 'module_pxd',
attributes = attributes)
is_cpp_class = 1
has_attributes = 1
base_classes = []
- namespace = None
-
- def __init__(self, name, kind, scope, typedef_flag, cname, base_classes,
- namespace = None, packed=False):
+
+ def __init__(self, name, kind, scope, typedef_flag, cname, base_classes, packed=False):
self.name = name
self.cname = cname
self.kind = kind
self._convert_code = None
self.packed = packed
self.base_classes = base_classes
- self.namespace = namespace
def declaration_code(self, entity_code, for_display = 0, dll_linkage = None, pyrex = 0):
if for_display or pyrex:
name = self.name
else:
name = self.cname
- if self.namespace is not None:
- name = "%s::%s" % (self.namespace.replace('.', '::'), name)
return "%s %s" % (name, entity_code)
def is_subclass(self, other_type):
return entry
def declare_cpp_class(self, name, kind, scope,
- typedef_flag, pos, cname = None, base_classes = [], namespace = None,
+ typedef_flag, pos, cname = None, base_classes = [],
visibility = 'extern', packed = False):
if visibility != 'extern':
error(pos, "C++ classes may only be extern")
entry = self.lookup(name)
if not entry:
type = PyrexTypes.CppClassType(
- name, kind, scope, typedef_flag, cname, base_classes, namespace, packed)
+ name, kind, scope, typedef_flag, cname, base_classes, packed)
entry = self.declare_type(name, type, pos, cname,
visibility = visibility, defining = scope is not None)
else: