Fix diagnostic formatting regression caused by adaa91a33eb2cf23b88.
authorNico Weber <thakis@chromium.org>
Fri, 19 Jul 2013 00:51:10 +0000 (17:51 -0700)
committerNico Weber <thakis@chromium.org>
Fri, 19 Jul 2013 00:51:10 +0000 (17:51 -0700)
Ninja regressed to include a location for every file on the include stack for
nested diagnostics, i.e. it would print:

  input:1: include.ninja:1: expected path

Fix this so that it prints only the current file location, like it used to:

  include.ninja:1: expected path

Also add a test for this.

src/manifest_parser.cc
src/manifest_parser.h
src/manifest_parser_test.cc

index a1bb90443d52cd05c9b195e78e983566234c9631..20be7f3777f5c43a65307254f2a15e4a2ba35b83 100644 (file)
@@ -29,12 +29,14 @@ ManifestParser::ManifestParser(State* state, FileReader* file_reader)
   env_ = &state->bindings_;
 }
 
-bool ManifestParser::Load(const string& filename, string* err) {
+bool ManifestParser::Load(const string& filename, string* err, Lexer* parent) {
   METRIC_RECORD(".ninja parse");
   string contents;
   string read_err;
   if (!file_reader_->ReadFile(filename, &contents, &read_err)) {
     *err = "loading '" + filename + "': " + read_err;
+    if (parent)
+      parent->Error(string(*err), err);
     return false;
   }
 
@@ -358,8 +360,8 @@ bool ManifestParser::ParseFileInclude(bool new_scope, string* err) {
     subparser.env_ = env_;
   }
 
-  if (!subparser.Load(path, err))
-    return lexer_.Error(string(*err), err);
+  if (!subparser.Load(path, err, &lexer_))
+    return false;
 
   if (!ExpectToken(Lexer::NEWLINE, err))
     return false;
index 967dfddc3062ab302364d792223fa434f8fae26b..5212f72ba1b66eafb3b188e5154285778596fc0a 100644 (file)
@@ -35,7 +35,7 @@ struct ManifestParser {
   ManifestParser(State* state, FileReader* file_reader);
 
   /// Load and parse a file.
-  bool Load(const string& filename, string* err);
+  bool Load(const string& filename, string* err, Lexer* parent=NULL);
 
   /// Parse a text string of input.  Used by tests.
   bool ParseTest(const string& input, string* err) {
index b3335490cc98756d848ff5d4bd79c2bc589ce457..67c422b727c4d5d5e58769b6f0fd130bb4260c12 100644 (file)
@@ -762,6 +762,17 @@ TEST_F(ParserTest, Include) {
   EXPECT_EQ("inner", state.bindings_.LookupVariable("var"));
 }
 
+TEST_F(ParserTest, BrokenInclude) {
+  files_["include.ninja"] = "build\n";
+  ManifestParser parser(&state, this);
+  string err;
+  EXPECT_FALSE(parser.ParseTest("include include.ninja\n", &err));
+  EXPECT_EQ("include.ninja:1: expected path\n"
+            "build\n"
+            "     ^ near here"
+            , err);
+}
+
 TEST_F(ParserTest, Implicit) {
   ASSERT_NO_FATAL_FAILURE(AssertParse(
 "rule cat\n"