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));
+}