13b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko//===--- FormatToken.h - Format C++ code ------------------------*- C++ -*-===//
23b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko//
33b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko//                     The LLVM Compiler Infrastructure
43b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko//
53b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko// This file is distributed under the University of Illinois Open Source
63b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko// License. See LICENSE.TXT for details.
73b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko//
83b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko//===----------------------------------------------------------------------===//
93b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko///
103b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko/// \file
113b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko/// \brief This file contains the declaration of the FormatToken, a wrapper
123b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko/// around Token with additional information related to formatting.
133b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko///
143b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko//===----------------------------------------------------------------------===//
153b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
163b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko#ifndef LLVM_CLANG_FORMAT_FORMAT_TOKEN_H
173b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko#define LLVM_CLANG_FORMAT_FORMAT_TOKEN_H
183b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
193b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko#include "clang/Basic/OperatorPrecedence.h"
203b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko#include "clang/Lex/Lexer.h"
213b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
223b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienkonamespace clang {
233b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienkonamespace format {
243b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
253b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienkoenum TokenType {
263b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_BinaryOperator,
273b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_BlockComment,
283b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_CastRParen,
293b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_ConditionalExpr,
303b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_CtorInitializerColon,
31e8b10d3d5b90efaf60ad89e96f6500f971ceec41Daniel Jasper  TT_CtorInitializerComma,
323b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_DesignatedInitializerPeriod,
333b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_ImplicitStringLiteral,
343b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_InlineASMColon,
353b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_InheritanceColon,
363b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_FunctionTypeLParen,
373b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_LineComment,
383b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_ObjCArrayLiteral,
393b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_ObjCBlockLParen,
403b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_ObjCDecl,
413b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_ObjCDictLiteral,
423b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_ObjCForIn,
433b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_ObjCMethodExpr,
443b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_ObjCMethodSpecifier,
453b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_ObjCProperty,
463b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_ObjCSelectorName,
473b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_OverloadedOperator,
483b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_OverloadedOperatorLParen,
493b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_PointerOrReference,
503b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_PureVirtualSpecifier,
513b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_RangeBasedForLoopColon,
523b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_StartOfName,
533b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_TemplateCloser,
543b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_TemplateOpener,
552ca3741a962ded08866596577aaee2f4ab74c955Daniel Jasper  TT_TrailingReturnArrow,
563b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_TrailingUnaryOperator,
573b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_UnaryOperator,
583b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TT_Unknown
593b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko};
603b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
610de1c4d152b5fbf0b383e9fa8396e334f029c716Daniel Jasper// Represents what type of block a set of braces open.
620de1c4d152b5fbf0b383e9fa8396e334f029c716Daniel Jasperenum BraceBlockKind {
630de1c4d152b5fbf0b383e9fa8396e334f029c716Daniel Jasper  BK_Unknown,
640de1c4d152b5fbf0b383e9fa8396e334f029c716Daniel Jasper  BK_Block,
650de1c4d152b5fbf0b383e9fa8396e334f029c716Daniel Jasper  BK_BracedInit
660de1c4d152b5fbf0b383e9fa8396e334f029c716Daniel Jasper};
670de1c4d152b5fbf0b383e9fa8396e334f029c716Daniel Jasper
68c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper// The packing kind of a function's parameters.
69c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasperenum ParameterPackingKind {
70c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper  PPK_BinPacked,
71c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper  PPK_OnePerLine,
72c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper  PPK_Inconclusive
73c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper};
74c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper
753b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko/// \brief A wrapper around a \c Token storing information about the
763b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko/// whitespace characters preceeding it.
773b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienkostruct FormatToken {
783b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  FormatToken()
793b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko      : NewlinesBefore(0), HasUnescapedNewline(false), LastNewlineOffset(0),
8054e6c9d1f15153d1756642080866f10a91cc86eaAlexander Kornienko        CodePointCount(0), IsFirst(false), MustBreakBefore(false),
81561211d35b5a2825fba6d0c017044f6896b204fdDaniel Jasper        IsUnterminatedLiteral(false), BlockKind(BK_Unknown), Type(TT_Unknown),
82561211d35b5a2825fba6d0c017044f6896b204fdDaniel Jasper        SpacesRequiredBefore(0), CanBreakBefore(false),
83561211d35b5a2825fba6d0c017044f6896b204fdDaniel Jasper        ClosesTemplateDeclaration(false), ParameterCount(0),
84561211d35b5a2825fba6d0c017044f6896b204fdDaniel Jasper        PackingKind(PPK_Inconclusive), TotalLength(0), UnbreakableTailLength(0),
85561211d35b5a2825fba6d0c017044f6896b204fdDaniel Jasper        BindingStrength(0), SplitPenalty(0), LongestObjCSelectorName(0),
86561211d35b5a2825fba6d0c017044f6896b204fdDaniel Jasper        FakeRParens(0), LastInChainOfCalls(false),
873b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko        PartOfMultiVariableDeclStmt(false), MatchingParen(NULL), Previous(NULL),
883b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko        Next(NULL) {}
893b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
903b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// \brief The \c Token.
913b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  Token Tok;
923b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
933b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// \brief The number of newlines immediately before the \c Token.
943b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  ///
953b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// This can be used to determine what the user wrote in the original code
963b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// and thereby e.g. leave an empty line between two function definitions.
973b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  unsigned NewlinesBefore;
983b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
993b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// \brief Whether there is at least one unescaped newline before the \c
1003b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// Token.
1013b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  bool HasUnescapedNewline;
1023b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
1033b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// \brief The range of the whitespace immediately preceeding the \c Token.
1043b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  SourceRange WhitespaceRange;
1053b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
1063b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// \brief The offset just past the last '\n' in this token's leading
1073b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// whitespace (relative to \c WhiteSpaceStart). 0 if there is no '\n'.
1083b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  unsigned LastNewlineOffset;
1093b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
11000895106f9ed602af67984ec4d225a0cdc8c12afAlexander Kornienko  /// \brief The length of the non-whitespace parts of the token in CodePoints.
11100895106f9ed602af67984ec4d225a0cdc8c12afAlexander Kornienko  /// We need this to correctly measure number of columns a token spans.
11200895106f9ed602af67984ec4d225a0cdc8c12afAlexander Kornienko  unsigned CodePointCount;
1133b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
1143b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// \brief Indicates that this is the first token.
1153b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  bool IsFirst;
1163b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
1173b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// \brief Whether there must be a line break before this token.
1183b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  ///
1193b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// This happens for example when a preprocessor directive ended directly
1203b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// before the token.
1213b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  bool MustBreakBefore;
1223b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
1233b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// \brief Returns actual token start location without leading escaped
1243b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// newlines and whitespace.
1253b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  ///
1263b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// This can be different to Tok.getLocation(), which includes leading escaped
1273b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// newlines.
1283b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  SourceLocation getStartOfNonWhitespace() const {
1293b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    return WhitespaceRange.getEnd();
1303b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  }
1313b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
1323b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// \brief The raw text of the token.
1333b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  ///
1343b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// Contains the raw token text without leading whitespace and without leading
1353b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// escaped newlines.
1363b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  StringRef TokenText;
1373b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
138561211d35b5a2825fba6d0c017044f6896b204fdDaniel Jasper  /// \brief Set to \c true if this token is an unterminated literal.
139561211d35b5a2825fba6d0c017044f6896b204fdDaniel Jasper  bool IsUnterminatedLiteral;
140561211d35b5a2825fba6d0c017044f6896b204fdDaniel Jasper
1410de1c4d152b5fbf0b383e9fa8396e334f029c716Daniel Jasper  /// \brief Contains the kind of block if this token is a brace.
1420de1c4d152b5fbf0b383e9fa8396e334f029c716Daniel Jasper  BraceBlockKind BlockKind;
1430de1c4d152b5fbf0b383e9fa8396e334f029c716Daniel Jasper
1443b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  TokenType Type;
1453b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
1463b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  unsigned SpacesRequiredBefore;
1473b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  bool CanBreakBefore;
1483b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
1493b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  bool ClosesTemplateDeclaration;
1503b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
1513b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// \brief Number of parameters, if this is "(", "[" or "<".
1523b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  ///
1533b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// This is initialized to 1 as we don't need to distinguish functions with
1543b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// 0 parameters from functions with 1 parameter. Thus, we can simply count
1553b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// the number of commas.
1563b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  unsigned ParameterCount;
1573b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
158c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper  /// \brief If this is an opening parenthesis, how are the parameters packed?
159c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper  ParameterPackingKind PackingKind;
160c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper
1613b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// \brief The total length of the line up to and including this token.
1623b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  unsigned TotalLength;
1633b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
1643b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// \brief The length of following tokens until the next natural split point,
1653b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// or the next token that can be broken.
1663b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  unsigned UnbreakableTailLength;
1673b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
1683b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  // FIXME: Come up with a 'cleaner' concept.
1693b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// \brief The binding strength of a token. This is a combined value of
1703b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// operator precedence, parenthesis nesting, etc.
1713b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  unsigned BindingStrength;
1723b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
1733b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// \brief Penalty for inserting a line break before this token.
1743b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  unsigned SplitPenalty;
1753b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
1763b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// \brief If this is the first ObjC selector name in an ObjC method
1773b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// definition or call, this contains the length of the longest name.
1783b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  unsigned LongestObjCSelectorName;
1793b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
1803b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// \brief Stores the number of required fake parentheses and the
1813b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// corresponding operator precedence.
1823b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  ///
1833b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// If multiple fake parentheses start at a token, this vector stores them in
1843b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// reverse order, i.e. inner fake parenthesis first.
1853b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  SmallVector<prec::Level, 4> FakeLParens;
1863b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// \brief Insert this many fake ) after this token for correct indentation.
1873b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  unsigned FakeRParens;
1883b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
1893b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// \brief Is this the last "." or "->" in a builder-type call?
1903b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  bool LastInChainOfCalls;
1913b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
1923b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// \brief Is this token part of a \c DeclStmt defining multiple variables?
1933b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  ///
1943b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// Only set if \c Type == \c TT_StartOfName.
1953b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  bool PartOfMultiVariableDeclStmt;
1963b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
1973b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  bool is(tok::TokenKind Kind) const { return Tok.is(Kind); }
1983b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
1993b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  bool isOneOf(tok::TokenKind K1, tok::TokenKind K2) const {
2003b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    return is(K1) || is(K2);
2013b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  }
2023b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
2033b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  bool isOneOf(tok::TokenKind K1, tok::TokenKind K2, tok::TokenKind K3) const {
2043b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    return is(K1) || is(K2) || is(K3);
2053b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  }
2063b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
2073b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  bool isOneOf(tok::TokenKind K1, tok::TokenKind K2, tok::TokenKind K3,
2083b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko               tok::TokenKind K4, tok::TokenKind K5 = tok::NUM_TOKENS,
2093b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko               tok::TokenKind K6 = tok::NUM_TOKENS,
2103b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko               tok::TokenKind K7 = tok::NUM_TOKENS,
2113b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko               tok::TokenKind K8 = tok::NUM_TOKENS,
2123b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko               tok::TokenKind K9 = tok::NUM_TOKENS,
2133b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko               tok::TokenKind K10 = tok::NUM_TOKENS,
2143b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko               tok::TokenKind K11 = tok::NUM_TOKENS,
2153b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko               tok::TokenKind K12 = tok::NUM_TOKENS) const {
2163b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    return is(K1) || is(K2) || is(K3) || is(K4) || is(K5) || is(K6) || is(K7) ||
2173b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko           is(K8) || is(K9) || is(K10) || is(K11) || is(K12);
2183b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  }
2193b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
2203b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  bool isNot(tok::TokenKind Kind) const { return Tok.isNot(Kind); }
2213b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
2223b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  bool isObjCAtKeyword(tok::ObjCKeywordKind Kind) const {
2233b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    return Tok.isObjCAtKeyword(Kind);
2243b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  }
2253b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
2263b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  bool isAccessSpecifier(bool ColonRequired = true) const {
2273b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    return isOneOf(tok::kw_public, tok::kw_protected, tok::kw_private) &&
2283b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko           (!ColonRequired || (Next && Next->is(tok::colon)));
2293b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  }
2303b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
2313b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  bool isObjCAccessSpecifier() const {
2323b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    return is(tok::at) && Next && (Next->isObjCAtKeyword(tok::objc_public) ||
2333b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko                                   Next->isObjCAtKeyword(tok::objc_protected) ||
2343b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko                                   Next->isObjCAtKeyword(tok::objc_package) ||
2353b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko                                   Next->isObjCAtKeyword(tok::objc_private));
2363b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  }
2373b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
2383b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// \brief Returns whether \p Tok is ([{ or a template opening <.
2393b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  bool opensScope() const {
2403b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    return isOneOf(tok::l_paren, tok::l_brace, tok::l_square) ||
2413b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko           Type == TT_TemplateOpener;
2423b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  }
2430e5a8887ff30957f4bf59cc91965e7a620dbf34aNico Weber  /// \brief Returns whether \p Tok is )]} or a template closing >.
2443b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  bool closesScope() const {
2453b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    return isOneOf(tok::r_paren, tok::r_brace, tok::r_square) ||
2463b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko           Type == TT_TemplateCloser;
2473b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  }
2483b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
2493b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  bool isUnaryOperator() const {
2503b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    switch (Tok.getKind()) {
2513b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    case tok::plus:
2523b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    case tok::plusplus:
2533b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    case tok::minus:
2543b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    case tok::minusminus:
2553b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    case tok::exclaim:
2563b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    case tok::tilde:
2573b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    case tok::kw_sizeof:
2583b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    case tok::kw_alignof:
2593b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko      return true;
2603b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    default:
2613b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko      return false;
2623b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    }
2633b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  }
2643b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  bool isBinaryOperator() const {
2653b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    // Comma is a binary operator, but does not behave as such wrt. formatting.
2663b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    return getPrecedence() > prec::Comma;
2673b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  }
2683b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  bool isTrailingComment() const {
2693b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    return is(tok::comment) && (!Next || Next->NewlinesBefore > 0);
2703b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  }
2713b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
2723b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  prec::Level getPrecedence() const {
2733b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    return getBinOpPrecedence(Tok.getKind(), true, true);
2743b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  }
2753b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
2763b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// \brief Returns the previous token ignoring comments.
2770bdc6434fa0fea933b6ab566eff751afdba40a2aAlexander Kornienko  FormatToken *getPreviousNonComment() const {
2783b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    FormatToken *Tok = Previous;
2793b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    while (Tok != NULL && Tok->is(tok::comment))
2803b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko      Tok = Tok->Previous;
2813b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    return Tok;
2823b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  }
2833b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
2843b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  /// \brief Returns the next token ignoring comments.
2850bdc6434fa0fea933b6ab566eff751afdba40a2aAlexander Kornienko  const FormatToken *getNextNonComment() const {
2863b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    const FormatToken *Tok = Next;
2873b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    while (Tok != NULL && Tok->is(tok::comment))
2883b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko      Tok = Tok->Next;
2893b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko    return Tok;
2903b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  }
2913b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
2923b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  FormatToken *MatchingParen;
2933b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
2943b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  FormatToken *Previous;
2953b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  FormatToken *Next;
2963b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
2973b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienkoprivate:
2983b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko  // Disallow copying.
29953d4f318d9fe8e09bd3afc3114abc04812840992Craig Topper  FormatToken(const FormatToken &) LLVM_DELETED_FUNCTION;
30053d4f318d9fe8e09bd3afc3114abc04812840992Craig Topper  void operator=(const FormatToken &) LLVM_DELETED_FUNCTION;
3013b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko};
3023b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
3033b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko} // namespace format
3043b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko} // namespace clang
3053b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko
3063b71155dc93fb3556dfe8b758ae6e448b6fbb9c8Alexander Kornienko#endif // LLVM_CLANG_FORMAT_FORMAT_TOKEN_H
307