Allow whitespace in include directives.
This allows statements like:
# include "foo.h"
To be processed by gn check.
Bug: gn:37
Change-Id: I89d506863d03b360fc0ec9f42101d984107dd979
Reviewed-on: https://gn-review.googlesource.com/c/3601
Reviewed-by: Brett Wilson <brettw@chromium.org>
Commit-Queue: Brett Wilson <brettw@chromium.org>
diff --git a/tools/gn/c_include_iterator.cc b/tools/gn/c_include_iterator.cc
index 9f4f070..0c5476d 100644
--- a/tools/gn/c_include_iterator.cc
+++ b/tools/gn/c_include_iterator.cc
@@ -62,15 +62,20 @@
IncludeType ExtractInclude(const base::StringPiece& line,
base::StringPiece* path,
int* begin_char) {
- static const char kInclude[] = "#include";
+ static const char kInclude[] = "include";
static const size_t kIncludeLen = arraysize(kInclude) - 1; // No null.
- static const char kImport[] = "#import";
+ static const char kImport[] = "import";
static const size_t kImportLen = arraysize(kImport) - 1; // No null.
base::StringPiece trimmed = TrimLeadingWhitespace(line);
if (trimmed.empty())
return INCLUDE_NONE;
+ if (trimmed[0] != '#')
+ return INCLUDE_NONE;
+
+ trimmed = TrimLeadingWhitespace(trimmed.substr(1));
+
base::StringPiece contents;
if (base::StartsWith(trimmed, base::StringPiece(kInclude, kIncludeLen),
base::CompareCase::SENSITIVE))
diff --git a/tools/gn/c_include_iterator_unittest.cc b/tools/gn/c_include_iterator_unittest.cc
index ef44263..a88537c 100644
--- a/tools/gn/c_include_iterator_unittest.cc
+++ b/tools/gn/c_include_iterator_unittest.cc
@@ -159,3 +159,20 @@
EXPECT_TRUE(iter.GetNextIncludeString(&contents, &range));
EXPECT_EQ("foo/bar.h", contents);
}
+
+// Tests that spaces between the hash and directive are ignored.
+TEST(CIncludeIterator, SpacesAfterHash) {
+ std::string buffer("# include \"foo/bar.h\"\n");
+
+ InputFile file(SourceFile("//foo.cc"));
+ file.SetContents(buffer);
+
+ base::StringPiece contents;
+ LocationRange range;
+
+ CIncludeIterator iter(&file);
+ EXPECT_TRUE(iter.GetNextIncludeString(&contents, &range));
+ EXPECT_EQ("foo/bar.h", contents);
+
+ EXPECT_FALSE(iter.GetNextIncludeString(&contents, &range));
+}