diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/CHANGES.txt | 3 | ||||
-rw-r--r-- | src/engine/SCons/Util.py | 7 | ||||
-rw-r--r-- | src/engine/SCons/UtilTests.py | 18 |
3 files changed, 27 insertions, 1 deletions
diff --git a/src/CHANGES.txt b/src/CHANGES.txt index 26dd7ef..8b14bf4 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -144,6 +144,9 @@ RELEASE 0.95 - XXX - Fix TestCmd.py, runtest.py and specific tests to accomodate being run from directories whose paths include white space. + - Provide a more useful error message if a construction variable + expansion contains a syntax error during evaluation. + From Vincent Risi: - Add support for the bcc32, ilink32 and tlib Borland tools. diff --git a/src/engine/SCons/Util.py b/src/engine/SCons/Util.py index 0af98fd..6d95a4e 100644 --- a/src/engine/SCons/Util.py +++ b/src/engine/SCons/Util.py @@ -40,7 +40,8 @@ import sys import types import UserDict import UserList -import SCons.Node + +import SCons.Errors try: from UserString import UserString @@ -556,6 +557,8 @@ def scons_subst(strSubst, env, mode=SUBST_RAW, target=None, source=None, dict=No s = eval(key, self.gvars, lvars) except (IndexError, NameError, TypeError): return '' + except (SyntaxError): + raise SCons.Errors.UserError, "Syntax error trying to evaluate `%s'" % s else: # Before re-expanding the result, handle # recursive expansion by copying the local @@ -690,6 +693,8 @@ def scons_subst_list(strSubst, env, mode=SUBST_RAW, target=None, source=None, di s = eval(key, self.gvars, lvars) except (IndexError, NameError, TypeError): return + except (SyntaxError): + raise SCons.Errors.UserError, "Syntax error trying to evaluate `%s'" % s else: # Before re-expanding the result, handle # recursive expansion by copying the local diff --git a/src/engine/SCons/UtilTests.py b/src/engine/SCons/UtilTests.py index ca5f649..fb4ec09 100644 --- a/src/engine/SCons/UtilTests.py +++ b/src/engine/SCons/UtilTests.py @@ -32,6 +32,8 @@ import unittest from SCons.Util import * import TestCmd +import SCons.Errors + class OutBuffer: def __init__(self): self.buffer = "" @@ -410,6 +412,14 @@ class UtilTestCase(unittest.TestCase): env, target=MyNode('t'), source=MyNode('s')) assert newcom == "test foo baz s t", newcom + # Test that we handle syntax errors during expansion as expected. + try: + scons_subst('$foo.bar.3.0', env) + except SCons.Errors.UserError, e: + assert str(e) == "Syntax error trying to evaluate `$foo.bar.3.0'", e + else: + raise AssertionError, "did not catch expected UserError" + # Test returning a function. #env = DummyEnv({'FUNCTION' : foo}) #func = scons_subst("$FUNCTION", env, mode=SUBST_RAW, call=None) @@ -732,6 +742,14 @@ class UtilTestCase(unittest.TestCase): del subst_list_cases[:4] assert failed == 0, "%d subst() mode cases failed" % failed + # Test that we handle syntax errors during expansion as expected. + try: + scons_subst_list('$foo.bar.3.0', env) + except SCons.Errors.UserError, e: + assert str(e) == "Syntax error trying to evaluate `$foo.bar.3.0'", e + else: + raise AssertionError, "did not catch expected SyntaxError" + def test_splitext(self): assert splitext('foo') == ('foo','') assert splitext('foo.bar') == ('foo','.bar') |