mirror of https://github.com/python/cpython
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 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__':
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue