| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef TOOLS_GN_C_INCLUDE_ITERATOR_H_ |
| #define TOOLS_GN_C_INCLUDE_ITERATOR_H_ |
| |
| #include <stddef.h> |
| |
| #include <string_view> |
| |
| #include "base/macros.h" |
| #include "gn/location.h" |
| |
| class InputFile; |
| |
| struct IncludeStringWithLocation { |
| std::string_view contents; |
| LocationRange location; |
| bool system_style_include = false; |
| }; |
| |
| // Iterates through #includes in C source and header files. |
| class CIncludeIterator { |
| public: |
| // The InputFile pointed to must outlive this class. |
| explicit CIncludeIterator(const InputFile* input); |
| ~CIncludeIterator(); |
| |
| // Fills in the string with the contents of the next include, and the |
| // location with where it came from, and returns true, or returns false if |
| // there are no more includes. |
| bool GetNextIncludeString(IncludeStringWithLocation* include); |
| |
| // Maximum numbef of non-includes we'll tolerate before giving up. This does |
| // not count comments or preprocessor. |
| static const int kMaxNonIncludeLines; |
| |
| private: |
| // Returns false on EOF, otherwise fills in the given line and the one-based |
| // line number into *line_number; |
| bool GetNextLine(std::string_view* line, int* line_number); |
| |
| const InputFile* input_file_; |
| |
| // This just points into input_file_.contents() for convenience. |
| std::string_view file_; |
| |
| // 0-based offset into the file. |
| size_t offset_ = 0; |
| |
| int line_number_ = 0; // One-based. Indicates the last line we read. |
| |
| // Number of lines we've processed since seeing the last include (or the |
| // beginning of the file) with some exceptions. |
| int lines_since_last_include_ = 0; |
| |
| DISALLOW_COPY_AND_ASSIGN(CIncludeIterator); |
| }; |
| |
| #endif // TOOLS_GN_C_INCLUDE_ITERATOR_H_ |