allow decorators on classes in the parser, just disable them on cdef classes later on
authorStefan Behnel <scoder@users.berlios.de>
Sat, 30 Oct 2010 12:39:54 +0000 (14:39 +0200)
committerStefan Behnel <scoder@users.berlios.de>
Sat, 30 Oct 2010 12:39:54 +0000 (14:39 +0200)
Cython/Compiler/ParseTreeTransforms.py
Cython/Compiler/Parsing.py

index 17bfb3f66ce8fdc7be4354fe69cfcff7a191b0e6..9e16924715c2e1239cde30eb6dd7bee00fba1391 100644 (file)
@@ -929,9 +929,8 @@ class DecoratorTransform(CythonTransform, SkipDeclarations):
         return self._handle_decorators(
             func_node, func_node.name)
 
-    def _visit_CClassDefNode(self, class_node):
-        # This doesn't currently work, so it's disabled (also in the
-        # parser).
+    def visit_CClassDefNode(self, class_node):
+        # This doesn't currently work, so it's disabled.
         #
         # Problem: assignments to cdef class names do not work.  They
         # would require an additional check anyway, as the extension
@@ -941,8 +940,11 @@ class DecoratorTransform(CythonTransform, SkipDeclarations):
         self.visitchildren(class_node)
         if not class_node.decorators:
             return class_node
-        return self._handle_decorators(
-            class_node, class_node.class_name)
+        error(class_node.pos,
+              "Decorators not allowed on cdef classes (used on type '%s')" % class_node.class_name)
+        return class_node
+        #return self._handle_decorators(
+        #    class_node, class_node.class_name)
 
     def visit_ClassDefNode(self, class_node):
         self.visitchildren(class_node)
index 4903bd6ba762cf36b11b898470db118b6ac1c87e..8df5ca102f997bd7d48cecd0ac6e6f59b93cafca 100644 (file)
@@ -1681,8 +1681,8 @@ def p_statement(s, ctx, first_statement = 0):
         s.level = ctx.level
         node = p_cdef_statement(s, ctx(overridable = overridable))
         if decorators is not None:
-            if not isinstance(node, (Nodes.CFuncDefNode, Nodes.CVarDefNode)):
-                s.error("Decorators can only be followed by functions or Python classes")
+            if not isinstance(node, (Nodes.CFuncDefNode, Nodes.CVarDefNode, Nodes.CClassDefNode)):
+                s.error("Decorators can only be followed by functions or classes")
             node.decorators = decorators
         return node
     else: