Commit 8e6ee78e authored by Brett Cannon's avatar Brett Cannon

Flush out support for ``class B(): pass`` syntax by adding support to the

'parser' module and 'compiler' package.

Closes patch #1176012.  Thanks logistix.
parent 9dcad2dd
...@@ -280,12 +280,14 @@ class Transformer: ...@@ -280,12 +280,14 @@ class Transformer:
return Lambda(names, defaults, flags, code, lineno=nodelist[1][2]) return Lambda(names, defaults, flags, code, lineno=nodelist[1][2])
def classdef(self, nodelist): def classdef(self, nodelist):
# classdef: 'class' NAME ['(' testlist ')'] ':' suite # classdef: 'class' NAME ['(' [testlist] ')'] ':' suite
name = nodelist[1][1] name = nodelist[1][1]
doc = self.get_docstring(nodelist[-1]) doc = self.get_docstring(nodelist[-1])
if nodelist[2][0] == token.COLON: if nodelist[2][0] == token.COLON:
bases = [] bases = []
elif nodelist[3][0] == token.RPAR:
bases = []
else: else:
bases = self.com_bases(nodelist[3]) bases = self.com_bases(nodelist[3])
......
...@@ -33,6 +33,9 @@ class CompilerTest(unittest.TestCase): ...@@ -33,6 +33,9 @@ class CompilerTest(unittest.TestCase):
else: else:
compiler.compile(buf, basename, "exec") compiler.compile(buf, basename, "exec")
def testNewClassSyntax(self):
compiler.compile("class foo():pass\n\n","<string>","exec")
def testLineNo(self): def testLineNo(self):
# Test that all nodes except Module have a correct lineno attribute. # Test that all nodes except Module have a correct lineno attribute.
filename = __file__ filename = __file__
......
...@@ -127,6 +127,9 @@ class RoundtripLegalSyntaxTestCase(unittest.TestCase): ...@@ -127,6 +127,9 @@ class RoundtripLegalSyntaxTestCase(unittest.TestCase):
self.check_suite("@funcattrs()\n" self.check_suite("@funcattrs()\n"
"def f(): pass") "def f(): pass")
def test_class_defs(self):
self.check_suite("class foo():pass")
def test_import_from_statement(self): def test_import_from_statement(self):
self.check_suite("from sys.path import *") self.check_suite("from sys.path import *")
self.check_suite("from sys.path import dirname") self.check_suite("from sys.path import dirname")
......
...@@ -24,7 +24,9 @@ Core and builtins ...@@ -24,7 +24,9 @@ Core and builtins
- Added two new builtins, any() and all(). - Added two new builtins, any() and all().
- Defining a class with empty parentheses is now allowed - 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. - Patch #1115086: Support PY_LONGLONG in structmember.
......
...@@ -947,7 +947,8 @@ static int ...@@ -947,7 +947,8 @@ static int
validate_class(node *tree) validate_class(node *tree)
{ {
int nch = NCH(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) { if (res) {
res = (validate_name(CHILD(tree, 0), "class") res = (validate_name(CHILD(tree, 0), "class")
...@@ -955,12 +956,20 @@ validate_class(node *tree) ...@@ -955,12 +956,20 @@ validate_class(node *tree)
&& validate_colon(CHILD(tree, nch - 2)) && validate_colon(CHILD(tree, nch - 2))
&& validate_suite(CHILD(tree, nch - 1))); && validate_suite(CHILD(tree, nch - 1)));
} }
else else {
(void) validate_numnodes(tree, 4, "class"); (void) validate_numnodes(tree, 4, "class");
if (res && (nch == 7)) { }
res = (validate_lparen(CHILD(tree, 2))
&& validate_testlist(CHILD(tree, 3)) if (res) {
&& validate_rparen(CHILD(tree, 4))); 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); return (res);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment