Commit 1d5d18ff authored by Robert Bradshaw's avatar Robert Bradshaw

Hierarchical special cython module namespaces.

parent f53e00e3
...@@ -2921,6 +2921,9 @@ class AttributeNode(ExprNode): ...@@ -2921,6 +2921,9 @@ class AttributeNode(ExprNode):
def as_cython_attribute(self): def as_cython_attribute(self):
if isinstance(self.obj, NameNode) and self.obj.is_cython_module: if isinstance(self.obj, NameNode) and self.obj.is_cython_module:
return self.attribute return self.attribute
cy = self.obj.as_cython_attribute()
if cy:
return "%s.%s" % (cy, self.attribute)
def coerce_to(self, dst_type, env): def coerce_to(self, dst_type, env):
# If coercing to a generic pyobject and this is a cpdef function # If coercing to a generic pyobject and this is a cpdef function
......
...@@ -377,18 +377,32 @@ class InterpretCompilerDirectives(CythonTransform, SkipDeclarations): ...@@ -377,18 +377,32 @@ class InterpretCompilerDirectives(CythonTransform, SkipDeclarations):
else: else:
modname = u"cython" modname = u"cython"
self.cython_module_names.add(modname) self.cython_module_names.add(modname)
elif node.module_name.startswith(u"cython."):
if node.as_name:
modname = node.as_name
else:
modname = u"cython"
self.directive_names[modname] = node.module_name[7:]
else:
return node return node
def visit_FromCImportStatNode(self, node): def visit_FromCImportStatNode(self, node):
if node.module_name == u"cython": if node.module_name.startswith(u"cython."):
is_cython_module = True
submodule = node.module_name[7:] + u"."
elif node.module_name == u"cython":
is_cython_module = True
submodule = u""
if is_cython_module:
newimp = [] newimp = []
for pos, name, as_name, kind in node.imported_names: for pos, name, as_name, kind in node.imported_names:
if (name in Options.directive_types or full_name = submodule + name
name in self.special_methods or if (full_name in Options.directive_types or
PyrexTypes.parse_basic_type(name)): full_name in self.special_methods or
PyrexTypes.parse_basic_type(full_name)):
if as_name is None: if as_name is None:
as_name = name as_name = full_name
self.directive_names[as_name] = name self.directive_names[as_name] = full_name
if kind is not None: if kind is not None:
self.context.nonfatal_error(PostParseError(pos, self.context.nonfatal_error(PostParseError(pos,
"Compiler directive imports must be plain imports")) "Compiler directive imports must be plain imports"))
...@@ -400,13 +414,20 @@ class InterpretCompilerDirectives(CythonTransform, SkipDeclarations): ...@@ -400,13 +414,20 @@ class InterpretCompilerDirectives(CythonTransform, SkipDeclarations):
return node return node
def visit_FromImportStatNode(self, node): def visit_FromImportStatNode(self, node):
if node.module.module_name.value == u"cython": if node.module.module_name.value.startswith(u"cython."):
is_cython_module = True
submodule = node.module.module_name.value[7:] + u"."
elif node.module.module_name.value == u"cython":
is_cython_module = True
submodule = u""
if is_cython_module:
newimp = [] newimp = []
for name, name_node in node.items: for name, name_node in node.items:
if (name in Options.directive_types or full_name = submodule + name
name in self.special_methods or if (full_name in Options.directive_types or
PyrexTypes.parse_basic_type(name)): full_name in self.special_methods or
self.directive_names[name_node.name] = name PyrexTypes.parse_basic_type(full_name)):
self.directive_names[name_node.name] = full_name
else: else:
newimp.append((name, name_node)) newimp.append((name, name_node))
if not newimp: if not newimp:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment