summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvan Martin <martine@danga.com>2010-12-21 00:13:34 (GMT)
committerEvan Martin <martine@danga.com>2010-12-21 00:13:34 (GMT)
commitdb022ad64849ccf072a75ea59947e4243f29ba37 (patch)
tree3b082b90f45934e0136610c2f5a77b9322579294
parentf2a4bac9127124563cd783a798e64dd15204d598 (diff)
downloadNinja-db022ad64849ccf072a75ea59947e4243f29ba37.zip
Ninja-db022ad64849ccf072a75ea59947e4243f29ba37.tar.gz
Ninja-db022ad64849ccf072a75ea59947e4243f29ba37.tar.bz2
aggressively eval variables in build blocks
-rw-r--r--src/ninja_jumble.cc2
-rw-r--r--src/parsers.cc2
-rw-r--r--src/parsers_test.cc10
3 files changed, 10 insertions, 4 deletions
diff --git a/src/ninja_jumble.cc b/src/ninja_jumble.cc
index ef4eefb..b0e60b1 100644
--- a/src/ninja_jumble.cc
+++ b/src/ninja_jumble.cc
@@ -376,7 +376,7 @@ bool EvalString::Parse(const string& input, string* err) {
} else {
for (end = start; end < input.size(); ++end) {
char c = input[end];
- if (!(('a' <= c && c <= 'z') || c == '_'))
+ if (!(('a' <= c && c <= 'z') || ('0' <= c && c <= '9') || c == '_'))
break;
}
if (end == start) {
diff --git a/src/parsers.cc b/src/parsers.cc
index 4f19046..7eee93c 100644
--- a/src/parsers.cc
+++ b/src/parsers.cc
@@ -436,7 +436,7 @@ bool ManifestParser::ParseEdge(string* err) {
env->parent_ = env_;
while (tokenizer_.PeekToken() != Token::OUTDENT) {
string key, val;
- if (!ParseLet(&key, &val, false, err))
+ if (!ParseLet(&key, &val, true, err))
return false;
env->AddBinding(key, val);
}
diff --git a/src/parsers_test.cc b/src/parsers_test.cc
index 58e40b8..6fb418d 100644
--- a/src/parsers_test.cc
+++ b/src/parsers_test.cc
@@ -59,13 +59,19 @@ TEST_F(ParserTest, Variables) {
"with_under = -under\n"
"build a: link b c\n"
"nested1 = 1\n"
-"nested2 = $nested1/2\n"));
+"nested2 = $nested1/2\n"
+"build supernested: link x\n"
+" extra = $nested2/3\n"));
- ASSERT_EQ(1, state.edges_.size());
+ ASSERT_EQ(2, state.edges_.size());
Edge* edge = state.edges_[0];
EXPECT_EQ("ld one-letter-test -pthread -under -o a b c",
edge->EvaluateCommand());
EXPECT_EQ("1/2", state.bindings_.LookupVariable("nested2"));
+
+ edge = state.edges_[1];
+ EXPECT_EQ("ld one-letter-test 1/2/3 -under -o supernested x",
+ edge->EvaluateCommand());
}
TEST_F(ParserTest, VariableScope) {