From f4189916e366045a44755d453c89d30e5006f84f Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Sat, 9 Apr 2005 02:30:16 +0000 Subject: [PATCH] Flush out support for ``class B(): pass`` syntax by adding support to the 'parser' module and 'compiler' package. Closes patch #1176012. Thanks logistix. --- Lib/compiler/transformer.py | 4 +++- Lib/test/test_compiler.py | 3 +++ Lib/test/test_parser.py | 3 +++ Misc/NEWS | 4 +++- Modules/parsermodule.c | 21 +++++++++++++++------ 5 files changed, 27 insertions(+), 8 deletions(-) diff --git a/Lib/compiler/transformer.py b/Lib/compiler/transformer.py index 0c6d1483f4b..dfa25b8425c 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 9976a47cf38..d9a3cb8ee91 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","","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 0f8c1d0d0ab..bd81aca2170 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 e891cefbb0f..ae0216117fe 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 eb23b585724..63b2cd784f4 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); }