]> granicus.if.org Git - python/commitdiff
make sure to give a 'as' and 'with' parser warning even after import statements ...
authorBenjamin Peterson <benjamin@python.org>
Thu, 25 Sep 2008 20:46:05 +0000 (20:46 +0000)
committerBenjamin Peterson <benjamin@python.org>
Thu, 25 Sep 2008 20:46:05 +0000 (20:46 +0000)
Lib/test/test_with.py
Misc/NEWS
Parser/parsetok.c

index 8242c912c526d268d6c20eee1a68bf0d6af34654..3ba897798bf7065c5785080d19209931a03c00c5 100644 (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__':
index 1a58dba1e11d7be76cebdb13042e17bcb843064f..5fcf45649c7d6febd70d6b69af1e0ce13fdc79df 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.
 
index 6494a9381cf88a4e5896c2817f24bcc5e1e4038f..f05254200cf7630908711eaedb37cfb036d09be5 100644 (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;