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 unittest
import StringIO
from collections import deque
from contextlib import GeneratorContextManager, contextmanager
from test.test_support import run_unittest
@ -625,12 +626,44 @@ class ExitSwallowsExceptionTestCase(unittest.TestCase):
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():
run_unittest(FailureTestCase, NonexceptionalTestCase,
NestedNonexceptionalTestCase, ExceptionalTestCase,
NonLocalFlowControlTestCase,
AssignmentTargetTestCase,
ExitSwallowsExceptionTestCase)
ExitSwallowsExceptionTestCase,
NewKeywordsWarningTestCase)
if __name__ == '__main__':

View File

@ -12,6 +12,9 @@ What's New in Python 2.5.3?
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
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;
break;
}
if (type == ENDMARKER && started) {
type = NEWLINE; /* Add an extra newline */
handling_with = handling_import = 0;
started = 0;
/* Add the right number of dedent tokens,
except if a certain flag is given --
codeop.py uses this. */
if (tok->indent &&
!(flags & PyPARSE_DONT_IMPLY_DEDENT))
{
tok->pendin = -tok->indent;
tok->indent = 0;
if (started) {
if (type == ENDMARKER) {
type = NEWLINE; /* Add an extra newline */
started = 0;
/* Add the right number of dedent tokens,
except if a certain flag is given --
codeop.py uses this. */
if (tok->indent &&
!(flags & PyPARSE_DONT_IMPLY_DEDENT))
{
tok->pendin = -tok->indent;
tok->indent = 0;
}
}
if (type == NEWLINE)
handling_with = handling_import = 0;
}
else
started = 1;