[Jython-checkins] jython: Visit class decorators when visiting class def in scopes compilation

jim.baker jython-checkins at python.org
Tue Jan 6 23:52:43 CET 2015


https://hg.python.org/jython/rev/56b94dc065ff
changeset:   7513:56b94dc065ff
user:        Jim Baker <jim.baker at rackspace.com>
date:        Tue Jan 06 15:52:00 2015 -0700
summary:
  Visit class decorators when visiting class def in scopes compilation

Fixes http://bugs.jython.org/issue2232

files:
  Lib/test/test_decorators_jy.py              |  34 ++++++++++
  src/org/python/compiler/ScopesCompiler.java |   4 +
  2 files changed, 38 insertions(+), 0 deletions(-)


diff --git a/Lib/test/test_decorators_jy.py b/Lib/test/test_decorators_jy.py
--- a/Lib/test/test_decorators_jy.py
+++ b/Lib/test/test_decorators_jy.py
@@ -5,6 +5,21 @@
 from test import test_support
 import unittest
 
+
+def funcattrs(**kwds):
+    def decorate(func):
+        func.__dict__.update(kwds)
+        return func
+    return decorate
+
+def classattrs(**kwds):
+    def decorate(cls):
+        for k, v in kwds.iteritems():
+            setattr(cls, k, v)
+        return cls
+    return decorate
+
+
 class TestDecorators(unittest.TestCase):
 
     def test_lookup_order(self):
@@ -15,6 +30,25 @@
                 return self.foo
         self.assertEqual(Foo().property, 'bar')
 
+    def test_lambda_in_class_decorator(self):
+        # Tests fix for http://bugs.jython.org/issue2232
+        @classattrs(abc=42, xyz=lambda self: 47)
+        class C(object):
+            pass
+
+        c = C()
+        self.assertEqual(c.abc, 42)
+        self.assertEqual(c.xyz(), 47)
+
+    def test_lambda_in_function_decorator(self):
+        class C(object):
+            @funcattrs(abc=1, xyz=lambda: 47)
+            def foo(self): return 42
+
+        self.assertEqual(C().foo(), 42)
+        self.assertEqual(C().foo.abc, 1)
+        self.assertEqual(C().foo.xyz(), 47)
+
 
 def test_main():
     test_support.run_unittest(TestDecorators)
diff --git a/src/org/python/compiler/ScopesCompiler.java b/src/org/python/compiler/ScopesCompiler.java
--- a/src/org/python/compiler/ScopesCompiler.java
+++ b/src/org/python/compiler/ScopesCompiler.java
@@ -251,6 +251,10 @@
 
     @Override
     public Object visitClassDef(ClassDef node) throws Exception {
+        List<expr> decs = node.getInternalDecorator_list();
+        for (int i = decs.size() - 1; i >= 0; i--) {
+            visit(decs.get(i));
+        }
         def(node.getInternalName());
         int n = node.getInternalBases().size();
         for (int i = 0; i < n; i++) {

-- 
Repository URL: https://hg.python.org/jython


More information about the Jython-checkins mailing list