Skip to content
This repository was archived by the owner on Jun 15, 2023. It is now read-only.

Commit e74cefa

Browse files
committedFeb 3, 2016
Replace ManifestParser::FileReader with general FileReader
Avoid having two separate filesystem interfaces. Simplify test infrastructure by avoiding custom `ManifestParser::FileReader` implementations.
1 parent 858386d commit e74cefa

5 files changed

+32
-63
lines changed
 

‎src/manifest_parser.cc

+2-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <stdlib.h>
1919
#include <vector>
2020

21+
#include "disk_interface.h"
2122
#include "graph.h"
2223
#include "metrics.h"
2324
#include "state.h"
@@ -35,7 +36,7 @@ bool ManifestParser::Load(const string& filename, string* err, Lexer* parent) {
3536
METRIC_RECORD(".ninja parse");
3637
string contents;
3738
string read_err;
38-
if (!file_reader_->ReadFile(filename, &contents, &read_err)) {
39+
if (file_reader_->ReadFile(filename, &contents, &read_err) != FileReader::Okay) {
3940
*err = "loading '" + filename + "': " + read_err;
4041
if (parent)
4142
parent->Error(string(*err), err);

‎src/manifest_parser.h

+1-5
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ using namespace std;
2323

2424
struct BindingEnv;
2525
struct EvalString;
26+
struct FileReader;
2627
struct State;
2728

2829
enum DupeEdgeAction {
@@ -32,11 +33,6 @@ enum DupeEdgeAction {
3233

3334
/// Parses .ninja files.
3435
struct ManifestParser {
35-
struct FileReader {
36-
virtual ~FileReader() {}
37-
virtual bool ReadFile(const string& path, string* content, string* err) = 0;
38-
};
39-
4036
ManifestParser(State* state, FileReader* file_reader,
4137
DupeEdgeAction dupe_edge_action);
4238

‎src/manifest_parser_perftest.cc

+2-8
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,6 @@
3636
#include "state.h"
3737
#include "util.h"
3838

39-
struct RealFileReader : public ManifestParser::FileReader {
40-
virtual bool ReadFile(const string& path, string* content, string* err) {
41-
return ::ReadFile(path, content, err) == 0;
42-
}
43-
};
44-
4539
bool WriteFakeManifests(const string& dir, string* err) {
4640
RealDiskInterface disk_interface;
4741
TimeStamp mtime = disk_interface.Stat(dir + "/build.ninja", err);
@@ -59,9 +53,9 @@ bool WriteFakeManifests(const string& dir, string* err) {
5953

6054
int LoadManifests(bool measure_command_evaluation) {
6155
string err;
62-
RealFileReader file_reader;
56+
RealDiskInterface disk_interface;
6357
State state;
64-
ManifestParser parser(&state, &file_reader, kDupeEdgeActionWarn);
58+
ManifestParser parser(&state, &disk_interface, kDupeEdgeActionWarn);
6559
if (!parser.Load("build.ninja", &err)) {
6660
fprintf(stderr, "Failed to read test data: %s\n", err.c_str());
6761
exit(1);

‎src/manifest_parser_test.cc

+26-39
Original file line numberDiff line numberDiff line change
@@ -21,30 +21,17 @@
2121
#include "state.h"
2222
#include "test.h"
2323

24-
struct ParserTest : public testing::Test,
25-
public ManifestParser::FileReader {
24+
struct ParserTest : public testing::Test {
2625
void AssertParse(const char* input) {
27-
ManifestParser parser(&state, this, kDupeEdgeActionWarn);
26+
ManifestParser parser(&state, &fs_, kDupeEdgeActionWarn);
2827
string err;
2928
EXPECT_TRUE(parser.ParseTest(input, &err));
3029
ASSERT_EQ("", err);
3130
VerifyGraph(state);
3231
}
3332

34-
virtual bool ReadFile(const string& path, string* content, string* err) {
35-
files_read_.push_back(path);
36-
map<string, string>::iterator i = files_.find(path);
37-
if (i == files_.end()) {
38-
*err = "No such file or directory"; // Match strerror() for ENOENT.
39-
return false;
40-
}
41-
*content = i->second;
42-
return true;
43-
}
44-
4533
State state;
46-
map<string, string> files_;
47-
vector<string> files_read_;
34+
VirtualFileSystem fs_;
4835
};
4936

5037
TEST_F(ParserTest, Empty) {
@@ -371,22 +358,22 @@ TEST_F(ParserTest, DuplicateEdgeWithMultipleOutputsError) {
371358
"build out1 out2: cat in1\n"
372359
"build out1: cat in2\n"
373360
"build final: cat out1\n";
374-
ManifestParser parser(&state, this, kDupeEdgeActionError);
361+
ManifestParser parser(&state, &fs_, kDupeEdgeActionError);
375362
string err;
376363
EXPECT_FALSE(parser.ParseTest(kInput, &err));
377364
EXPECT_EQ("input:5: multiple rules generate out1 [-w dupbuild=err]\n", err);
378365
}
379366

380367
TEST_F(ParserTest, DuplicateEdgeInIncludedFile) {
381-
files_["sub.ninja"] =
368+
fs_.Create("sub.ninja",
382369
"rule cat\n"
383370
" command = cat $in > $out\n"
384371
"build out1 out2: cat in1\n"
385372
"build out1: cat in2\n"
386-
"build final: cat out1\n";
373+
"build final: cat out1\n");
387374
const char kInput[] =
388375
"subninja sub.ninja\n";
389-
ManifestParser parser(&state, this, kDupeEdgeActionError);
376+
ManifestParser parser(&state, &fs_, kDupeEdgeActionError);
390377
string err;
391378
EXPECT_FALSE(parser.ParseTest(kInput, &err));
392379
EXPECT_EQ("sub.ninja:5: multiple rules generate out1 [-w dupbuild=err]\n",
@@ -813,7 +800,7 @@ TEST_F(ParserTest, Errors) {
813800

814801
TEST_F(ParserTest, MissingInput) {
815802
State state;
816-
ManifestParser parser(&state, this, kDupeEdgeActionWarn);
803+
ManifestParser parser(&state, &fs_, kDupeEdgeActionWarn);
817804
string err;
818805
EXPECT_FALSE(parser.Load("build.ninja", &err));
819806
EXPECT_EQ("loading 'build.ninja': No such file or directory", err);
@@ -841,9 +828,9 @@ TEST_F(ParserTest, MultipleOutputsWithDeps) {
841828
}
842829

843830
TEST_F(ParserTest, SubNinja) {
844-
files_["test.ninja"] =
831+
fs_.Create("test.ninja",
845832
"var = inner\n"
846-
"build $builddir/inner: varref\n";
833+
"build $builddir/inner: varref\n");
847834
ASSERT_NO_FATAL_FAILURE(AssertParse(
848835
"builddir = some_dir/\n"
849836
"rule varref\n"
@@ -852,9 +839,9 @@ TEST_F(ParserTest, SubNinja) {
852839
"build $builddir/outer: varref\n"
853840
"subninja test.ninja\n"
854841
"build $builddir/outer2: varref\n"));
855-
ASSERT_EQ(1u, files_read_.size());
842+
ASSERT_EQ(1u, fs_.files_read_.size());
856843

857-
EXPECT_EQ("test.ninja", files_read_[0]);
844+
EXPECT_EQ("test.ninja", fs_.files_read_[0]);
858845
EXPECT_TRUE(state.LookupNode("some_dir/outer"));
859846
// Verify our builddir setting is inherited.
860847
EXPECT_TRUE(state.LookupNode("some_dir/inner"));
@@ -866,7 +853,7 @@ TEST_F(ParserTest, SubNinja) {
866853
}
867854

868855
TEST_F(ParserTest, MissingSubNinja) {
869-
ManifestParser parser(&state, this, kDupeEdgeActionWarn);
856+
ManifestParser parser(&state, &fs_, kDupeEdgeActionWarn);
870857
string err;
871858
EXPECT_FALSE(parser.ParseTest("subninja foo.ninja\n", &err));
872859
EXPECT_EQ("input:1: loading 'foo.ninja': No such file or directory\n"
@@ -877,9 +864,9 @@ TEST_F(ParserTest, MissingSubNinja) {
877864

878865
TEST_F(ParserTest, DuplicateRuleInDifferentSubninjas) {
879866
// Test that rules are scoped to subninjas.
880-
files_["test.ninja"] = "rule cat\n"
881-
" command = cat\n";
882-
ManifestParser parser(&state, this, kDupeEdgeActionWarn);
867+
fs_.Create("test.ninja", "rule cat\n"
868+
" command = cat\n");
869+
ManifestParser parser(&state, &fs_, kDupeEdgeActionWarn);
883870
string err;
884871
EXPECT_TRUE(parser.ParseTest("rule cat\n"
885872
" command = cat\n"
@@ -888,31 +875,31 @@ TEST_F(ParserTest, DuplicateRuleInDifferentSubninjas) {
888875

889876
TEST_F(ParserTest, DuplicateRuleInDifferentSubninjasWithInclude) {
890877
// Test that rules are scoped to subninjas even with includes.
891-
files_["rules.ninja"] = "rule cat\n"
892-
" command = cat\n";
893-
files_["test.ninja"] = "include rules.ninja\n"
894-
"build x : cat\n";
895-
ManifestParser parser(&state, this, kDupeEdgeActionWarn);
878+
fs_.Create("rules.ninja", "rule cat\n"
879+
" command = cat\n");
880+
fs_.Create("test.ninja", "include rules.ninja\n"
881+
"build x : cat\n");
882+
ManifestParser parser(&state, &fs_, kDupeEdgeActionWarn);
896883
string err;
897884
EXPECT_TRUE(parser.ParseTest("include rules.ninja\n"
898885
"subninja test.ninja\n"
899886
"build y : cat\n", &err));
900887
}
901888

902889
TEST_F(ParserTest, Include) {
903-
files_["include.ninja"] = "var = inner\n";
890+
fs_.Create("include.ninja", "var = inner\n");
904891
ASSERT_NO_FATAL_FAILURE(AssertParse(
905892
"var = outer\n"
906893
"include include.ninja\n"));
907894

908-
ASSERT_EQ(1u, files_read_.size());
909-
EXPECT_EQ("include.ninja", files_read_[0]);
895+
ASSERT_EQ(1u, fs_.files_read_.size());
896+
EXPECT_EQ("include.ninja", fs_.files_read_[0]);
910897
EXPECT_EQ("inner", state.bindings_.LookupVariable("var"));
911898
}
912899

913900
TEST_F(ParserTest, BrokenInclude) {
914-
files_["include.ninja"] = "build\n";
915-
ManifestParser parser(&state, this, kDupeEdgeActionWarn);
901+
fs_.Create("include.ninja", "build\n");
902+
ManifestParser parser(&state, &fs_, kDupeEdgeActionWarn);
916903
string err;
917904
EXPECT_FALSE(parser.ParseTest("include include.ninja\n", &err));
918905
EXPECT_EQ("include.ninja:1: expected path\n"

‎src/ninja.cc

+1-10
Original file line numberDiff line numberDiff line change
@@ -229,14 +229,6 @@ int GuessParallelism() {
229229
}
230230
}
231231

232-
/// An implementation of ManifestParser::FileReader that actually reads
233-
/// the file.
234-
struct RealFileReader : public ManifestParser::FileReader {
235-
virtual bool ReadFile(const string& path, string* content, string* err) {
236-
return ::ReadFile(path, content, err) == 0;
237-
}
238-
};
239-
240232
/// Rebuild the build manifest, if necessary.
241233
/// Returns true if the manifest was rebuilt.
242234
bool NinjaMain::RebuildManifest(const char* input_file, string* err) {
@@ -1117,8 +1109,7 @@ int real_main(int argc, char** argv) {
11171109
for (int cycle = 1; cycle <= kCycleLimit; ++cycle) {
11181110
NinjaMain ninja(ninja_command, config);
11191111

1120-
RealFileReader file_reader;
1121-
ManifestParser parser(&ninja.state_, &file_reader,
1112+
ManifestParser parser(&ninja.state_, &ninja.disk_interface_,
11221113
options.dupe_edges_should_err
11231114
? kDupeEdgeActionError
11241115
: kDupeEdgeActionWarn);

0 commit comments

Comments
 (0)