make sure to give a 'as' and 'with' parser warning even after import statements #3936

This commit is contained in:
Benjamin Peterson 2008-09-25 20:46:05 +00:00
parent 8e97ea9c6b
commit d1c7d07d67
3 changed files with 52 additions and 13 deletions

View File

@ -9,6 +9,7 @@ __email__ = "mbland at acm dot org"
import sys import sys
import unittest import unittest
import StringIO
from collections import deque from collections import deque
from contextlib import GeneratorContextManager, contextmanager from contextlib import GeneratorContextManager, contextmanager
from test.test_support import run_unittest from test.test_support import run_unittest
@ -625,12 +626,44 @@ class ExitSwallowsExceptionTestCase(unittest.TestCase):
self.fail("ZeroDivisionError should have been raised") self.fail("ZeroDivisionError should have been raised")
class NewKeywordsWarningTestCase(unittest.TestCase):
def check(self, code, word=None):
save = sys.stderr
sys.stderr = stream = StringIO.StringIO()
try:
compile(code, "<string>", "exec", 0, True)
finally:
sys.stderr = save
if word:
self.assert_("Warning: %r will become a reserved keyword in Python 2.6" % word
in stream.getvalue())
else:
self.assertEqual(stream.getvalue(), "")
def test_basic(self):
self.check("as = 4", "as")
self.check("with = 4", "with")
self.check("class as: pass", "as")
self.check("class with: pass", "with")
self.check("obj.as = 4", "as")
self.check("with.obj = 4", "with")
self.check("def with(): pass", "with")
self.check("do(); with = 23", "with")
def test_after_import(self):
# issue 3936
self.check("import sys\nas = 4", "as")
self.check("import sys\nwith = 4", "with")
def test_main(): def test_main():
run_unittest(FailureTestCase, NonexceptionalTestCase, run_unittest(FailureTestCase, NonexceptionalTestCase,
NestedNonexceptionalTestCase, ExceptionalTestCase, NestedNonexceptionalTestCase, ExceptionalTestCase,
NonLocalFlowControlTestCase, NonLocalFlowControlTestCase,
AssignmentTargetTestCase, AssignmentTargetTestCase,
ExitSwallowsExceptionTestCase) ExitSwallowsExceptionTestCase,
NewKeywordsWarningTestCase)
if __name__ == '__main__': if __name__ == '__main__':

View File

@ -12,6 +12,9 @@ What's New in Python 2.5.3?
Core and builtins Core and builtins
----------------- -----------------
- Issue #3936: The parser warnings for using "as" and "with" as variable names
didn't fire after import statements.
- Issue #3751: str.rpartition would perform a left-partition when called with - Issue #3751: str.rpartition would perform a left-partition when called with
a unicode argument. a unicode argument.

View File

@ -137,19 +137,22 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret,
err_ret->error = tok->done; err_ret->error = tok->done;
break; break;
} }
if (type == ENDMARKER && started) { if (started) {
type = NEWLINE; /* Add an extra newline */ if (type == ENDMARKER) {
handling_with = handling_import = 0; type = NEWLINE; /* Add an extra newline */
started = 0; started = 0;
/* Add the right number of dedent tokens, /* Add the right number of dedent tokens,
except if a certain flag is given -- except if a certain flag is given --
codeop.py uses this. */ codeop.py uses this. */
if (tok->indent && if (tok->indent &&
!(flags & PyPARSE_DONT_IMPLY_DEDENT)) !(flags & PyPARSE_DONT_IMPLY_DEDENT))
{ {
tok->pendin = -tok->indent; tok->pendin = -tok->indent;
tok->indent = 0; tok->indent = 0;
}
} }
if (type == NEWLINE)
handling_with = handling_import = 0;
} }
else else
started = 1; started = 1;