]> granicus.if.org Git - python/commitdiff
Patch #1475845: Raise IndentationError for unexpected indent.
authorMartin v. Löwis <martin@v.loewis.de>
Thu, 4 May 2006 05:51:03 +0000 (05:51 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Thu, 4 May 2006 05:51:03 +0000 (05:51 +0000)
Lib/test/test_syntax.py
Misc/NEWS
Parser/parsetok.c

index b61debfcb07f39c71af2f7d3c53636d64701255a..ce2e327a3dcdf3457468bfe4f15e64976ada797d 100644 (file)
@@ -243,15 +243,18 @@ from test import test_support
 class SyntaxTestCase(unittest.TestCase):
 
     def _check_error(self, code, errtext,
-                     filename="<testcase>", mode="exec"):
+                     filename="<testcase>", mode="exec", subclass=None):
         """Check that compiling code raises SyntaxError with errtext.
 
         errtest is a regular expression that must be present in the
-        test of the exception raised.
+        test of the exception raised.  If subclass is specified it
+        is the expected subclass of SyntaxError (e.g. IndentationError).
         """
         try:
             compile(code, filename, mode)
         except SyntaxError, err:
+            if subclass and not isinstance(err, subclass):
+                self.fail("SyntaxError is not a %s" % subclass.__name__)
             mo = re.search(errtext, str(err))
             if mo is None:
                 self.fail("SyntaxError did not contain '%r'" % (errtext,))
@@ -290,6 +293,19 @@ class SyntaxTestCase(unittest.TestCase):
             :""")
         self._check_error(source, "nested scope")
 
+    def test_unexpected_indent(self):
+        self._check_error("foo()\n bar()\n", "unexpected indent",
+                          subclass=IndentationError)
+
+    def test_no_indent(self):
+        self._check_error("if 1:\nfoo()", "expected an indented block",
+                          subclass=IndentationError)
+
+    def test_bad_outdent(self):
+        self._check_error("if 1:\n  foo()\n bar()",
+                          "unindent does not match .* level",
+                          subclass=IndentationError)
+
 def test_main():
     test_support.run_unittest(SyntaxTestCase)
     from test import test_syntax
index cedefef31d7421774cae00d71c6b89a4b676fe20..8c758b00ffb338d746061aba784887eb54debcd7 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,8 @@ What's New in Python 2.5 alpha 2?
 Core and builtins
 -----------------
 
+- Patch #1475845: Raise IndentationError for unexpected indent.
+
 - Patch #1479181: split open() and file() from being aliases for each other.
 
 - Bug #1465834: 'bdist_wininst preinstall script support' was fixed
index 77a2cac9fbf2ba0af21a6be9a2770cbc98b3b80b..5fcaf1b36a72eb5f22dea11a7a0cf3c23756fe60 100644 (file)
@@ -194,8 +194,10 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret,
                if ((err_ret->error =
                     PyParser_AddToken(ps, (int)type, str, tok->lineno, col_offset,
                                       &(err_ret->expected))) != E_OK) {
-                       if (err_ret->error != E_DONE)
+                       if (err_ret->error != E_DONE) {
                                PyObject_FREE(str);
+                               err_ret->token = type;
+                       }                               
                        break;
                }
        }