summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrett Cannon <bcannon@gmail.com>2005-04-09 02:30:16 (GMT)
committerBrett Cannon <bcannon@gmail.com>2005-04-09 02:30:16 (GMT)
commitf4189916e366045a44755d453c89d30e5006f84f (patch)
treefb55a279fc5275a7403f523fb546f19baa4c6e17
parent4ebc7e3bd0a3ed0a56b1a0e5816127c18d2ae8ae (diff)
downloadcpython-f4189916e366045a44755d453c89d30e5006f84f.zip
cpython-f4189916e366045a44755d453c89d30e5006f84f.tar.gz
cpython-f4189916e366045a44755d453c89d30e5006f84f.tar.bz2
Flush out support for ``class B(): pass`` syntax by adding support to the
'parser' module and 'compiler' package. Closes patch #1176012. Thanks logistix.
-rw-r--r--Lib/compiler/transformer.py4
-rw-r--r--Lib/test/test_compiler.py3
-rw-r--r--Lib/test/test_parser.py3
-rw-r--r--Misc/NEWS4
-rw-r--r--Modules/parsermodule.c21
5 files changed, 27 insertions, 8 deletions
diff --git a/Lib/compiler/transformer.py b/Lib/compiler/transformer.py
index 0c6d148..dfa25b8 100644
--- a/Lib/compiler/transformer.py
+++ b/Lib/compiler/transformer.py
@@ -280,12 +280,14 @@ class Transformer:
return Lambda(names, defaults, flags, code, lineno=nodelist[1][2])
def classdef(self, nodelist):
- # classdef: 'class' NAME ['(' testlist ')'] ':' suite
+ # classdef: 'class' NAME ['(' [testlist] ')'] ':' suite
name = nodelist[1][1]
doc = self.get_docstring(nodelist[-1])
if nodelist[2][0] == token.COLON:
bases = []
+ elif nodelist[3][0] == token.RPAR:
+ bases = []
else:
bases = self.com_bases(nodelist[3])
diff --git a/Lib/test/test_compiler.py b/Lib/test/test_compiler.py
index 9976a47..d9a3cb8 100644
--- a/Lib/test/test_compiler.py
+++ b/Lib/test/test_compiler.py
@@ -33,6 +33,9 @@ class CompilerTest(unittest.TestCase):
else:
compiler.compile(buf, basename, "exec")
+ def testNewClassSyntax(self):
+ compiler.compile("class foo():pass\n\n","<string>","exec")
+
def testLineNo(self):
# Test that all nodes except Module have a correct lineno attribute.
filename = __file__
diff --git a/Lib/test/test_parser.py b/Lib/test/test_parser.py
index 0f8c1d0..bd81aca 100644
--- a/Lib/test/test_parser.py
+++ b/Lib/test/test_parser.py
@@ -127,6 +127,9 @@ class RoundtripLegalSyntaxTestCase(unittest.TestCase):
self.check_suite("@funcattrs()\n"
"def f(): pass")
+ def test_class_defs(self):
+ self.check_suite("class foo():pass")
+
def test_import_from_statement(self):
self.check_suite("from sys.path import *")
self.check_suite("from sys.path import dirname")
diff --git a/Misc/NEWS b/Misc/NEWS
index e891cef..ae02161 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -24,7 +24,9 @@ Core and builtins
- Added two new builtins, any() and all().
- Defining a class with empty parentheses is now allowed
- (e.g., ``class C(): pass`` is no longer a syntax error)
+ (e.g., ``class C(): pass`` is no longer a syntax error).
+ Patch #1176012 added support to the 'parser' module and 'compiler' package
+ (thanks to logistix for that added support).
- Patch #1115086: Support PY_LONGLONG in structmember.
diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c
index eb23b58..63b2cd7 100644
--- a/Modules/parsermodule.c
+++ b/Modules/parsermodule.c
@@ -947,7 +947,8 @@ static int
validate_class(node *tree)
{
int nch = NCH(tree);
- int res = validate_ntype(tree, classdef) && ((nch == 4) || (nch == 7));
+ int res = (validate_ntype(tree, classdef) &&
+ ((nch == 4) || (nch == 6) || (nch == 7)));
if (res) {
res = (validate_name(CHILD(tree, 0), "class")
@@ -955,12 +956,20 @@ validate_class(node *tree)
&& validate_colon(CHILD(tree, nch - 2))
&& validate_suite(CHILD(tree, nch - 1)));
}
- else
+ else {
(void) validate_numnodes(tree, 4, "class");
- if (res && (nch == 7)) {
- res = (validate_lparen(CHILD(tree, 2))
- && validate_testlist(CHILD(tree, 3))
- && validate_rparen(CHILD(tree, 4)));
+ }
+
+ if (res) {
+ if (nch == 7) {
+ res = ((validate_lparen(CHILD(tree, 2)) &&
+ validate_testlist(CHILD(tree, 3)) &&
+ validate_rparen(CHILD(tree, 4))));
+ }
+ else if (nch == 6) {
+ res = (validate_lparen(CHILD(tree,2)) &&
+ validate_rparen(CHILD(tree,3)));
+ }
}
return (res);
}