diff options
Diffstat (limited to 'lib/Format/UnwrappedLineParser.h')
| -rw-r--r-- | lib/Format/UnwrappedLineParser.h | 44 |
1 files changed, 31 insertions, 13 deletions
diff --git a/lib/Format/UnwrappedLineParser.h b/lib/Format/UnwrappedLineParser.h index 1d8ccabbd0f8e..87254832c635e 100644 --- a/lib/Format/UnwrappedLineParser.h +++ b/lib/Format/UnwrappedLineParser.h @@ -8,7 +8,7 @@ //===----------------------------------------------------------------------===// /// /// \file -/// \brief This file contains the declaration of the UnwrappedLineParser, +/// This file contains the declaration of the UnwrappedLineParser, /// which turns a stream of tokens into UnwrappedLines. /// //===----------------------------------------------------------------------===// @@ -28,7 +28,7 @@ namespace format { struct UnwrappedLineNode; -/// \brief An unwrapped line is a sequence of \c Token, that we would like to +/// An unwrapped line is a sequence of \c Token, that we would like to /// put on a single line if there was no column limit. /// /// This is used as a main interface between the \c UnwrappedLineParser and the @@ -38,22 +38,26 @@ struct UnwrappedLine { UnwrappedLine(); // FIXME: Don't use std::list here. - /// \brief The \c Tokens comprising this \c UnwrappedLine. + /// The \c Tokens comprising this \c UnwrappedLine. std::list<UnwrappedLineNode> Tokens; - /// \brief The indent level of the \c UnwrappedLine. + /// The indent level of the \c UnwrappedLine. unsigned Level; - /// \brief Whether this \c UnwrappedLine is part of a preprocessor directive. + /// Whether this \c UnwrappedLine is part of a preprocessor directive. bool InPPDirective; bool MustBeDeclaration; - /// \brief If this \c UnwrappedLine closes a block in a sequence of lines, + /// If this \c UnwrappedLine closes a block in a sequence of lines, /// \c MatchingOpeningBlockLineIndex stores the index of the corresponding /// opening line. Otherwise, \c MatchingOpeningBlockLineIndex must be /// \c kInvalidIndex. - size_t MatchingOpeningBlockLineIndex; + size_t MatchingOpeningBlockLineIndex = kInvalidIndex; + + /// If this \c UnwrappedLine opens a block, stores the index of the + /// line with the corresponding closing brace. + size_t MatchingClosingBlockLineIndex = kInvalidIndex; static const size_t kInvalidIndex = -1; @@ -116,10 +120,11 @@ private: // parses the record as a child block, i.e. if the class declaration is an // expression. void parseRecord(bool ParseAsExpr = false); + void parseObjCMethod(); void parseObjCProtocolList(); void parseObjCUntilAtEnd(); void parseObjCInterfaceOrImplementation(); - void parseObjCProtocol(); + bool parseObjCProtocol(); void parseJavaScriptEs6ImportExport(); bool tryToParseLambda(); bool tryToParseLambdaIntroducer(); @@ -141,7 +146,7 @@ private: // token. // // NextTok specifies the next token. A null pointer NextTok is supported, and - // signifies either the absense of a next token, or that the next token + // signifies either the absence of a next token, or that the next token // shouldn't be taken into accunt for the analysis. void distributeComments(const SmallVectorImpl<FormatToken *> &Comments, const FormatToken *NextTok); @@ -248,10 +253,23 @@ private: // sequence. std::stack<int> PPChainBranchIndex; - // Contains the #ifndef condition for a potential include guard. - FormatToken *IfNdefCondition; - bool FoundIncludeGuardStart; - bool IncludeGuardRejected; + // Include guard search state. Used to fixup preprocessor indent levels + // so that include guards do not participate in indentation. + enum IncludeGuardState { + IG_Inited, // Search started, looking for #ifndef. + IG_IfNdefed, // #ifndef found, IncludeGuardToken points to condition. + IG_Defined, // Matching #define found, checking other requirements. + IG_Found, // All requirements met, need to fix indents. + IG_Rejected, // Search failed or never started. + }; + + // Current state of include guard search. + IncludeGuardState IncludeGuard; + + // Points to the #ifndef condition for a potential include guard. Null unless + // IncludeGuardState == IG_IfNdefed. + FormatToken *IncludeGuardToken; + // 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. |
