Partial merge of trunk progress. Some tests still fail.
[cython.git] / Cython / Compiler / ParseTreeTransforms.py
index 00de70a359adb9046849b946e4e9a49ac91f7a53..a660db1337a90edea8309db24639188cebec3831 100644 (file)
@@ -552,7 +552,7 @@ class PxdPostParse(CythonTransform, SkipDeclarations):
         if isinstance(node, Nodes.CFuncDefNode):
             if u'inline' in node.modifiers and self.scope_type == 'pxd':
                 node.inline_in_pxd = True
-                if node.visibility != 'private':
+                if node.c_visibility != 'private':
                     err = self.ERR_NOGO_WITH_INLINE % node.visibility
                 elif node.api:
                     err = self.ERR_NOGO_WITH_INLINE % 'api'
@@ -1098,7 +1098,7 @@ if VALUE is not None:
             if not lenv.lookup_here(var):   # don't redeclare args
                 type = type_node.analyse_as_type(lenv)
                 if type:
-                    lenv.declare_var(var, type, type_node.pos)
+                    lenv.declare_var(name = var, type = type, pos = type_node.pos)
                 else:
                     error(type_node.pos, "Not a type")
         node.body.analyse_declarations(lenv)
@@ -1227,7 +1227,7 @@ if VALUE is not None:
     def visit_CNameDeclaratorNode(self, node):
         if node.name in self.seen_vars_stack[-1]:
             entry = self.env_stack[-1].lookup(node.name)
-            if (entry is None or entry.visibility != 'extern'
+            if (entry is None or entry.c_visibility != 'extern'
                 and not entry.scope.is_c_class_scope):
                 warning(node.pos, "cdef variable '%s' declared after it is used" % node.name, 2)
         self.visitchildren(node)
@@ -1246,6 +1246,10 @@ if VALUE is not None:
                 template = self.basic_property
         elif entry.visibility == 'readonly':
             template = self.basic_property_ro
+        else:
+            error(entry.pos,
+                  "python methods may not have '%s' Python visibility" %
+                  entry.visibility)
         property = template.substitute({
                 u"ATTR": ExprNodes.AttributeNode(pos=entry.pos,
                                                  obj=ExprNodes.NameNode(pos=entry.pos, name="self"),
@@ -1527,7 +1531,7 @@ class CreateClosureClasses(CythonTransform):
                                                    PyrexTypes.c_void_ptr_type,
                                                    '__pyx_generator_body_t')
         klass.declare_var(pos=pos, name='body', cname='body',
-                          type=body_type, is_cdef=True)
+                          visibility='private', type=body_type, is_cdef=True)
         klass.declare_var(pos=pos, name='is_running', cname='is_running', type=PyrexTypes.c_int_type,
                           is_cdef=True)
         klass.declare_var(pos=pos, name='resume_label', cname='resume_label', type=PyrexTypes.c_int_type,
@@ -1540,22 +1544,26 @@ class CreateClosureClasses(CythonTransform):
                           type=PyrexTypes.py_object_type, is_cdef=True)
 
         import TypeSlots
-        e = klass.declare_pyfunction('send', pos)
+        e = klass.declare_pyfunction(name='send', pos=pos)
         e.func_cname = '__Pyx_Generator_Send'
         e.signature = TypeSlots.binaryfunc
 
-        e = klass.declare_pyfunction('close', pos)
+        e = klass.declare_pyfunction(name='close', pos=pos)
         e.func_cname = '__Pyx_Generator_Close'
         e.signature = TypeSlots.unaryfunc
 
-        e = klass.declare_pyfunction('throw', pos)
+        e = klass.declare_pyfunction(name='throw', pos=pos)
         e.func_cname = '__Pyx_Generator_Throw'
         e.signature = TypeSlots.pyfunction_signature
 
-        e = klass.declare_var('__iter__', PyrexTypes.py_object_type, pos, visibility='public')
+        e = klass.declare_var(
+            name='__iter__', type=PyrexTypes.py_object_type,
+            c_visibility='public', pos=pos)
         e.func_cname = 'PyObject_SelfIter'
 
-        e = klass.declare_var('__next__', PyrexTypes.py_object_type, pos, visibility='public')
+        e = klass.declare_var(
+            name='__next__', type=PyrexTypes.py_object_type,
+            c_visibility='public', pos=pos)
         e.func_cname = '__Pyx_Generator_Next'
 
         self.generator_class = entry.type