From: Robert Bradshaw Date: Wed, 3 Feb 2010 22:33:31 +0000 (-0800) Subject: Hierarchical special cython module namespaces. X-Git-Tag: 0.13.beta0~353^2~5 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=1d5d18ff790150175ad6925a6282e0c5351b7550;p=cython.git Hierarchical special cython module namespaces. --- diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index 752d5876..bcaac218 100755 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -2921,6 +2921,9 @@ class AttributeNode(ExprNode): def as_cython_attribute(self): if isinstance(self.obj, NameNode) and self.obj.is_cython_module: return self.attribute + cy = self.obj.as_cython_attribute() + if cy: + return "%s.%s" % (cy, self.attribute) def coerce_to(self, dst_type, env): # If coercing to a generic pyobject and this is a cpdef function diff --git a/Cython/Compiler/ParseTreeTransforms.py b/Cython/Compiler/ParseTreeTransforms.py index f8da55b0..16ee6de8 100644 --- a/Cython/Compiler/ParseTreeTransforms.py +++ b/Cython/Compiler/ParseTreeTransforms.py @@ -377,18 +377,32 @@ class InterpretCompilerDirectives(CythonTransform, SkipDeclarations): else: modname = u"cython" self.cython_module_names.add(modname) - return node + 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 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 = [] for pos, name, as_name, kind in node.imported_names: - if (name in Options.directive_types or - name in self.special_methods or - PyrexTypes.parse_basic_type(name)): + full_name = submodule + name + if (full_name in Options.directive_types or + full_name in self.special_methods or + PyrexTypes.parse_basic_type(full_name)): if as_name is None: - as_name = name - self.directive_names[as_name] = name + as_name = full_name + self.directive_names[as_name] = full_name if kind is not None: self.context.nonfatal_error(PostParseError(pos, "Compiler directive imports must be plain imports")) @@ -400,13 +414,20 @@ class InterpretCompilerDirectives(CythonTransform, SkipDeclarations): return 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 = [] for name, name_node in node.items: - if (name in Options.directive_types or - name in self.special_methods or - PyrexTypes.parse_basic_type(name)): - self.directive_names[name_node.name] = name + full_name = submodule + name + if (full_name in Options.directive_types or + full_name in self.special_methods or + PyrexTypes.parse_basic_type(full_name)): + self.directive_names[name_node.name] = full_name else: newimp.append((name, name_node)) if not newimp: