diff options
Diffstat (limited to 'lib/Format/UnwrappedLineParser.h')
| -rw-r--r-- | lib/Format/UnwrappedLineParser.h | 43 | 
1 files changed, 35 insertions, 8 deletions
diff --git a/lib/Format/UnwrappedLineParser.h b/lib/Format/UnwrappedLineParser.h index a2aa2f006728e..1d8ccabbd0f8e 100644 --- a/lib/Format/UnwrappedLineParser.h +++ b/lib/Format/UnwrappedLineParser.h @@ -56,6 +56,8 @@ struct UnwrappedLine {    size_t MatchingOpeningBlockLineIndex;    static const size_t kInvalidIndex = -1; + +  unsigned FirstStartColumn = 0;  };  class UnwrappedLineConsumer { @@ -71,6 +73,7 @@ class UnwrappedLineParser {  public:    UnwrappedLineParser(const FormatStyle &Style,                        const AdditionalKeywords &Keywords, +                      unsigned FirstStartColumn,                        ArrayRef<FormatToken *> Tokens,                        UnwrappedLineConsumer &Callback); @@ -96,7 +99,7 @@ private:    bool parseBracedList(bool ContinueOnSemicolons = false,                         tok::TokenKind ClosingBraceKind = tok::r_brace);    void parseParens(); -  void parseSquare(); +  void parseSquare(bool LambdaIntroducer = false);    void parseIfThenElse();    void parseTryCatch();    void parseForOrWhileLoop(); @@ -123,9 +126,12 @@ private:    void tryToParseJSFunction();    void addUnwrappedLine();    bool eof() const; -  void nextToken(); -  const FormatToken *getPreviousToken(); -  void readToken(); +  // LevelDifference is the difference of levels after and before the current +  // token. For example: +  // - if the token is '{' and opens a block, LevelDifference is 1. +  // - if the token is '}' and closes a block, LevelDifference is -1. +  void nextToken(int LevelDifference = 0); +  void readToken(int LevelDifference = 0);    // Decides which comment tokens should be added to the current line and which    // should be added as comments before the next token. @@ -156,6 +162,11 @@ private:    bool isOnNewLine(const FormatToken &FormatTok); +  // Compute hash of the current preprocessor branch. +  // This is used to identify the different branches, and thus track if block +  // open and close in the same branch. +  size_t computePPHash() const; +    // FIXME: We are constantly running into bugs where Line.Level is incorrectly    // subtracted from beyond 0. Introduce a method to subtract from Line.Level    // and use that everywhere in the Parser. @@ -174,7 +185,7 @@ private:    // Preprocessor directives are parsed out-of-order from other unwrapped lines.    // Thus, we need to keep a list of preprocessor directives to be reported -  // after an unwarpped line that has been started was finished. +  // after an unwrapped line that has been started was finished.    SmallVector<UnwrappedLine, 4> PreprocessorDirectives;    // New unwrapped lines are added via CurrentLines. @@ -207,8 +218,14 @@ private:      PP_Unreachable  // #if 0 or a conditional preprocessor block inside #if 0    }; +  struct PPBranch { +    PPBranch(PPBranchKind Kind, size_t Line) : Kind(Kind), Line(Line) {} +    PPBranchKind Kind; +    size_t Line; +  }; +    // Keeps a stack of currently active preprocessor branching directives. -  SmallVector<PPBranchKind, 16> PPStack; +  SmallVector<PPBranch, 16> PPStack;    // The \c UnwrappedLineParser re-parses the code for each combination    // of preprocessor branches that can be taken. @@ -231,6 +248,15 @@ private:    // sequence.    std::stack<int> PPChainBranchIndex; +  // Contains the #ifndef condition for a potential include guard. +  FormatToken *IfNdefCondition; +  bool FoundIncludeGuardStart; +  bool IncludeGuardRejected; +  // Contains the first start column where the source begins. This is zero for +  // normal source code and may be nonzero when formatting a code fragment that +  // does not start at the beginning of the file. +  unsigned FirstStartColumn; +    friend class ScopedLineState;    friend class CompoundStatementIndenter;  }; @@ -243,8 +269,9 @@ struct UnwrappedLineNode {    SmallVector<UnwrappedLine, 0> Children;  }; -inline UnwrappedLine::UnwrappedLine() : Level(0), InPPDirective(false), -  MustBeDeclaration(false), MatchingOpeningBlockLineIndex(kInvalidIndex) {} +inline UnwrappedLine::UnwrappedLine() +    : Level(0), InPPDirective(false), MustBeDeclaration(false), +      MatchingOpeningBlockLineIndex(kInvalidIndex) {}  } // end namespace format  } // end namespace clang  | 
