[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