Skip to content

Commit

Permalink
Merge pull request ninja-build#1159 from nicolasdespres/no-explicit-o…
Browse files Browse the repository at this point in the history
…utputs

Parser accepts no explicit outputs.
  • Loading branch information
nico committed May 27, 2016
2 parents 63a8584 + ccaa3d1 commit 680efe4
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 9 deletions.
39 changes: 39 additions & 0 deletions src/graph_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,45 @@ TEST_F(GraphTest, ImplicitOutputOutOfDate) {
EXPECT_TRUE(GetNode("out.imp")->dirty());
}

TEST_F(GraphTest, ImplicitOutputOnlyParse) {
ASSERT_NO_FATAL_FAILURE(AssertParse(&state_,
"build | out.imp: cat in\n"));

Edge* edge = GetNode("out.imp")->in_edge();
EXPECT_EQ(1, edge->outputs_.size());
EXPECT_EQ("out.imp", edge->outputs_[0]->path());
EXPECT_EQ(1, edge->implicit_outs_);
EXPECT_EQ(edge, GetNode("out.imp")->in_edge());
}

TEST_F(GraphTest, ImplicitOutputOnlyMissing) {
ASSERT_NO_FATAL_FAILURE(AssertParse(&state_,
"build | out.imp: cat in\n"));
fs_.Create("in", "");

Edge* edge = GetNode("out.imp")->in_edge();
string err;
EXPECT_TRUE(scan_.RecomputeDirty(edge, &err));
ASSERT_EQ("", err);

EXPECT_TRUE(GetNode("out.imp")->dirty());
}

TEST_F(GraphTest, ImplicitOutputOnlyOutOfDate) {
ASSERT_NO_FATAL_FAILURE(AssertParse(&state_,
"build | out.imp: cat in\n"));
fs_.Create("out.imp", "");
fs_.Tick();
fs_.Create("in", "");

Edge* edge = GetNode("out.imp")->in_edge();
string err;
EXPECT_TRUE(scan_.RecomputeDirty(edge, &err));
ASSERT_EQ("", err);

EXPECT_TRUE(GetNode("out.imp")->dirty());
}

TEST_F(GraphTest, PathWithCurrentDirectory) {
ASSERT_NO_FATAL_FAILURE(AssertParse(&state_,
"rule catdep\n"
Expand Down
10 changes: 5 additions & 5 deletions src/manifest_parser.cc
Original file line number Diff line number Diff line change
Expand Up @@ -236,16 +236,13 @@ bool ManifestParser::ParseEdge(string* err) {
EvalString out;
if (!lexer_.ReadPath(&out, err))
return false;
if (out.empty())
return lexer_.Error("expected path", err);

do {
while (!out.empty()) {
outs.push_back(out);

out.Clear();
if (!lexer_.ReadPath(&out, err))
return false;
} while (!out.empty());
}
}

// Add all implicit outs, counting how many as we go.
Expand All @@ -262,6 +259,9 @@ bool ManifestParser::ParseEdge(string* err) {
}
}

if (outs.empty())
return lexer_.Error("expected path", err);

if (!ExpectToken(Lexer::COLON, err))
return false;

Expand Down
5 changes: 1 addition & 4 deletions src/manifest_parser_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -976,13 +976,10 @@ TEST_F(ParserTest, ImplicitOutputDupes) {
TEST_F(ParserTest, NoExplicitOutput) {
ManifestParser parser(&state, NULL, kDupeEdgeActionWarn);
string err;
EXPECT_FALSE(parser.ParseTest(
EXPECT_TRUE(parser.ParseTest(
"rule cat\n"
" command = cat $in > $out\n"
"build | imp : cat bar\n", &err));
ASSERT_EQ("input:3: expected path\n"
"build | imp : cat bar\n"
" ^ near here", err);
}

TEST_F(ParserTest, DefaultDefault) {
Expand Down

0 comments on commit 680efe4

Please sign in to comment.