make sure to give a 'as' and 'with' parser warning even after import statements #3936
This commit is contained in:
parent
8e97ea9c6b
commit
d1c7d07d67
|
@ -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__':
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue