1bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper//===--- UnwrappedLineParser.cpp - Format C++ code ------------------------===// 2bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper// 3bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper// The LLVM Compiler Infrastructure 4bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper// 5bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper// This file is distributed under the University of Illinois Open Source 6bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper// License. See LICENSE.TXT for details. 7bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper// 8bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper//===----------------------------------------------------------------------===// 9bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper/// 10bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper/// \file 11bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper/// \brief This file contains the implementation of the UnwrappedLineParser, 12bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper/// which turns a stream of tokens into UnwrappedLines. 13bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper/// 14bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper//===----------------------------------------------------------------------===// 15bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper 16b1ba0efc3d1dc1daa5d82c40bc504e1f368c4fa0Chandler Carruth#include "UnwrappedLineParser.h" 173ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#include "llvm/ADT/STLExtras.h" 188fa37999164844a926448ef4656bbf7c42070235Manuel Klimek#include "llvm/Support/Debug.h" 193ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#include "llvm/Support/raw_ostream.h" 20bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper 216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define DEBUG_TYPE "format-parser" 226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 23bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jaspernamespace clang { 24bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jaspernamespace format { 25bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper 2696e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimekclass FormatTokenSource { 2796e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimekpublic: 2896e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek virtual ~FormatTokenSource() {} 2996e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek virtual FormatToken *getNextToken() = 0; 3096e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek 3196e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek virtual unsigned getPosition() = 0; 3296e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek virtual FormatToken *setPosition(unsigned Position) = 0; 3396e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek}; 3496e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek 35e50947fcb029475f87578fb40f94982cec46c0c0Craig Toppernamespace { 36e50947fcb029475f87578fb40f94982cec46c0c0Craig Topper 3770b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimekclass ScopedDeclarationState { 3870b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimekpublic: 3970b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek ScopedDeclarationState(UnwrappedLine &Line, std::vector<bool> &Stack, 4070b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek bool MustBeDeclaration) 4170b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek : Line(Line), Stack(Stack) { 4270b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek Line.MustBeDeclaration = MustBeDeclaration; 43836b58f564e07e806d3d0b41a193fde0921013c7Manuel Klimek Stack.push_back(MustBeDeclaration); 4470b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek } 4570b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek ~ScopedDeclarationState() { 4670b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek Stack.pop_back(); 47a32a7fda316289dca6aac1352fde3caf14a1cb2fManuel Klimek if (!Stack.empty()) 48a32a7fda316289dca6aac1352fde3caf14a1cb2fManuel Klimek Line.MustBeDeclaration = Stack.back(); 49a32a7fda316289dca6aac1352fde3caf14a1cb2fManuel Klimek else 50a32a7fda316289dca6aac1352fde3caf14a1cb2fManuel Klimek Line.MustBeDeclaration = true; 5170b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek } 52f7ec1cc7f931833b2cb9876a5e7dfd6bf8681c6aDaniel Jasper 5370b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimekprivate: 5470b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek UnwrappedLine &Line; 5570b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek std::vector<bool> &Stack; 5670b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek}; 5770b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek 58d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimekclass ScopedMacroState : public FormatTokenSource { 59d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimekpublic: 60d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek ScopedMacroState(UnwrappedLine &Line, FormatTokenSource *&TokenSource, 61b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar FormatToken *&ResetToken) 62d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek : Line(Line), TokenSource(TokenSource), ResetToken(ResetToken), 6367d080dafa74c7d126da522fec333a6e52a5ae35Manuel Klimek PreviousLineLevel(Line.Level), PreviousTokenSource(TokenSource), 64b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Token(nullptr) { 65d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek TokenSource = this; 66c37b4d60f926bf440dfcc312bd6482fed3176e33Manuel Klimek Line.Level = 0; 67d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek Line.InPPDirective = true; 68d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek } 69d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek 7058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar ~ScopedMacroState() override { 71d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek TokenSource = PreviousTokenSource; 72d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek ResetToken = Token; 73d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek Line.InPPDirective = false; 74c37b4d60f926bf440dfcc312bd6482fed3176e33Manuel Klimek Line.Level = PreviousLineLevel; 75d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek } 76d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek 77651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines FormatToken *getNextToken() override { 78dd5b1018d97a9666da92d320485a727ac63ee89aManuel Klimek // The \c UnwrappedLineParser guards against this by never calling 79dd5b1018d97a9666da92d320485a727ac63ee89aManuel Klimek // \c getNextToken() after it has encountered the first eof token. 80dd5b1018d97a9666da92d320485a727ac63ee89aManuel Klimek assert(!eof()); 81d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek Token = PreviousTokenSource->getNextToken(); 82d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek if (eof()) 8396e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek return getFakeEOF(); 84d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek return Token; 85d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek } 86d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek 87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned getPosition() override { return PreviousTokenSource->getPosition(); } 8880829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek 89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines FormatToken *setPosition(unsigned Position) override { 9080829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek Token = PreviousTokenSource->setPosition(Position); 9180829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek return Token; 9280829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek } 9380829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek 94d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimekprivate: 9596e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek bool eof() { return Token && Token->HasUnescapedNewline; } 9696e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek 9796e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek FormatToken *getFakeEOF() { 9896e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek static bool EOFInitialized = false; 9996e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek static FormatToken FormatTok; 10096e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (!EOFInitialized) { 10196e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek FormatTok.Tok.startToken(); 10296e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek FormatTok.Tok.setKind(tok::eof); 10396e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek EOFInitialized = true; 10496e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek } 10596e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek return &FormatTok; 106d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek } 107d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek 108d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek UnwrappedLine &Line; 109d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek FormatTokenSource *&TokenSource; 11096e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek FormatToken *&ResetToken; 111c37b4d60f926bf440dfcc312bd6482fed3176e33Manuel Klimek unsigned PreviousLineLevel; 112d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek FormatTokenSource *PreviousTokenSource; 113d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek 11496e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek FormatToken *Token; 115d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek}; 116d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek 117e50947fcb029475f87578fb40f94982cec46c0c0Craig Topper} // end anonymous namespace 118e50947fcb029475f87578fb40f94982cec46c0c0Craig Topper 119bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimekclass ScopedLineState { 120bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimekpublic: 121525fe168c25a8273899281c5d2326c722fc3f2a5Manuel Klimek ScopedLineState(UnwrappedLineParser &Parser, 122525fe168c25a8273899281c5d2326c722fc3f2a5Manuel Klimek bool SwitchToPreprocessorLines = false) 123176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines : Parser(Parser), OriginalLines(Parser.CurrentLines) { 124525fe168c25a8273899281c5d2326c722fc3f2a5Manuel Klimek if (SwitchToPreprocessorLines) 125525fe168c25a8273899281c5d2326c722fc3f2a5Manuel Klimek Parser.CurrentLines = &Parser.PreprocessorDirectives; 126567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper else if (!Parser.Line->Tokens.empty()) 127567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper Parser.CurrentLines = &Parser.Line->Tokens.back().Children; 128176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines PreBlockLine = std::move(Parser.Line); 129176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Parser.Line = llvm::make_unique<UnwrappedLine>(); 130cbb6c41f3cec4a940201a8e2e65743c9f26c3673Daniel Jasper Parser.Line->Level = PreBlockLine->Level; 131cbb6c41f3cec4a940201a8e2e65743c9f26c3673Daniel Jasper Parser.Line->InPPDirective = PreBlockLine->InPPDirective; 132bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek } 133bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek 134bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek ~ScopedLineState() { 135cbb6c41f3cec4a940201a8e2e65743c9f26c3673Daniel Jasper if (!Parser.Line->Tokens.empty()) { 136bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek Parser.addUnwrappedLine(); 137bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek } 138cbb6c41f3cec4a940201a8e2e65743c9f26c3673Daniel Jasper assert(Parser.Line->Tokens.empty()); 139176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Parser.Line = std::move(PreBlockLine); 140567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper if (Parser.CurrentLines == &Parser.PreprocessorDirectives) 141567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper Parser.MustBreakBeforeNextToken = true; 142567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper Parser.CurrentLines = OriginalLines; 143bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek } 144bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek 145bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimekprivate: 146bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek UnwrappedLineParser &Parser; 147bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek 148176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::unique_ptr<UnwrappedLine> PreBlockLine; 149567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper SmallVectorImpl<UnwrappedLine> *OriginalLines; 150bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek}; 151bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek 152651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclass CompoundStatementIndenter { 153651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespublic: 154651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CompoundStatementIndenter(UnwrappedLineParser *Parser, 155651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const FormatStyle &Style, unsigned &LineLevel) 156651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines : LineLevel(LineLevel), OldLineLevel(LineLevel) { 15787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Style.BraceWrapping.AfterControlStatement) 158651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Parser->addUnwrappedLine(); 15987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Style.BraceWrapping.IndentBraces) 160651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ++LineLevel; 161651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ~CompoundStatementIndenter() { LineLevel = OldLineLevel; } 163651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 164651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesprivate: 165651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned &LineLevel; 166651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned OldLineLevel; 167651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 168651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 169e50947fcb029475f87578fb40f94982cec46c0c0Craig Toppernamespace { 170e50947fcb029475f87578fb40f94982cec46c0c0Craig Topper 17180829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimekclass IndexedTokenSource : public FormatTokenSource { 17280829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimekpublic: 17396e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek IndexedTokenSource(ArrayRef<FormatToken *> Tokens) 17480829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek : Tokens(Tokens), Position(-1) {} 17580829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek 176651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines FormatToken *getNextToken() override { 17780829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek ++Position; 17880829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek return Tokens[Position]; 17980829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek } 18080829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek 181651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned getPosition() override { 18280829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek assert(Position >= 0); 18380829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek return Position; 18480829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek } 18580829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek 186651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines FormatToken *setPosition(unsigned P) override { 18780829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek Position = P; 18880829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek return Tokens[Position]; 18980829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek } 19080829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek 191ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek void reset() { Position = -1; } 192ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek 19380829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimekprivate: 19496e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek ArrayRef<FormatToken *> Tokens; 19580829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek int Position; 19680829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek}; 19780829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek 198e50947fcb029475f87578fb40f94982cec46c0c0Craig Topper} // end anonymous namespace 199e50947fcb029475f87578fb40f94982cec46c0c0Craig Topper 200caf42a3ef114900fd2ab927d1a13b4db000515e8Daniel JasperUnwrappedLineParser::UnwrappedLineParser(const FormatStyle &Style, 201176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const AdditionalKeywords &Keywords, 20296e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek ArrayRef<FormatToken *> Tokens, 203caf42a3ef114900fd2ab927d1a13b4db000515e8Daniel Jasper UnwrappedLineConsumer &Callback) 204525fe168c25a8273899281c5d2326c722fc3f2a5Manuel Klimek : Line(new UnwrappedLine), MustBreakBeforeNextToken(false), 205b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar CurrentLines(&Lines), Style(Style), Keywords(Keywords), Tokens(nullptr), 206b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Callback(Callback), AllTokens(Tokens), PPBranchLevel(-1) {} 207ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek 208ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimekvoid UnwrappedLineParser::reset() { 209ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek PPBranchLevel = -1; 210ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek Line.reset(new UnwrappedLine); 211ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek CommentsBeforeNextToken.clear(); 2126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines FormatTok = nullptr; 213ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek MustBreakBeforeNextToken = false; 214ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek PreprocessorDirectives.clear(); 215ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek CurrentLines = &Lines; 216ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek DeclarationScopeStack.clear(); 217ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek PPStack.clear(); 218ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek} 219bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper 220b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarvoid UnwrappedLineParser::parse() { 22180829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek IndexedTokenSource TokenSource(AllTokens); 222ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek do { 223ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek DEBUG(llvm::dbgs() << "----\n"); 224ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek reset(); 225ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek Tokens = &TokenSource; 226ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek TokenSource.reset(); 227ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek 228ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek readToken(); 229ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek parseFile(); 230ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek // Create line with eof token. 231ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek pushToken(FormatTok); 232ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek addUnwrappedLine(); 233ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek 234ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek for (SmallVectorImpl<UnwrappedLine>::iterator I = Lines.begin(), 235ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek E = Lines.end(); 236ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek I != E; ++I) { 237ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek Callback.consumeUnwrappedLine(*I); 238ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek } 239ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek Callback.finishRun(); 240ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek Lines.clear(); 241ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek while (!PPLevelBranchIndex.empty() && 242ac4d0181928e3e22fa3929ca1b24ae7f14fb7628Daniel Jasper PPLevelBranchIndex.back() + 1 >= PPLevelBranchCount.back()) { 243ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek PPLevelBranchIndex.resize(PPLevelBranchIndex.size() - 1); 244ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek PPLevelBranchCount.resize(PPLevelBranchCount.size() - 1); 245ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek } 246ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek if (!PPLevelBranchIndex.empty()) { 247ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek ++PPLevelBranchIndex.back(); 248ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek assert(PPLevelBranchIndex.size() == PPLevelBranchCount.size()); 249ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek assert(PPLevelBranchIndex.back() <= PPLevelBranchCount.back()); 250ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek } 251ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek } while (!PPLevelBranchIndex.empty()); 252d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek} 253d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek 25467d080dafa74c7d126da522fec333a6e52a5ae35Manuel Klimekvoid UnwrappedLineParser::parseFile() { 255b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // The top-level context in a file always has declarations, except for pre- 256b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // processor directives and JavaScript files. 257b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar bool MustBeDeclaration = 258b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar !Line->InPPDirective && Style.Language != FormatStyle::LK_JavaScript; 259b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ScopedDeclarationState DeclarationState(*Line, DeclarationScopeStack, 260b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar MustBeDeclaration); 2612726877196b41b922f10f794801b313980e1a8adNico Weber parseLevel(/*HasOpeningBrace=*/false); 262d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek // Make sure to format the remaining tokens. 26386721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek flushComments(true); 264d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek addUnwrappedLine(); 265bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper} 266bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper 26767d080dafa74c7d126da522fec333a6e52a5ae35Manuel Klimekvoid UnwrappedLineParser::parseLevel(bool HasOpeningBrace) { 268e865cc5e183a25983bc79aca2c9bc9a6fb775ab2Daniel Jasper bool SwitchLabelEncountered = false; 269bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper do { 27087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar tok::TokenKind kind = FormatTok->Tok.getKind(); 27187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (FormatTok->Type == TT_MacroBlockBegin) { 27287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar kind = tok::l_brace; 27387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } else if (FormatTok->Type == TT_MacroBlockEnd) { 27487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar kind = tok::r_brace; 27587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 27687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 27787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar switch (kind) { 278bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper case tok::comment: 27905b1ac8791ee89fdf0b275631ab8118febc7c33dDaniel Jasper nextToken(); 28005b1ac8791ee89fdf0b275631ab8118febc7c33dDaniel Jasper addUnwrappedLine(); 281bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper break; 282bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper case tok::l_brace: 28370b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek // FIXME: Add parameter whether this can happen - if this happens, we must 28470b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek // be in a non-declaration context. 28587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (!FormatTok->is(TT_MacroBlockBegin) && tryToParseBracedList()) 28687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar continue; 2872726877196b41b922f10f794801b313980e1a8adNico Weber parseBlock(/*MustBeDeclaration=*/false); 288bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper addUnwrappedLine(); 289bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper break; 290bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper case tok::r_brace: 29167d080dafa74c7d126da522fec333a6e52a5ae35Manuel Klimek if (HasOpeningBrace) 29267d080dafa74c7d126da522fec333a6e52a5ae35Manuel Klimek return; 29367d080dafa74c7d126da522fec333a6e52a5ae35Manuel Klimek nextToken(); 29467d080dafa74c7d126da522fec333a6e52a5ae35Manuel Klimek addUnwrappedLine(); 295a5342db6fcc6ee3fae084f584ecb019726de9ccaManuel Klimek break; 296e865cc5e183a25983bc79aca2c9bc9a6fb775ab2Daniel Jasper case tok::kw_default: 297e865cc5e183a25983bc79aca2c9bc9a6fb775ab2Daniel Jasper case tok::kw_case: 29867cf1dbdd2e1e167a34b849386916450649564cbDaniel Jasper if (!SwitchLabelEncountered && 29967cf1dbdd2e1e167a34b849386916450649564cbDaniel Jasper (Style.IndentCaseLabels || (Line->InPPDirective && Line->Level == 1))) 30067cf1dbdd2e1e167a34b849386916450649564cbDaniel Jasper ++Line->Level; 301e865cc5e183a25983bc79aca2c9bc9a6fb775ab2Daniel Jasper SwitchLabelEncountered = true; 302e865cc5e183a25983bc79aca2c9bc9a6fb775ab2Daniel Jasper parseStructuralElement(); 303e865cc5e183a25983bc79aca2c9bc9a6fb775ab2Daniel Jasper break; 304bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper default: 305f0ab0a38d9482eef5495db845ff53ee689f9c80eManuel Klimek parseStructuralElement(); 306bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper break; 307bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper } 308bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper } while (!eof()); 309bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper} 310bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper 311b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarvoid UnwrappedLineParser::calculateBraceTypes(bool ExpectClassBody) { 31280829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek // We'll parse forward through the tokens until we hit 31380829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek // a closing brace or eof - note that getNextToken() will 31480829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek // parse macros, so this will magically work inside macro 31580829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek // definitions, too. 31680829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek unsigned StoredPosition = Tokens->getPosition(); 31796e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek FormatToken *Tok = FormatTok; 3184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const FormatToken *PrevTok = getPreviousToken(); 31980829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek // Keep a stack of positions of lbrace tokens. We will 32080829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek // update information about whether an lbrace starts a 32180829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek // braced init list or a different block during the loop. 3220de1c4d152b5fbf0b383e9fa8396e334f029c716Daniel Jasper SmallVector<FormatToken *, 8> LBraceStack; 32396e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek assert(Tok->Tok.is(tok::l_brace)); 32480829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek do { 32587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // Get next non-comment token. 32602eacc2cf85fe11577bf6ff20f6c203e87147c57Daniel Jasper FormatToken *NextTok; 327f50dbfae1c5801d72d57fe5af90ad58871cea321Daniel Jasper unsigned ReadTokens = 0; 32802eacc2cf85fe11577bf6ff20f6c203e87147c57Daniel Jasper do { 32902eacc2cf85fe11577bf6ff20f6c203e87147c57Daniel Jasper NextTok = Tokens->getNextToken(); 330f50dbfae1c5801d72d57fe5af90ad58871cea321Daniel Jasper ++ReadTokens; 33102eacc2cf85fe11577bf6ff20f6c203e87147c57Daniel Jasper } while (NextTok->is(tok::comment)); 33202eacc2cf85fe11577bf6ff20f6c203e87147c57Daniel Jasper 33396e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek switch (Tok->Tok.getKind()) { 33480829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek case tok::l_brace: 3354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Style.Language == FormatStyle::LK_JavaScript && PrevTok && 3364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar PrevTok->is(tok::colon)) 3374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // In TypeScript's TypeMemberLists, there can be semicolons between the 3384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // individual members. 3394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Tok->BlockKind = BK_BracedInit; 3404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar else 3414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Tok->BlockKind = BK_Unknown; 3420de1c4d152b5fbf0b383e9fa8396e334f029c716Daniel Jasper LBraceStack.push_back(Tok); 34380829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek break; 34480829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek case tok::r_brace: 3454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (LBraceStack.empty()) 3464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar break; 3474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (LBraceStack.back()->BlockKind == BK_Unknown) { 3484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool ProbablyBracedList = false; 3494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Style.Language == FormatStyle::LK_Proto) { 3504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ProbablyBracedList = NextTok->isOneOf(tok::comma, tok::r_square); 3514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else { 3524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Using OriginalColumn to distinguish between ObjC methods and 3534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // binary operators is a bit hacky. 3544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool NextIsObjCMethod = NextTok->isOneOf(tok::plus, tok::minus) && 3554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar NextTok->OriginalColumn == 0; 3564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 3574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // If there is a comma, semicolon or right paren after the closing 3584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // brace, we assume this is a braced initializer list. Note that 3594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // regardless how we mark inner braces here, we will overwrite the 3604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // BlockKind later if we parse a braced list (where all blocks 3614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // inside are by default braced lists), or when we explicitly detect 3624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // blocks (for example while parsing lambdas). 3634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // 3644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // We exclude + and - as they can be ObjC visibility modifiers. 3654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ProbablyBracedList = 3664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar (Style.Language == FormatStyle::LK_JavaScript && 3674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar NextTok->isOneOf(Keywords.kw_of, Keywords.kw_in)) || 3684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar NextTok->isOneOf(tok::comma, tok::period, tok::colon, 3694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar tok::r_paren, tok::r_square, tok::l_brace, 3704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar tok::l_square, tok::l_paren, tok::ellipsis) || 3714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar (NextTok->is(tok::semi) && 3724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar (!ExpectClassBody || LBraceStack.size() != 1)) || 3734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar (NextTok->isBinaryOperator() && !NextIsObjCMethod); 3744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 3754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (ProbablyBracedList) { 3764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Tok->BlockKind = BK_BracedInit; 3774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar LBraceStack.back()->BlockKind = BK_BracedInit; 3784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else { 3794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Tok->BlockKind = BK_Block; 3804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar LBraceStack.back()->BlockKind = BK_Block; 38180829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek } 38280829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek } 3834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar LBraceStack.pop_back(); 38480829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek break; 385651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case tok::at: 38680829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek case tok::semi: 38780829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek case tok::kw_if: 38880829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek case tok::kw_while: 38980829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek case tok::kw_for: 39080829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek case tok::kw_switch: 39180829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek case tok::kw_try: 3920e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case tok::kw___try: 3934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!LBraceStack.empty() && LBraceStack.back()->BlockKind == BK_Unknown) 3940de1c4d152b5fbf0b383e9fa8396e334f029c716Daniel Jasper LBraceStack.back()->BlockKind = BK_Block; 39580829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek break; 39680829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek default: 39780829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek break; 39880829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek } 3994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar PrevTok = Tok; 40080829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek Tok = NextTok; 40131e44f7a5d50ab8f7f623a7d2e18d5d877ef400dManuel Klimek } while (Tok->Tok.isNot(tok::eof) && !LBraceStack.empty()); 4024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 40380829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek // Assume other blocks for all unclosed opening braces. 40480829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek for (unsigned i = 0, e = LBraceStack.size(); i != e; ++i) { 4050de1c4d152b5fbf0b383e9fa8396e334f029c716Daniel Jasper if (LBraceStack[i]->BlockKind == BK_Unknown) 4060de1c4d152b5fbf0b383e9fa8396e334f029c716Daniel Jasper LBraceStack[i]->BlockKind = BK_Block; 40780829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek } 40831e44f7a5d50ab8f7f623a7d2e18d5d877ef400dManuel Klimek 40980829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek FormatTok = Tokens->setPosition(StoredPosition); 41080829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek} 41180829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek 412aabfb2712e180bb11e5dfc4f2a273890a6c5da66Manuel Klimekvoid UnwrappedLineParser::parseBlock(bool MustBeDeclaration, bool AddLevel, 413aabfb2712e180bb11e5dfc4f2a273890a6c5da66Manuel Klimek bool MunchSemi) { 41487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar assert(FormatTok->isOneOf(tok::l_brace, TT_MacroBlockBegin) && 41587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar "'{' or macro block token expected"); 41687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const bool MacroBlock = FormatTok->is(TT_MacroBlockBegin); 41787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar FormatTok->BlockKind = BK_Block; 41887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 419e865cc5e183a25983bc79aca2c9bc9a6fb775ab2Daniel Jasper unsigned InitialLevel = Line->Level; 420bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper nextToken(); 421bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper 42287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (MacroBlock && FormatTok->is(tok::l_paren)) 42387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar parseParens(); 42487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 4252f1ac41a6d8d202dcc39ab8eb56ccea823dc062eManuel Klimek addUnwrappedLine(); 426bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper 42770b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek ScopedDeclarationState DeclarationState(*Line, DeclarationScopeStack, 42870b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek MustBeDeclaration); 429eff18b9b6f1218a6bbe4869989b08867823a4e75Daniel Jasper if (AddLevel) 430eff18b9b6f1218a6bbe4869989b08867823a4e75Daniel Jasper ++Line->Level; 4312726877196b41b922f10f794801b313980e1a8adNico Weber parseLevel(/*HasOpeningBrace=*/true); 43215757316d67cb7a854d53a0402d67ad58347600aAlexander Kornienko 4334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (eof()) 4344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return; 4354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 43687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (MacroBlock ? !FormatTok->is(TT_MacroBlockEnd) 43787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : !FormatTok->is(tok::r_brace)) { 438e865cc5e183a25983bc79aca2c9bc9a6fb775ab2Daniel Jasper Line->Level = InitialLevel; 43987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar FormatTok->BlockKind = BK_Block; 44067d080dafa74c7d126da522fec333a6e52a5ae35Manuel Klimek return; 44186721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek } 442393b008bcebb0a678a5a0a93ad69e28a30a62e84Alexander Kornienko 443f9955d309d3de328e65563baf2d34571249dccbbDaniel Jasper nextToken(); // Munch the closing brace. 44487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 44587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (MacroBlock && FormatTok->is(tok::l_paren)) 44687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar parseParens(); 44787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 448aabfb2712e180bb11e5dfc4f2a273890a6c5da66Manuel Klimek if (MunchSemi && FormatTok->Tok.is(tok::semi)) 449aabfb2712e180bb11e5dfc4f2a273890a6c5da66Manuel Klimek nextToken(); 450e865cc5e183a25983bc79aca2c9bc9a6fb775ab2Daniel Jasper Line->Level = InitialLevel; 451bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper} 452bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper 45358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstatic bool isGoogScope(const UnwrappedLine &Line) { 4540e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // FIXME: Closure-library specific stuff should not be hard-coded but be 4550e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // configurable. 4566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Line.Tokens.size() < 4) 4576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return false; 4586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto I = Line.Tokens.begin(); 4596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (I->Tok->TokenText != "goog") 4606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return false; 4616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ++I; 4626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (I->Tok->isNot(tok::period)) 4636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return false; 4646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ++I; 4656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (I->Tok->TokenText != "scope") 4666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return false; 4676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ++I; 4686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return I->Tok->is(tok::l_paren); 4696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 4706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 471176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstatic bool ShouldBreakBeforeBrace(const FormatStyle &Style, 472176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const FormatToken &InitialToken) { 47387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (InitialToken.is(tok::kw_namespace)) 47487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return Style.BraceWrapping.AfterNamespace; 47587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (InitialToken.is(tok::kw_class)) 47687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return Style.BraceWrapping.AfterClass; 47787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (InitialToken.is(tok::kw_union)) 47887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return Style.BraceWrapping.AfterUnion; 47987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (InitialToken.is(tok::kw_struct)) 48087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return Style.BraceWrapping.AfterStruct; 48187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return false; 482176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 483176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 484753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimekvoid UnwrappedLineParser::parseChildBlock() { 485753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek FormatTok->BlockKind = BK_Block; 486753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek nextToken(); 487753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek { 4886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool GoogScope = 48958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar Style.Language == FormatStyle::LK_JavaScript && isGoogScope(*Line); 490753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek ScopedLineState LineState(*this); 491753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek ScopedDeclarationState DeclarationState(*Line, DeclarationScopeStack, 492753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek /*MustBeDeclaration=*/false); 4936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Line->Level += GoogScope ? 0 : 1; 494753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek parseLevel(/*HasOpeningBrace=*/true); 49558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar flushComments(isOnNewLine(*FormatTok)); 4966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Line->Level -= GoogScope ? 0 : 1; 497753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek } 498753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek nextToken(); 499753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek} 500753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek 501bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jaspervoid UnwrappedLineParser::parsePPDirective() { 50296e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek assert(FormatTok->Tok.is(tok::hash) && "'#' expected"); 503b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ScopedMacroState MacroState(*Line, Tokens, FormatTok); 504a080a187fa7e538da3212c7d5e678e4b7ae03253Manuel Klimek nextToken(); 505a080a187fa7e538da3212c7d5e678e4b7ae03253Manuel Klimek 5066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!FormatTok->Tok.getIdentifierInfo()) { 507bd04f2aa2247f2fda3fd8f3fee90479ba2c94499Manuel Klimek parsePPUnknown(); 508a080a187fa7e538da3212c7d5e678e4b7ae03253Manuel Klimek return; 509bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper } 510a080a187fa7e538da3212c7d5e678e4b7ae03253Manuel Klimek 51196e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek switch (FormatTok->Tok.getIdentifierInfo()->getPPKeywordID()) { 512d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek case tok::pp_define: 513d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek parsePPDefine(); 5146fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko return; 5156fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko case tok::pp_if: 516ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek parsePPIf(/*IfDef=*/false); 5176fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko break; 5186fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko case tok::pp_ifdef: 5196fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko case tok::pp_ifndef: 520ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek parsePPIf(/*IfDef=*/true); 5216fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko break; 5226fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko case tok::pp_else: 5236fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko parsePPElse(); 5246fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko break; 5256fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko case tok::pp_elif: 5266fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko parsePPElIf(); 5276fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko break; 5286fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko case tok::pp_endif: 5296fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko parsePPEndIf(); 530d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek break; 531d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek default: 532d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek parsePPUnknown(); 533d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek break; 534d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek } 535d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek} 536d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek 5376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid UnwrappedLineParser::conditionalCompilationCondition(bool Unreachable) { 5386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Unreachable || (!PPStack.empty() && PPStack.back() == PP_Unreachable)) 5396fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko PPStack.push_back(PP_Unreachable); 5406fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko else 5416fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko PPStack.push_back(PP_Conditional); 5426fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko} 5436fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko 5446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid UnwrappedLineParser::conditionalCompilationStart(bool Unreachable) { 545ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek ++PPBranchLevel; 546ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek assert(PPBranchLevel >= 0 && PPBranchLevel <= (int)PPLevelBranchIndex.size()); 547ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek if (PPBranchLevel == (int)PPLevelBranchIndex.size()) { 548ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek PPLevelBranchIndex.push_back(0); 549ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek PPLevelBranchCount.push_back(0); 550ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek } 551ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek PPChainBranchIndex.push(0); 5526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool Skip = PPLevelBranchIndex[PPBranchLevel] > 0; 5536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines conditionalCompilationCondition(Unreachable || Skip); 5546fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko} 5556fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko 5566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid UnwrappedLineParser::conditionalCompilationAlternative() { 5576fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko if (!PPStack.empty()) 5586fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko PPStack.pop_back(); 559ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek assert(PPBranchLevel < (int)PPLevelBranchIndex.size()); 560ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek if (!PPChainBranchIndex.empty()) 561ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek ++PPChainBranchIndex.top(); 5626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines conditionalCompilationCondition( 5636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines PPBranchLevel >= 0 && !PPChainBranchIndex.empty() && 5646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines PPLevelBranchIndex[PPBranchLevel] != PPChainBranchIndex.top()); 5656fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko} 5666fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko 5676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid UnwrappedLineParser::conditionalCompilationEnd() { 568ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek assert(PPBranchLevel < (int)PPLevelBranchIndex.size()); 569ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek if (PPBranchLevel >= 0 && !PPChainBranchIndex.empty()) { 570ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek if (PPChainBranchIndex.top() + 1 > PPLevelBranchCount[PPBranchLevel]) { 571ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek PPLevelBranchCount[PPBranchLevel] = PPChainBranchIndex.top() + 1; 572ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek } 573ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek } 574651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Guard against #endif's without #if. 575651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (PPBranchLevel > 0) 576651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines --PPBranchLevel; 577ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek if (!PPChainBranchIndex.empty()) 578ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek PPChainBranchIndex.pop(); 5796fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko if (!PPStack.empty()) 5806fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko PPStack.pop_back(); 5816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 5826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 5836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid UnwrappedLineParser::parsePPIf(bool IfDef) { 5846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines nextToken(); 5856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool IsLiteralFalse = (FormatTok->Tok.isLiteral() && 5860e2c34f92f00628d48968dfea096d36381f494cbStephen Hines FormatTok->Tok.getLiteralData() != nullptr && 5876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines StringRef(FormatTok->Tok.getLiteralData(), 5886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines FormatTok->Tok.getLength()) == "0") || 5896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines FormatTok->Tok.is(tok::kw_false); 5906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines conditionalCompilationStart(!IfDef && IsLiteralFalse); 5916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines parsePPUnknown(); 5926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 5936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 5946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid UnwrappedLineParser::parsePPElse() { 5956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines conditionalCompilationAlternative(); 5966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines parsePPUnknown(); 5976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 5986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 5996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid UnwrappedLineParser::parsePPElIf() { parsePPElse(); } 6006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 6016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid UnwrappedLineParser::parsePPEndIf() { 6026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines conditionalCompilationEnd(); 6036fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko parsePPUnknown(); 6046fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko} 6056fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko 606d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimekvoid UnwrappedLineParser::parsePPDefine() { 607d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek nextToken(); 608d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek 60996e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (FormatTok->Tok.getKind() != tok::identifier) { 610d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek parsePPUnknown(); 611d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek return; 612d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek } 613d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek nextToken(); 61496e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (FormatTok->Tok.getKind() == tok::l_paren && 61596e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek FormatTok->WhitespaceRange.getBegin() == 61696e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek FormatTok->WhitespaceRange.getEnd()) { 617d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek parseParens(); 618d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek } 619d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek addUnwrappedLine(); 620526ed11ad9743c773df76bd1649d33fb92c2b8cbManuel Klimek Line->Level = 1; 621c3d0c82ab0ce17c684c0192f14059d8e4d63156cManuel Klimek 622c3d0c82ab0ce17c684c0192f14059d8e4d63156cManuel Klimek // Errors during a preprocessor directive can only affect the layout of the 623c3d0c82ab0ce17c684c0192f14059d8e4d63156cManuel Klimek // preprocessor directive, and thus we ignore them. An alternative approach 624c3d0c82ab0ce17c684c0192f14059d8e4d63156cManuel Klimek // would be to use the same approach we use on the file level (no 625c3d0c82ab0ce17c684c0192f14059d8e4d63156cManuel Klimek // re-indentation if there was a structural error) within the macro 626c3d0c82ab0ce17c684c0192f14059d8e4d63156cManuel Klimek // definition. 627d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek parseFile(); 628d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek} 629d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek 630d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimekvoid UnwrappedLineParser::parsePPUnknown() { 631a080a187fa7e538da3212c7d5e678e4b7ae03253Manuel Klimek do { 632a080a187fa7e538da3212c7d5e678e4b7ae03253Manuel Klimek nextToken(); 633a080a187fa7e538da3212c7d5e678e4b7ae03253Manuel Klimek } while (!eof()); 634a080a187fa7e538da3212c7d5e678e4b7ae03253Manuel Klimek addUnwrappedLine(); 635bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper} 636bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper 63799b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko// Here we blacklist certain tokens that are not usually the first token in an 63899b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko// unwrapped line. This is used in attempt to distinguish macro calls without 63999b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko// trailing semicolons from other constructs split to several lines. 6403ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarstatic bool tokenCanStartNewLine(const clang::Token &Tok) { 64199b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko // Semicolon can be a null-statement, l_square can be a start of a macro or 64299b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko // a C++11 attribute, but this doesn't seem to be common. 64399b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko return Tok.isNot(tok::semi) && Tok.isNot(tok::l_brace) && 64499b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko Tok.isNot(tok::l_square) && 64599b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko // Tokens that can only be used as binary operators and a part of 64699b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko // overloaded operator names. 64799b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko Tok.isNot(tok::period) && Tok.isNot(tok::periodstar) && 64899b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko Tok.isNot(tok::arrow) && Tok.isNot(tok::arrowstar) && 64999b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko Tok.isNot(tok::less) && Tok.isNot(tok::greater) && 65099b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko Tok.isNot(tok::slash) && Tok.isNot(tok::percent) && 65199b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko Tok.isNot(tok::lessless) && Tok.isNot(tok::greatergreater) && 65299b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko Tok.isNot(tok::equal) && Tok.isNot(tok::plusequal) && 65399b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko Tok.isNot(tok::minusequal) && Tok.isNot(tok::starequal) && 65499b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko Tok.isNot(tok::slashequal) && Tok.isNot(tok::percentequal) && 65599b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko Tok.isNot(tok::ampequal) && Tok.isNot(tok::pipeequal) && 65699b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko Tok.isNot(tok::caretequal) && Tok.isNot(tok::greatergreaterequal) && 65799b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko Tok.isNot(tok::lesslessequal) && 65899b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko // Colon is used in labels, base class lists, initializer lists, 65999b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko // range-based for loops, ternary operator, but should never be the 66099b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko // first token in an unwrapped line. 6616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Tok.isNot(tok::colon) && 6626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // 'noexcept' is a trailing annotation. 6636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Tok.isNot(tok::kw_noexcept); 66499b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko} 66599b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko 6664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic bool mustBeJSIdent(const AdditionalKeywords &Keywords, 6674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const FormatToken *FormatTok) { 6684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // FIXME: This returns true for C/C++ keywords like 'struct'. 6694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return FormatTok->is(tok::identifier) && 6704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar (FormatTok->Tok.getIdentifierInfo() == nullptr || 6714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar !FormatTok->isOneOf(Keywords.kw_in, Keywords.kw_of, Keywords.kw_as, 6724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Keywords.kw_async, Keywords.kw_await, 6734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Keywords.kw_yield, Keywords.kw_finally, 6744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Keywords.kw_function, Keywords.kw_import, 6754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Keywords.kw_is, Keywords.kw_let, Keywords.kw_var, 6764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Keywords.kw_abstract, Keywords.kw_extends, 6774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Keywords.kw_implements, Keywords.kw_instanceof, 6784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Keywords.kw_interface, Keywords.kw_throws)); 6794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 6804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 6814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic bool mustBeJSIdentOrValue(const AdditionalKeywords &Keywords, 6824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const FormatToken *FormatTok) { 6834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return FormatTok->Tok.isLiteral() || mustBeJSIdent(Keywords, FormatTok); 6844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 6854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 6864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// isJSDeclOrStmt returns true if |FormatTok| starts a declaration or statement 6874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// when encountered after a value (see mustBeJSIdentOrValue). 6884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic bool isJSDeclOrStmt(const AdditionalKeywords &Keywords, 6894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const FormatToken *FormatTok) { 6904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return FormatTok->isOneOf( 6914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar tok::kw_return, Keywords.kw_yield, 6924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // conditionals 6934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar tok::kw_if, tok::kw_else, 6944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // loops 6954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar tok::kw_for, tok::kw_while, tok::kw_do, tok::kw_continue, tok::kw_break, 6964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // switch/case 6974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar tok::kw_switch, tok::kw_case, 6984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // exceptions 6994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar tok::kw_throw, tok::kw_try, tok::kw_catch, Keywords.kw_finally, 7004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // declaration 7014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar tok::kw_const, tok::kw_class, Keywords.kw_var, Keywords.kw_let, 7024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Keywords.kw_async, Keywords.kw_function, 7034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // import/export 7044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Keywords.kw_import, tok::kw_export); 7054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 7064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 7074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// readTokenWithJavaScriptASI reads the next token and terminates the current 7084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// line if JavaScript Automatic Semicolon Insertion must 7094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// happen between the current token and the next token. 7104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 7114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// This method is conservative - it cannot cover all edge cases of JavaScript, 7124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// but only aims to correctly handle certain well known cases. It *must not* 7134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// return true in speculative cases. 7144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid UnwrappedLineParser::readTokenWithJavaScriptASI() { 7154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar FormatToken *Previous = FormatTok; 7164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar readToken(); 7174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar FormatToken *Next = FormatTok; 7184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 7194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool IsOnSameLine = 7204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CommentsBeforeNextToken.empty() 7214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ? Next->NewlinesBefore == 0 7224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : CommentsBeforeNextToken.front()->NewlinesBefore == 0; 7234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (IsOnSameLine) 7244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return; 7254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 7264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool PreviousMustBeValue = mustBeJSIdentOrValue(Keywords, Previous); 7274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (PreviousMustBeValue && Line && Line->Tokens.size() > 1) { 7284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // If the token before the previous one is an '@', the previous token is an 7294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // annotation and can precede another identifier/value. 7304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const FormatToken *PrePrevious = std::prev(Line->Tokens.end(), 2)->Tok; 7314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (PrePrevious->is(tok::at)) 7324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return; 7334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 7344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Next->is(tok::exclaim) && PreviousMustBeValue) 7354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar addUnwrappedLine(); 7364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool NextMustBeValue = mustBeJSIdentOrValue(Keywords, Next); 7374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (NextMustBeValue && (PreviousMustBeValue || 7384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Previous->isOneOf(tok::r_square, tok::r_paren, 7394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar tok::plusplus, tok::minusminus))) 7404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar addUnwrappedLine(); 7414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (PreviousMustBeValue && isJSDeclOrStmt(Keywords, Next)) 7424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar addUnwrappedLine(); 7434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 7444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 745f0ab0a38d9482eef5495db845ff53ee689f9c80eManuel Klimekvoid UnwrappedLineParser::parseStructuralElement() { 7464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar assert(!FormatTok->is(tok::l_brace)); 7474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Style.Language == FormatStyle::LK_TableGen && 7484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar FormatTok->is(tok::pp_include)) { 7494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar nextToken(); 7504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (FormatTok->is(tok::string_literal)) 7514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar nextToken(); 7524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar addUnwrappedLine(); 7534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return; 7544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 75596e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek switch (FormatTok->Tok.getKind()) { 7566092d4ed09a2368871993d9a45717f24394329ceNico Weber case tok::at: 7576092d4ed09a2368871993d9a45717f24394329ceNico Weber nextToken(); 75896e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (FormatTok->Tok.is(tok::l_brace)) { 759d74fcdb630dad817f5d462edd6d12bb95e3f27f1Nico Weber parseBracedList(); 760d74fcdb630dad817f5d462edd6d12bb95e3f27f1Nico Weber break; 761d74fcdb630dad817f5d462edd6d12bb95e3f27f1Nico Weber } 76296e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek switch (FormatTok->Tok.getObjCKeywordID()) { 7636092d4ed09a2368871993d9a45717f24394329ceNico Weber case tok::objc_public: 7646092d4ed09a2368871993d9a45717f24394329ceNico Weber case tok::objc_protected: 7656092d4ed09a2368871993d9a45717f24394329ceNico Weber case tok::objc_package: 7666092d4ed09a2368871993d9a45717f24394329ceNico Weber case tok::objc_private: 7676092d4ed09a2368871993d9a45717f24394329ceNico Weber return parseAccessSpecifier(); 76827d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber case tok::objc_interface: 76950767d8c8f2f667255bdb99692c0467ce992bc67Nico Weber case tok::objc_implementation: 77050767d8c8f2f667255bdb99692c0467ce992bc67Nico Weber return parseObjCInterfaceOrImplementation(); 7711abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber case tok::objc_protocol: 7721abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber return parseObjCProtocol(); 773049c44767370b7257d17a5c32d407f19efa01c6fNico Weber case tok::objc_end: 774049c44767370b7257d17a5c32d407f19efa01c6fNico Weber return; // Handled by the caller. 775b530fa374a8d4d96e61bf1dae8f4a73f4b3d2436Nico Weber case tok::objc_optional: 776b530fa374a8d4d96e61bf1dae8f4a73f4b3d2436Nico Weber case tok::objc_required: 777b530fa374a8d4d96e61bf1dae8f4a73f4b3d2436Nico Weber nextToken(); 778b530fa374a8d4d96e61bf1dae8f4a73f4b3d2436Nico Weber addUnwrappedLine(); 779b530fa374a8d4d96e61bf1dae8f4a73f4b3d2436Nico Weber return; 78087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case tok::objc_autoreleasepool: 78187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar nextToken(); 78287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (FormatTok->Tok.is(tok::l_brace)) { 78387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Style.BraceWrapping.AfterObjCDeclaration) 78487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar addUnwrappedLine(); 78587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar parseBlock(/*MustBeDeclaration=*/false); 78687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 78787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar addUnwrappedLine(); 78887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return; 7890e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case tok::objc_try: 7900e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // This branch isn't strictly necessary (the kw_try case below would 7910e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // do this too after the tok::at is parsed above). But be explicit. 7920e2c34f92f00628d48968dfea096d36381f494cbStephen Hines parseTryCatch(); 7930e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return; 7946092d4ed09a2368871993d9a45717f24394329ceNico Weber default: 7956092d4ed09a2368871993d9a45717f24394329ceNico Weber break; 7966092d4ed09a2368871993d9a45717f24394329ceNico Weber } 7976092d4ed09a2368871993d9a45717f24394329ceNico Weber break; 798176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case tok::kw_asm: 799176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines nextToken(); 800176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (FormatTok->is(tok::l_brace)) { 801b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar FormatTok->Type = TT_InlineASMBrace; 8020e2c34f92f00628d48968dfea096d36381f494cbStephen Hines nextToken(); 803176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines while (FormatTok && FormatTok->isNot(tok::eof)) { 804176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (FormatTok->is(tok::r_brace)) { 805b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar FormatTok->Type = TT_InlineASMBrace; 806176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines nextToken(); 807b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar addUnwrappedLine(); 808176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 809176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 8100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines FormatTok->Finalized = true; 811176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines nextToken(); 812176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 813176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 814176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 81515757316d67cb7a854d53a0402d67ad58347600aAlexander Kornienko case tok::kw_namespace: 81615757316d67cb7a854d53a0402d67ad58347600aAlexander Kornienko parseNamespace(); 81715757316d67cb7a854d53a0402d67ad58347600aAlexander Kornienko return; 8181f94f2b484dc74e09fe31dd5ea9d3f715be6c133Dmitri Gribenko case tok::kw_inline: 8191f94f2b484dc74e09fe31dd5ea9d3f715be6c133Dmitri Gribenko nextToken(); 82096e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (FormatTok->Tok.is(tok::kw_namespace)) { 8211f94f2b484dc74e09fe31dd5ea9d3f715be6c133Dmitri Gribenko parseNamespace(); 8221f94f2b484dc74e09fe31dd5ea9d3f715be6c133Dmitri Gribenko return; 8231f94f2b484dc74e09fe31dd5ea9d3f715be6c133Dmitri Gribenko } 8241f94f2b484dc74e09fe31dd5ea9d3f715be6c133Dmitri Gribenko break; 825a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko case tok::kw_public: 826a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko case tok::kw_protected: 827a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko case tok::kw_private: 8280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (Style.Language == FormatStyle::LK_Java || 8290e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Style.Language == FormatStyle::LK_JavaScript) 830176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines nextToken(); 831176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines else 832176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines parseAccessSpecifier(); 833bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper return; 834a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko case tok::kw_if: 835a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko parseIfThenElse(); 836a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko return; 8372e97cfc78743fcaa988e3c45f7af1002063f780cAlexander Kornienko case tok::kw_for: 8382e97cfc78743fcaa988e3c45f7af1002063f780cAlexander Kornienko case tok::kw_while: 8392e97cfc78743fcaa988e3c45f7af1002063f780cAlexander Kornienko parseForOrWhileLoop(); 8402e97cfc78743fcaa988e3c45f7af1002063f780cAlexander Kornienko return; 841a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko case tok::kw_do: 842a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko parseDoWhile(); 843a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko return; 844a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko case tok::kw_switch: 845a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko parseSwitch(); 846a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko return; 847a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko case tok::kw_default: 848a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko nextToken(); 849a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko parseLabel(); 850a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko return; 851a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko case tok::kw_case: 852a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko parseCaseLabel(); 853bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper return; 8546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case tok::kw_try: 8550e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case tok::kw___try: 8566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines parseTryCatch(); 8576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return; 858d19dc2ddf3f8630cfdbefec490c0000c14bee6bdManuel Klimek case tok::kw_extern: 859d19dc2ddf3f8630cfdbefec490c0000c14bee6bdManuel Klimek nextToken(); 86096e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (FormatTok->Tok.is(tok::string_literal)) { 861d19dc2ddf3f8630cfdbefec490c0000c14bee6bdManuel Klimek nextToken(); 86296e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (FormatTok->Tok.is(tok::l_brace)) { 863eff18b9b6f1218a6bbe4869989b08867823a4e75Daniel Jasper parseBlock(/*MustBeDeclaration=*/true, /*AddLevel=*/false); 864d19dc2ddf3f8630cfdbefec490c0000c14bee6bdManuel Klimek addUnwrappedLine(); 865d19dc2ddf3f8630cfdbefec490c0000c14bee6bdManuel Klimek return; 866d19dc2ddf3f8630cfdbefec490c0000c14bee6bdManuel Klimek } 867d19dc2ddf3f8630cfdbefec490c0000c14bee6bdManuel Klimek } 868651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 8690e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case tok::kw_export: 8700e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (Style.Language == FormatStyle::LK_JavaScript) { 8710e2c34f92f00628d48968dfea096d36381f494cbStephen Hines parseJavaScriptEs6ImportExport(); 8720e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return; 8730e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 8740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines break; 875651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case tok::identifier: 876b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (FormatTok->is(TT_ForEachMacro)) { 877651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines parseForOrWhileLoop(); 878651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return; 879651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 88087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (FormatTok->is(TT_MacroBlockBegin)) { 88187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar parseBlock(/*MustBeDeclaration=*/false, /*AddLevel=*/true, 88287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /*MunchSemi=*/false); 88387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return; 88487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 8854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (FormatTok->is(Keywords.kw_import)) { 8864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Style.Language == FormatStyle::LK_JavaScript) { 8874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar parseJavaScriptEs6ImportExport(); 8884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return; 8894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 8904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Style.Language == FormatStyle::LK_Proto) { 8914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar nextToken(); 8924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (FormatTok->is(tok::kw_public)) 8934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar nextToken(); 8944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!FormatTok->is(tok::string_literal)) 8954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return; 8964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar nextToken(); 8974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (FormatTok->is(tok::semi)) 8984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar nextToken(); 8994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar addUnwrappedLine(); 9004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return; 9014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 9020e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 90387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (FormatTok->isOneOf(Keywords.kw_signals, Keywords.kw_qsignals, 90487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Keywords.kw_slots, Keywords.kw_qslots)) { 905b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar nextToken(); 906b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (FormatTok->is(tok::colon)) { 907b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar nextToken(); 908b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar addUnwrappedLine(); 909b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 91058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return; 91158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar } 912d19dc2ddf3f8630cfdbefec490c0000c14bee6bdManuel Klimek // In all other cases, parse the declaration. 913d19dc2ddf3f8630cfdbefec490c0000c14bee6bdManuel Klimek break; 914a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko default: 915a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko break; 916bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper } 917bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper do { 9184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const FormatToken *Previous = getPreviousToken(); 91996e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek switch (FormatTok->Tok.getKind()) { 920d74fcdb630dad817f5d462edd6d12bb95e3f27f1Nico Weber case tok::at: 921d74fcdb630dad817f5d462edd6d12bb95e3f27f1Nico Weber nextToken(); 92296e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (FormatTok->Tok.is(tok::l_brace)) 923d74fcdb630dad817f5d462edd6d12bb95e3f27f1Nico Weber parseBracedList(); 924d74fcdb630dad817f5d462edd6d12bb95e3f27f1Nico Weber break; 925a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko case tok::kw_enum: 9264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Ignore if this is part of "template <enum ...". 9274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Previous && Previous->is(tok::less)) { 9284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar nextToken(); 9294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar break; 9304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 9314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 93287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // parseEnum falls through and does not yet add an unwrapped line as an 93387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // enum definition can start a structural element. 9344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!parseEnum()) 9354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar break; 93687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // This only applies for C++. 93787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Style.Language != FormatStyle::LK_Cpp) { 93887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar addUnwrappedLine(); 93987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return; 94087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 941308232c0aef773d24693f9e456dc3bc983934f7fManuel Klimek break; 942651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case tok::kw_typedef: 943651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines nextToken(); 9440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (FormatTok->isOneOf(Keywords.kw_NS_ENUM, Keywords.kw_NS_OPTIONS, 9450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Keywords.kw_CF_ENUM, Keywords.kw_CF_OPTIONS)) 946651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines parseEnum(); 947651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 948d881875b6c78386c4f0da911c1110f9ed1235c6aAlexander Kornienko case tok::kw_struct: 949d881875b6c78386c4f0da911c1110f9ed1235c6aAlexander Kornienko case tok::kw_union: 950de7685487c5d628dd9fe64c4f861cd1888f50fc7Manuel Klimek case tok::kw_class: 951b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // parseRecord falls through and does not yet add an unwrapped line as a 952b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // record declaration or definition can start a structural element. 95347ea7f64108163491ed74dc746c8d94e10764704Manuel Klimek parseRecord(); 954b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // This does not apply for Java and JavaScript. 955b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (Style.Language == FormatStyle::LK_Java || 956b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Style.Language == FormatStyle::LK_JavaScript) { 9574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (FormatTok->is(tok::semi)) 9584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar nextToken(); 959b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar addUnwrappedLine(); 960b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return; 961b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 96247ea7f64108163491ed74dc746c8d94e10764704Manuel Klimek break; 9630e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case tok::period: 9640e2c34f92f00628d48968dfea096d36381f494cbStephen Hines nextToken(); 9650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // In Java, classes have an implicit static member "class". 9660e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (Style.Language == FormatStyle::LK_Java && FormatTok && 9670e2c34f92f00628d48968dfea096d36381f494cbStephen Hines FormatTok->is(tok::kw_class)) 9680e2c34f92f00628d48968dfea096d36381f494cbStephen Hines nextToken(); 96987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Style.Language == FormatStyle::LK_JavaScript && FormatTok && 97087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar FormatTok->Tok.getIdentifierInfo()) 97187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // JavaScript only has pseudo keywords, all keywords are allowed to 97287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // appear in "IdentifierName" positions. See http://es5.github.io/#x7.6 97387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar nextToken(); 9740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines break; 975bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper case tok::semi: 976bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper nextToken(); 977bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper addUnwrappedLine(); 978bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper return; 979d881875b6c78386c4f0da911c1110f9ed1235c6aAlexander Kornienko case tok::r_brace: 980d881875b6c78386c4f0da911c1110f9ed1235c6aAlexander Kornienko addUnwrappedLine(); 981d881875b6c78386c4f0da911c1110f9ed1235c6aAlexander Kornienko return; 982bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper case tok::l_paren: 983bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper parseParens(); 984bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper break; 98587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case tok::kw_operator: 98687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar nextToken(); 98787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (FormatTok->isBinaryOperator()) 98887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar nextToken(); 98987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 990753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek case tok::caret: 991753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek nextToken(); 992651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (FormatTok->Tok.isAnyIdentifier() || 993651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines FormatTok->isSimpleTypeSpecifier()) 994651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines nextToken(); 995651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (FormatTok->is(tok::l_paren)) 996651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines parseParens(); 997651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (FormatTok->is(tok::l_brace)) 998753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek parseChildBlock(); 999753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek break; 1000bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper case tok::l_brace: 100180829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek if (!tryToParseBracedList()) { 100280829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek // A block outside of parentheses must be the last part of a 100380829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek // structural element. 100480829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek // FIXME: Figure out cases where this is not true, and add projections 100580829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek // for them (the one we know is missing are lambdas). 100687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Style.BraceWrapping.AfterFunction) 100780829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek addUnwrappedLine(); 1008651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines FormatTok->Type = TT_FunctionLBrace; 10092726877196b41b922f10f794801b313980e1a8adNico Weber parseBlock(/*MustBeDeclaration=*/false); 101044135b8836fc3ffb84e540d8a097955271ccbc23Manuel Klimek addUnwrappedLine(); 101180829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek return; 101280829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek } 101380829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek // Otherwise this was a braced init list, and the structural 101480829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek // element continues. 101580829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek break; 10166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case tok::kw_try: 10176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // We arrive here when parsing function-try blocks. 10186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines parseTryCatch(); 10196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return; 10207e70f4c09c5e10c2690eac04d9d812fb8e4a0c0dDaniel Jasper case tok::identifier: { 102187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (FormatTok->is(TT_MacroBlockEnd)) { 102287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar addUnwrappedLine(); 102387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return; 102487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 102587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 1026c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Parse function literal unless 'function' is the first token in a line 1027c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // in which case this should be treated as a free-standing function. 1028b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (Style.Language == FormatStyle::LK_JavaScript && 10294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar (FormatTok->is(Keywords.kw_function) || 10304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar FormatTok->startsSequence(Keywords.kw_async, 10314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Keywords.kw_function)) && 10324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Line->Tokens.size() > 0) { 10336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines tryToParseJSFunction(); 10346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines break; 10356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 1036b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if ((Style.Language == FormatStyle::LK_JavaScript || 1037b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Style.Language == FormatStyle::LK_Java) && 1038b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar FormatTok->is(Keywords.kw_interface)) { 10394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Style.Language == FormatStyle::LK_JavaScript) { 10404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // In JavaScript/TypeScript, "interface" can be used as a standalone 10414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // identifier, e.g. in `var interface = 1;`. If "interface" is 10424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // followed by another identifier, it is very like to be an actual 10434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // interface declaration. 10444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar unsigned StoredPosition = Tokens->getPosition(); 10454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar FormatToken *Next = Tokens->getNextToken(); 10464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar FormatTok = Tokens->setPosition(StoredPosition); 10474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Next && !mustBeJSIdent(Keywords, Next)) { 10484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar nextToken(); 10494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar break; 10504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 10514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 1052b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar parseRecord(); 1053b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar addUnwrappedLine(); 105487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return; 1055b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 1056b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 10574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // See if the following token should start a new unwrapped line. 1058b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar StringRef Text = FormatTok->TokenText; 1059bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper nextToken(); 10600e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (Line->Tokens.size() == 1 && 10610e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // JS doesn't have macros, and within classes colons indicate fields, 10620e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // not labels. 106358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar Style.Language != FormatStyle::LK_JavaScript) { 106458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar if (FormatTok->Tok.is(tok::colon) && !Line->MustBeDeclaration) { 10654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Line->Tokens.begin()->Tok->MustBreakBefore = true; 10663d713a72a01bf1d270d00040a3fb195121012c61Alexander Kornienko parseLabel(); 10673d713a72a01bf1d270d00040a3fb195121012c61Alexander Kornienko return; 10683d713a72a01bf1d270d00040a3fb195121012c61Alexander Kornienko } 1069176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Recognize function-like macro usages without trailing semicolon as 10700e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // well as free-standing macros like Q_OBJECT. 1071176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool FunctionLike = FormatTok->is(tok::l_paren); 1072176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (FunctionLike) 10733d713a72a01bf1d270d00040a3fb195121012c61Alexander Kornienko parseParens(); 1074b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 1075b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar bool FollowedByNewline = 1076b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar CommentsBeforeNextToken.empty() 1077b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ? FormatTok->NewlinesBefore > 0 1078b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar : CommentsBeforeNextToken.front()->NewlinesBefore > 0; 1079b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 108087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (FollowedByNewline && (Text.size() >= 5 || FunctionLike) && 1081176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines tokenCanStartNewLine(FormatTok->Tok) && Text == Text.upper()) { 10827e70f4c09c5e10c2690eac04d9d812fb8e4a0c0dDaniel Jasper addUnwrappedLine(); 1083c76d59d8ff564f918833c97caede7dce2d8cfe60Daniel Jasper return; 10843d713a72a01bf1d270d00040a3fb195121012c61Alexander Kornienko } 1085bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper } 1086bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper break; 10877e70f4c09c5e10c2690eac04d9d812fb8e4a0c0dDaniel Jasper } 108805b1ac8791ee89fdf0b275631ab8118febc7c33dDaniel Jasper case tok::equal: 1089b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // Fat arrows (=>) have tok::TokenKind tok::equal but TokenType 1090b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // TT_JsFatArrow. The always start an expression or a child block if 1091b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // followed by a curly. 1092b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (FormatTok->is(TT_JsFatArrow)) { 1093b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar nextToken(); 1094b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (FormatTok->is(tok::l_brace)) 1095b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar parseChildBlock(); 1096b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar break; 1097b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 1098b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 109905b1ac8791ee89fdf0b275631ab8118febc7c33dDaniel Jasper nextToken(); 110096e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (FormatTok->Tok.is(tok::l_brace)) { 1101bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek parseBracedList(); 1102bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek } 1103bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek break; 1104b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek case tok::l_square: 1105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines parseSquare(); 1106b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek break; 11073ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar case tok::kw_new: 11083ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar parseNew(); 11093ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar break; 1110bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek default: 1111bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek nextToken(); 1112bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek break; 1113bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek } 1114bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek } while (!eof()); 1115bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek} 1116bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek 1117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool UnwrappedLineParser::tryToParseLambda() { 1118b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (Style.Language != FormatStyle::LK_Cpp) { 1119b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar nextToken(); 1120b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return false; 1121b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 11224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const FormatToken* Previous = getPreviousToken(); 11234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Previous && 11244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar (Previous->isOneOf(tok::identifier, tok::kw_operator, tok::kw_new, 11254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar tok::kw_delete) || 11264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Previous->closesScope() || Previous->isSimpleTypeSpecifier())) { 11272d65705ed0a72ab57b8a062c44c9caa377f9fd2aDaniel Jasper nextToken(); 1128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 11292d65705ed0a72ab57b8a062c44c9caa377f9fd2aDaniel Jasper } 1130567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper assert(FormatTok->is(tok::l_square)); 1131567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper FormatToken &LSquare = *FormatTok; 1132ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper if (!tryToParseLambdaIntroducer()) 1133651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 1134b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek 1135b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek while (FormatTok->isNot(tok::l_brace)) { 1136651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (FormatTok->isSimpleTypeSpecifier()) { 1137651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines nextToken(); 1138651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines continue; 1139651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1140b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek switch (FormatTok->Tok.getKind()) { 1141ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper case tok::l_brace: 1142ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper break; 1143ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper case tok::l_paren: 1144ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper parseParens(); 1145ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper break; 11460e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case tok::amp: 11470e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case tok::star: 11480e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case tok::kw_const: 11490e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case tok::comma: 1150651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case tok::less: 1151651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case tok::greater: 1152ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper case tok::identifier: 115387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case tok::numeric_constant: 1154651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case tok::coloncolon: 1155ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper case tok::kw_mutable: 1156ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper nextToken(); 1157ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper break; 1158651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case tok::arrow: 1159b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar FormatTok->Type = TT_LambdaArrow; 1160651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines nextToken(); 1161651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 1162ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper default: 1163651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 1164b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek } 1165b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek } 1166567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper LSquare.Type = TT_LambdaLSquare; 1167753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek parseChildBlock(); 1168651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 1169b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek} 1170b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek 1171b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimekbool UnwrappedLineParser::tryToParseLambdaIntroducer() { 1172b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek nextToken(); 1173b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek if (FormatTok->is(tok::equal)) { 1174b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek nextToken(); 1175ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper if (FormatTok->is(tok::r_square)) { 1176ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper nextToken(); 1177ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper return true; 1178ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper } 1179ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper if (FormatTok->isNot(tok::comma)) 1180ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper return false; 1181b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek nextToken(); 1182b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek } else if (FormatTok->is(tok::amp)) { 1183b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek nextToken(); 1184ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper if (FormatTok->is(tok::r_square)) { 1185ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper nextToken(); 1186ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper return true; 1187ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper } 1188b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek if (!FormatTok->isOneOf(tok::comma, tok::identifier)) { 1189b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek return false; 1190b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek } 1191ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper if (FormatTok->is(tok::comma)) 1192ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper nextToken(); 1193b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek } else if (FormatTok->is(tok::r_square)) { 1194b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek nextToken(); 1195b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek return true; 1196b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek } 1197b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek do { 1198ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper if (FormatTok->is(tok::amp)) 1199ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper nextToken(); 1200ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper if (!FormatTok->isOneOf(tok::identifier, tok::kw_this)) 1201ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper return false; 1202b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek nextToken(); 1203c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (FormatTok->is(tok::ellipsis)) 1204c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines nextToken(); 1205b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek if (FormatTok->is(tok::comma)) { 1206b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek nextToken(); 1207b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek } else if (FormatTok->is(tok::r_square)) { 1208b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek nextToken(); 1209b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek return true; 1210b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek } else { 1211b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek return false; 1212b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek } 1213b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek } while (!eof()); 1214b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek return false; 1215b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek} 1216b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek 12176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid UnwrappedLineParser::tryToParseJSFunction() { 12184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar assert(FormatTok->is(Keywords.kw_function) || 12194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar FormatTok->startsSequence(Keywords.kw_async, Keywords.kw_function)); 12204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (FormatTok->is(Keywords.kw_async)) 12214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar nextToken(); 12224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Consume "function". 12236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines nextToken(); 1224c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 12254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Consume * (generator function). 12264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (FormatTok->is(tok::star)) 12274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar nextToken(); 12284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1229c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Consume function name. 1230c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines if (FormatTok->is(tok::identifier)) 12310e2c34f92f00628d48968dfea096d36381f494cbStephen Hines nextToken(); 1232c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 12336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (FormatTok->isNot(tok::l_paren)) 12346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return; 1235b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 1236b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // Parse formal parameter list. 1237b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar parseParens(); 1238b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 1239b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (FormatTok->is(tok::colon)) { 1240b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // Parse a type definition. 12416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines nextToken(); 1242b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 1243b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // Eat the type declaration. For braced inline object types, balance braces, 1244b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // otherwise just parse until finding an l_brace for the function body. 1245b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (FormatTok->is(tok::l_brace)) 1246b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar tryToParseBracedList(); 1247b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar else 124887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar while (FormatTok->isNot(tok::l_brace) && !eof()) 1249b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar nextToken(); 12506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 1251b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 12526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines parseChildBlock(); 12536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 12546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 125580829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimekbool UnwrappedLineParser::tryToParseBracedList() { 12560de1c4d152b5fbf0b383e9fa8396e334f029c716Daniel Jasper if (FormatTok->BlockKind == BK_Unknown) 125780829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek calculateBraceTypes(); 12580de1c4d152b5fbf0b383e9fa8396e334f029c716Daniel Jasper assert(FormatTok->BlockKind != BK_Unknown); 12590de1c4d152b5fbf0b383e9fa8396e334f029c716Daniel Jasper if (FormatTok->BlockKind == BK_Block) 126080829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek return false; 126180829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek parseBracedList(); 126280829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek return true; 126380829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek} 126480829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek 12655798120bc015360951d13a06e17501b909ecd21dDaniel Jasperbool UnwrappedLineParser::parseBracedList(bool ContinueOnSemicolons) { 12665798120bc015360951d13a06e17501b909ecd21dDaniel Jasper bool HasError = false; 1267bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek nextToken(); 1268bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek 1269423dd93c8011aa8bca9b761b0b121ea8bce0fd03Manuel Klimek // FIXME: Once we have an expression parser in the UnwrappedLineParser, 1270423dd93c8011aa8bca9b761b0b121ea8bce0fd03Manuel Klimek // replace this by using parseAssigmentExpression() inside. 1271bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek do { 1272b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (Style.Language == FormatStyle::LK_JavaScript) { 12734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (FormatTok->is(Keywords.kw_function) || 12744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar FormatTok->startsSequence(Keywords.kw_async, Keywords.kw_function)) { 1275b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar tryToParseJSFunction(); 1276b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar continue; 1277b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 1278b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (FormatTok->is(TT_JsFatArrow)) { 1279b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar nextToken(); 1280b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // Fat arrows can be followed by simple expressions or by child blocks 1281b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // in curly braces. 128287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (FormatTok->is(tok::l_brace)) { 1283b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar parseChildBlock(); 1284b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar continue; 1285b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 1286b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 12876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 128896e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek switch (FormatTok->Tok.getKind()) { 1289753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek case tok::caret: 1290753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek nextToken(); 1291753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek if (FormatTok->is(tok::l_brace)) { 1292753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek parseChildBlock(); 1293753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek } 1294753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek break; 1295753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek case tok::l_square: 1296753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek tryToParseLambda(); 1297753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek break; 1298bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek case tok::l_brace: 129931e44f7a5d50ab8f7f623a7d2e18d5d877ef400dManuel Klimek // Assume there are no blocks inside a braced init list apart 130031e44f7a5d50ab8f7f623a7d2e18d5d877ef400dManuel Klimek // from the ones we explicitly parse out (like lambdas). 130131e44f7a5d50ab8f7f623a7d2e18d5d877ef400dManuel Klimek FormatTok->BlockKind = BK_BracedInit; 1302bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek parseBracedList(); 130305b1ac8791ee89fdf0b275631ab8118febc7c33dDaniel Jasper break; 130487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case tok::l_paren: 130587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar parseParens(); 130658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar // JavaScript can just have free standing methods and getters/setters in 130758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar // object literals. Detect them by a "{" following ")". 130858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar if (Style.Language == FormatStyle::LK_JavaScript) { 130958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar if (FormatTok->is(tok::l_brace)) 131058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar parseChildBlock(); 131158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar break; 131258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar } 131358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar break; 1314bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek case tok::r_brace: 1315bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek nextToken(); 13165798120bc015360951d13a06e17501b909ecd21dDaniel Jasper return !HasError; 1317423dd93c8011aa8bca9b761b0b121ea8bce0fd03Manuel Klimek case tok::semi: 13184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // JavaScript (or more precisely TypeScript) can have semicolons in braced 13194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // lists (in so-called TypeMemberLists). Thus, the semicolon cannot be 13204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // used for error recovery if we have otherwise determined that this is 13214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // a braced list. 13224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Style.Language == FormatStyle::LK_JavaScript) { 13234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar nextToken(); 13244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar break; 13254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 13265798120bc015360951d13a06e17501b909ecd21dDaniel Jasper HasError = true; 13275798120bc015360951d13a06e17501b909ecd21dDaniel Jasper if (!ContinueOnSemicolons) 13285798120bc015360951d13a06e17501b909ecd21dDaniel Jasper return !HasError; 13295798120bc015360951d13a06e17501b909ecd21dDaniel Jasper nextToken(); 13305798120bc015360951d13a06e17501b909ecd21dDaniel Jasper break; 1331423dd93c8011aa8bca9b761b0b121ea8bce0fd03Manuel Klimek case tok::comma: 1332423dd93c8011aa8bca9b761b0b121ea8bce0fd03Manuel Klimek nextToken(); 1333423dd93c8011aa8bca9b761b0b121ea8bce0fd03Manuel Klimek break; 1334a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko default: 1335a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko nextToken(); 1336a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko break; 1337bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper } 1338bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper } while (!eof()); 13395798120bc015360951d13a06e17501b909ecd21dDaniel Jasper return false; 1340bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper} 1341bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper 1342651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid UnwrappedLineParser::parseParens() { 1343651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines assert(FormatTok->Tok.is(tok::l_paren) && "'(' expected."); 1344c44ee89cb448e34aada006b707eb45a1280f31e3Manuel Klimek nextToken(); 1345c44ee89cb448e34aada006b707eb45a1280f31e3Manuel Klimek do { 134696e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek switch (FormatTok->Tok.getKind()) { 1347c44ee89cb448e34aada006b707eb45a1280f31e3Manuel Klimek case tok::l_paren: 1348c44ee89cb448e34aada006b707eb45a1280f31e3Manuel Klimek parseParens(); 13490e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (Style.Language == FormatStyle::LK_Java && FormatTok->is(tok::l_brace)) 13500e2c34f92f00628d48968dfea096d36381f494cbStephen Hines parseChildBlock(); 1351c44ee89cb448e34aada006b707eb45a1280f31e3Manuel Klimek break; 1352651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case tok::r_paren: 1353c44ee89cb448e34aada006b707eb45a1280f31e3Manuel Klimek nextToken(); 1354651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return; 1355651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case tok::r_brace: 1356651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // A "}" inside parenthesis is an error if there wasn't a matching "{". 1357c44ee89cb448e34aada006b707eb45a1280f31e3Manuel Klimek return; 1358b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek case tok::l_square: 1359b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek tryToParseLambda(); 1360b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek break; 13610e2c34f92f00628d48968dfea096d36381f494cbStephen Hines case tok::l_brace: 1362b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!tryToParseBracedList()) 1363651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines parseChildBlock(); 1364651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 1365651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case tok::at: 1366651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines nextToken(); 1367651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (FormatTok->Tok.is(tok::l_brace)) 1368651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines parseBracedList(); 1369651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 1370176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case tok::identifier: 1371176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (Style.Language == FormatStyle::LK_JavaScript && 13724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar (FormatTok->is(Keywords.kw_function) || 13734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar FormatTok->startsSequence(Keywords.kw_async, Keywords.kw_function))) 1374176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines tryToParseJSFunction(); 1375176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines else 1376176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines nextToken(); 1377176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 1378c44ee89cb448e34aada006b707eb45a1280f31e3Manuel Klimek default: 1379c44ee89cb448e34aada006b707eb45a1280f31e3Manuel Klimek nextToken(); 1380c44ee89cb448e34aada006b707eb45a1280f31e3Manuel Klimek break; 1381c44ee89cb448e34aada006b707eb45a1280f31e3Manuel Klimek } 1382c44ee89cb448e34aada006b707eb45a1280f31e3Manuel Klimek } while (!eof()); 1383c44ee89cb448e34aada006b707eb45a1280f31e3Manuel Klimek} 1384c44ee89cb448e34aada006b707eb45a1280f31e3Manuel Klimek 1385651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid UnwrappedLineParser::parseSquare() { 1386651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines assert(FormatTok->Tok.is(tok::l_square) && "'[' expected."); 1387651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (tryToParseLambda()) 1388651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return; 1389bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper do { 139096e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek switch (FormatTok->Tok.getKind()) { 1391bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper case tok::l_paren: 1392bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper parseParens(); 1393bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper break; 1394651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case tok::r_square: 1395bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper nextToken(); 1396bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper return; 1397f7ec1cc7f931833b2cb9876a5e7dfd6bf8681c6aDaniel Jasper case tok::r_brace: 1398f7ec1cc7f931833b2cb9876a5e7dfd6bf8681c6aDaniel Jasper // A "}" inside parenthesis is an error if there wasn't a matching "{". 1399f7ec1cc7f931833b2cb9876a5e7dfd6bf8681c6aDaniel Jasper return; 1400ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper case tok::l_square: 1401651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines parseSquare(); 1402ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper break; 14032afbe523648eb591709ac9262f024457eb019bd6Nico Weber case tok::l_brace: { 1404b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!tryToParseBracedList()) 1405b7d98a1bd42601a745328e118ed38034a391cc92Manuel Klimek parseChildBlock(); 1406bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek break; 14072afbe523648eb591709ac9262f024457eb019bd6Nico Weber } 1408d74fcdb630dad817f5d462edd6d12bb95e3f27f1Nico Weber case tok::at: 1409d74fcdb630dad817f5d462edd6d12bb95e3f27f1Nico Weber nextToken(); 141096e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (FormatTok->Tok.is(tok::l_brace)) 1411d74fcdb630dad817f5d462edd6d12bb95e3f27f1Nico Weber parseBracedList(); 1412d74fcdb630dad817f5d462edd6d12bb95e3f27f1Nico Weber break; 1413bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper default: 1414bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper nextToken(); 1415bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper break; 1416bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper } 1417bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper } while (!eof()); 1418bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper} 1419bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper 1420bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jaspervoid UnwrappedLineParser::parseIfThenElse() { 142196e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek assert(FormatTok->Tok.is(tok::kw_if) && "'if' expected"); 1422bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper nextToken(); 142396e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (FormatTok->Tok.is(tok::l_paren)) 1424d465843f5376c7c1574fe61338cbf3dc50684d5bManuel Klimek parseParens(); 1425bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper bool NeedsUnwrappedLine = false; 142696e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (FormatTok->Tok.is(tok::l_brace)) { 1427651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CompoundStatementIndenter Indenter(this, Style, Line->Level); 14282726877196b41b922f10f794801b313980e1a8adNico Weber parseBlock(/*MustBeDeclaration=*/false); 142987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Style.BraceWrapping.BeforeElse) 1430e490705e6678a2e830cecacbe8142d9b369d8341Manuel Klimek addUnwrappedLine(); 143187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar else 1432e490705e6678a2e830cecacbe8142d9b369d8341Manuel Klimek NeedsUnwrappedLine = true; 1433bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper } else { 1434bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper addUnwrappedLine(); 1435526ed11ad9743c773df76bd1649d33fb92c2b8cbManuel Klimek ++Line->Level; 1436f0ab0a38d9482eef5495db845ff53ee689f9c80eManuel Klimek parseStructuralElement(); 1437526ed11ad9743c773df76bd1649d33fb92c2b8cbManuel Klimek --Line->Level; 1438bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper } 143996e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (FormatTok->Tok.is(tok::kw_else)) { 1440bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper nextToken(); 144196e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (FormatTok->Tok.is(tok::l_brace)) { 1442651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CompoundStatementIndenter Indenter(this, Style, Line->Level); 14432726877196b41b922f10f794801b313980e1a8adNico Weber parseBlock(/*MustBeDeclaration=*/false); 1444bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper addUnwrappedLine(); 144596e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek } else if (FormatTok->Tok.is(tok::kw_if)) { 1446bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper parseIfThenElse(); 1447bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper } else { 1448bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper addUnwrappedLine(); 1449526ed11ad9743c773df76bd1649d33fb92c2b8cbManuel Klimek ++Line->Level; 1450f0ab0a38d9482eef5495db845ff53ee689f9c80eManuel Klimek parseStructuralElement(); 14514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (FormatTok->is(tok::eof)) 14524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar addUnwrappedLine(); 1453526ed11ad9743c773df76bd1649d33fb92c2b8cbManuel Klimek --Line->Level; 1454bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper } 1455bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper } else if (NeedsUnwrappedLine) { 1456bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper addUnwrappedLine(); 1457bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper } 1458bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper} 1459bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper 14606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid UnwrappedLineParser::parseTryCatch() { 14610e2c34f92f00628d48968dfea096d36381f494cbStephen Hines assert(FormatTok->isOneOf(tok::kw_try, tok::kw___try) && "'try' expected"); 14626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines nextToken(); 14636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool NeedsUnwrappedLine = false; 14646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (FormatTok->is(tok::colon)) { 14656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // We are in a function try block, what comes is an initializer list. 14666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines nextToken(); 14676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines while (FormatTok->is(tok::identifier)) { 14686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines nextToken(); 14696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (FormatTok->is(tok::l_paren)) 14706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines parseParens(); 14716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (FormatTok->is(tok::comma)) 14726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines nextToken(); 14736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 14746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 14750e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Parse try with resource. 14760e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (Style.Language == FormatStyle::LK_Java && FormatTok->is(tok::l_paren)) { 14770e2c34f92f00628d48968dfea096d36381f494cbStephen Hines parseParens(); 14780e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 14796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (FormatTok->is(tok::l_brace)) { 14806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CompoundStatementIndenter Indenter(this, Style, Line->Level); 14816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines parseBlock(/*MustBeDeclaration=*/false); 148287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Style.BraceWrapping.BeforeCatch) { 14836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines addUnwrappedLine(); 14846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } else { 14856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines NeedsUnwrappedLine = true; 14866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 14876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } else if (!FormatTok->is(tok::kw_catch)) { 14886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // The C++ standard requires a compound-statement after a try. 14896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // If there's none, we try to assume there's a structuralElement 14906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // and try to continue. 14916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines addUnwrappedLine(); 14926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ++Line->Level; 14936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines parseStructuralElement(); 14946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines --Line->Level; 14956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 14960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines while (1) { 14970e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (FormatTok->is(tok::at)) 14980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines nextToken(); 14990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (!(FormatTok->isOneOf(tok::kw_catch, Keywords.kw___except, 15000e2c34f92f00628d48968dfea096d36381f494cbStephen Hines tok::kw___finally) || 15010e2c34f92f00628d48968dfea096d36381f494cbStephen Hines ((Style.Language == FormatStyle::LK_Java || 15020e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Style.Language == FormatStyle::LK_JavaScript) && 15030e2c34f92f00628d48968dfea096d36381f494cbStephen Hines FormatTok->is(Keywords.kw_finally)) || 15040e2c34f92f00628d48968dfea096d36381f494cbStephen Hines (FormatTok->Tok.isObjCAtKeyword(tok::objc_catch) || 15050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines FormatTok->Tok.isObjCAtKeyword(tok::objc_finally)))) 15060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines break; 15076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines nextToken(); 15086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines while (FormatTok->isNot(tok::l_brace)) { 15096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (FormatTok->is(tok::l_paren)) { 15106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines parseParens(); 15116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines continue; 15126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 15130e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (FormatTok->isOneOf(tok::semi, tok::r_brace, tok::eof)) 15146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return; 15156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines nextToken(); 15166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 15176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines NeedsUnwrappedLine = false; 15186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CompoundStatementIndenter Indenter(this, Style, Line->Level); 15196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines parseBlock(/*MustBeDeclaration=*/false); 152087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Style.BraceWrapping.BeforeCatch) 15216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines addUnwrappedLine(); 152287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar else 15236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines NeedsUnwrappedLine = true; 15246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 152587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (NeedsUnwrappedLine) 15266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines addUnwrappedLine(); 15276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 15286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 152915757316d67cb7a854d53a0402d67ad58347600aAlexander Kornienkovoid UnwrappedLineParser::parseNamespace() { 153096e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek assert(FormatTok->Tok.is(tok::kw_namespace) && "'namespace' expected"); 1531176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1532176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const FormatToken &InitialToken = *FormatTok; 153315757316d67cb7a854d53a0402d67ad58347600aAlexander Kornienko nextToken(); 153487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar while (FormatTok->isOneOf(tok::identifier, tok::coloncolon)) 153515757316d67cb7a854d53a0402d67ad58347600aAlexander Kornienko nextToken(); 153696e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (FormatTok->Tok.is(tok::l_brace)) { 1537176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (ShouldBreakBeforeBrace(Style, InitialToken)) 153844135b8836fc3ffb84e540d8a097955271ccbc23Manuel Klimek addUnwrappedLine(); 153944135b8836fc3ffb84e540d8a097955271ccbc23Manuel Klimek 1540eff18b9b6f1218a6bbe4869989b08867823a4e75Daniel Jasper bool AddLevel = Style.NamespaceIndentation == FormatStyle::NI_All || 1541eff18b9b6f1218a6bbe4869989b08867823a4e75Daniel Jasper (Style.NamespaceIndentation == FormatStyle::NI_Inner && 1542eff18b9b6f1218a6bbe4869989b08867823a4e75Daniel Jasper DeclarationScopeStack.size() > 1); 1543eff18b9b6f1218a6bbe4869989b08867823a4e75Daniel Jasper parseBlock(/*MustBeDeclaration=*/true, AddLevel); 15447fc2db0acd3fb0f38db19764eef137ae3a9edc9fManuel Klimek // Munch the semicolon after a namespace. This is more common than one would 15457fc2db0acd3fb0f38db19764eef137ae3a9edc9fManuel Klimek // think. Puttin the semicolon into its own line is very ugly. 154696e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (FormatTok->Tok.is(tok::semi)) 15477fc2db0acd3fb0f38db19764eef137ae3a9edc9fManuel Klimek nextToken(); 154815757316d67cb7a854d53a0402d67ad58347600aAlexander Kornienko addUnwrappedLine(); 154915757316d67cb7a854d53a0402d67ad58347600aAlexander Kornienko } 155015757316d67cb7a854d53a0402d67ad58347600aAlexander Kornienko // FIXME: Add error handling. 155115757316d67cb7a854d53a0402d67ad58347600aAlexander Kornienko} 155215757316d67cb7a854d53a0402d67ad58347600aAlexander Kornienko 15533ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarvoid UnwrappedLineParser::parseNew() { 15543ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar assert(FormatTok->is(tok::kw_new) && "'new' expected"); 15553ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar nextToken(); 15563ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (Style.Language != FormatStyle::LK_Java) 15573ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return; 15583ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 15593ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // In Java, we can parse everything up to the parens, which aren't optional. 15603ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar do { 15613ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // There should not be a ;, { or } before the new's open paren. 15623ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (FormatTok->isOneOf(tok::semi, tok::l_brace, tok::r_brace)) 15633ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return; 15643ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 15653ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // Consume the parens. 15663ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (FormatTok->is(tok::l_paren)) { 15673ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar parseParens(); 15683ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 15693ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // If there is a class body of an anonymous class, consume that as child. 15703ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar if (FormatTok->is(tok::l_brace)) 15713ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar parseChildBlock(); 15723ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return; 15733ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } 15743ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar nextToken(); 15753ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } while (!eof()); 15763ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 15773ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 15782e97cfc78743fcaa988e3c45f7af1002063f780cAlexander Kornienkovoid UnwrappedLineParser::parseForOrWhileLoop() { 1579b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar assert(FormatTok->isOneOf(tok::kw_for, tok::kw_while, TT_ForEachMacro) && 1580651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "'for', 'while' or foreach macro expected"); 15812e97cfc78743fcaa988e3c45f7af1002063f780cAlexander Kornienko nextToken(); 158296e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (FormatTok->Tok.is(tok::l_paren)) 15836eca03fcac1e408470d48e6309a280d3681f717dManuel Klimek parseParens(); 158496e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (FormatTok->Tok.is(tok::l_brace)) { 1585651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CompoundStatementIndenter Indenter(this, Style, Line->Level); 15862726877196b41b922f10f794801b313980e1a8adNico Weber parseBlock(/*MustBeDeclaration=*/false); 15872e97cfc78743fcaa988e3c45f7af1002063f780cAlexander Kornienko addUnwrappedLine(); 15882e97cfc78743fcaa988e3c45f7af1002063f780cAlexander Kornienko } else { 15892e97cfc78743fcaa988e3c45f7af1002063f780cAlexander Kornienko addUnwrappedLine(); 1590526ed11ad9743c773df76bd1649d33fb92c2b8cbManuel Klimek ++Line->Level; 1591f0ab0a38d9482eef5495db845ff53ee689f9c80eManuel Klimek parseStructuralElement(); 1592526ed11ad9743c773df76bd1649d33fb92c2b8cbManuel Klimek --Line->Level; 15932e97cfc78743fcaa988e3c45f7af1002063f780cAlexander Kornienko } 15942e97cfc78743fcaa988e3c45f7af1002063f780cAlexander Kornienko} 15952e97cfc78743fcaa988e3c45f7af1002063f780cAlexander Kornienko 1596bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jaspervoid UnwrappedLineParser::parseDoWhile() { 159796e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek assert(FormatTok->Tok.is(tok::kw_do) && "'do' expected"); 1598bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper nextToken(); 159996e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (FormatTok->Tok.is(tok::l_brace)) { 1600651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CompoundStatementIndenter Indenter(this, Style, Line->Level); 16012726877196b41b922f10f794801b313980e1a8adNico Weber parseBlock(/*MustBeDeclaration=*/false); 160287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Style.BraceWrapping.IndentBraces) 1603651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addUnwrappedLine(); 1604bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper } else { 1605bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper addUnwrappedLine(); 1606526ed11ad9743c773df76bd1649d33fb92c2b8cbManuel Klimek ++Line->Level; 1607f0ab0a38d9482eef5495db845ff53ee689f9c80eManuel Klimek parseStructuralElement(); 1608526ed11ad9743c773df76bd1649d33fb92c2b8cbManuel Klimek --Line->Level; 1609bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper } 1610bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper 1611393b008bcebb0a678a5a0a93ad69e28a30a62e84Alexander Kornienko // FIXME: Add error handling. 161296e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (!FormatTok->Tok.is(tok::kw_while)) { 1613393b008bcebb0a678a5a0a93ad69e28a30a62e84Alexander Kornienko addUnwrappedLine(); 1614393b008bcebb0a678a5a0a93ad69e28a30a62e84Alexander Kornienko return; 1615393b008bcebb0a678a5a0a93ad69e28a30a62e84Alexander Kornienko } 1616393b008bcebb0a678a5a0a93ad69e28a30a62e84Alexander Kornienko 1617bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper nextToken(); 1618f0ab0a38d9482eef5495db845ff53ee689f9c80eManuel Klimek parseStructuralElement(); 1619bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper} 1620bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper 1621bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jaspervoid UnwrappedLineParser::parseLabel() { 1622bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper nextToken(); 1623526ed11ad9743c773df76bd1649d33fb92c2b8cbManuel Klimek unsigned OldLineLevel = Line->Level; 1624bcca7e484117f3155ff98f9560996e760ca4f786Daniel Jasper if (Line->Level > 1 || (!Line->InPPDirective && Line->Level > 0)) 1625526ed11ad9743c773df76bd1649d33fb92c2b8cbManuel Klimek --Line->Level; 162696e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (CommentsBeforeNextToken.empty() && FormatTok->Tok.is(tok::l_brace)) { 1627651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CompoundStatementIndenter Indenter(this, Style, Line->Level); 16282726877196b41b922f10f794801b313980e1a8adNico Weber parseBlock(/*MustBeDeclaration=*/false); 1629e490705e6678a2e830cecacbe8142d9b369d8341Manuel Klimek if (FormatTok->Tok.is(tok::kw_break)) { 163087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Style.BraceWrapping.AfterControlStatement) 1631e490705e6678a2e830cecacbe8142d9b369d8341Manuel Klimek addUnwrappedLine(); 1632e490705e6678a2e830cecacbe8142d9b369d8341Manuel Klimek parseStructuralElement(); 1633e490705e6678a2e830cecacbe8142d9b369d8341Manuel Klimek } 1634651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addUnwrappedLine(); 1635651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else { 1636b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (FormatTok->is(tok::semi)) 1637b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar nextToken(); 1638651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addUnwrappedLine(); 1639bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper } 1640526ed11ad9743c773df76bd1649d33fb92c2b8cbManuel Klimek Line->Level = OldLineLevel; 16414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (FormatTok->isNot(tok::l_brace)) { 16424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar parseStructuralElement(); 16434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar addUnwrappedLine(); 16444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 1645bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper} 1646bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper 1647bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jaspervoid UnwrappedLineParser::parseCaseLabel() { 164896e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek assert(FormatTok->Tok.is(tok::kw_case) && "'case' expected"); 1649bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper // FIXME: fix handling of complex expressions here. 1650bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper do { 1651bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper nextToken(); 165296e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek } while (!eof() && !FormatTok->Tok.is(tok::colon)); 1653bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper parseLabel(); 1654bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper} 1655bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper 1656bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jaspervoid UnwrappedLineParser::parseSwitch() { 165796e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek assert(FormatTok->Tok.is(tok::kw_switch) && "'switch' expected"); 1658bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper nextToken(); 165996e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (FormatTok->Tok.is(tok::l_paren)) 16606eca03fcac1e408470d48e6309a280d3681f717dManuel Klimek parseParens(); 166196e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (FormatTok->Tok.is(tok::l_brace)) { 1662651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CompoundStatementIndenter Indenter(this, Style, Line->Level); 1663eff18b9b6f1218a6bbe4869989b08867823a4e75Daniel Jasper parseBlock(/*MustBeDeclaration=*/false); 1664bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper addUnwrappedLine(); 1665bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper } else { 1666bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper addUnwrappedLine(); 1667e865cc5e183a25983bc79aca2c9bc9a6fb775ab2Daniel Jasper ++Line->Level; 1668f0ab0a38d9482eef5495db845ff53ee689f9c80eManuel Klimek parseStructuralElement(); 1669e865cc5e183a25983bc79aca2c9bc9a6fb775ab2Daniel Jasper --Line->Level; 1670bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper } 1671bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper} 1672bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper 1673bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jaspervoid UnwrappedLineParser::parseAccessSpecifier() { 1674bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper nextToken(); 1675651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Understand Qt's slots. 167658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar if (FormatTok->isOneOf(Keywords.kw_slots, Keywords.kw_qslots)) 1677651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines nextToken(); 167856e49c5cc2b05e805c7aa9dc53672711e540d58bAlexander Kornienko // Otherwise, we don't know what it is, and we'd better keep the next token. 167996e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (FormatTok->Tok.is(tok::colon)) 168056e49c5cc2b05e805c7aa9dc53672711e540d58bAlexander Kornienko nextToken(); 1681bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper addUnwrappedLine(); 1682bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper} 1683bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper 16844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarbool UnwrappedLineParser::parseEnum() { 1685176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Won't be 'enum' for NS_ENUMs. 1686176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (FormatTok->Tok.is(tok::kw_enum)) 1687651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines nextToken(); 1688176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 16894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // In TypeScript, "enum" can also be used as property name, e.g. in interface 16904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // declarations. An "enum" keyword followed by a colon would be a syntax 16914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // error and thus assume it is just an identifier. 16924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Style.Language == FormatStyle::LK_JavaScript && 16934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar FormatTok->isOneOf(tok::colon, tok::question)) 16944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return false; 16954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1696cbeb1c6f337f73fe7d1135b379e45fbda0c4766dDaniel Jasper // Eat up enum class ... 16976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (FormatTok->Tok.is(tok::kw_class) || FormatTok->Tok.is(tok::kw_struct)) 16986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines nextToken(); 169987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 1700e27dc5d8ab967912b9a3d792ad32cad63981a974Daniel Jasper while (FormatTok->Tok.getIdentifierInfo() || 1701176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines FormatTok->isOneOf(tok::colon, tok::coloncolon, tok::less, 1702176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines tok::greater, tok::comma, tok::question)) { 1703308232c0aef773d24693f9e456dc3bc983934f7fManuel Klimek nextToken(); 1704308232c0aef773d24693f9e456dc3bc983934f7fManuel Klimek // We can have macros or attributes in between 'enum' and the enum name. 1705176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (FormatTok->is(tok::l_paren)) 1706a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko parseParens(); 170787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (FormatTok->is(tok::identifier)) { 1708a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko nextToken(); 170987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // If there are two identifiers in a row, this is likely an elaborate 171087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // return type. In Java, this can be "implements", etc. 171187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Style.Language == FormatStyle::LK_Cpp && 171287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar FormatTok->is(tok::identifier)) 17134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return false; 171487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 1715308232c0aef773d24693f9e456dc3bc983934f7fManuel Klimek } 1716176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1717176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Just a declaration or something is wrong. 1718176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (FormatTok->isNot(tok::l_brace)) 17194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return true; 1720176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines FormatTok->BlockKind = BK_Block; 1721176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1722176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (Style.Language == FormatStyle::LK_Java) { 1723176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Java enums are different. 1724176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines parseJavaEnumBody(); 17254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return true; 17264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 17274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Style.Language == FormatStyle::LK_Proto) { 172887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar parseBlock(/*MustBeDeclaration=*/true); 17294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return true; 1730308232c0aef773d24693f9e456dc3bc983934f7fManuel Klimek } 1731176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1732176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Parse enum body. 1733176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool HasError = !parseBracedList(/*ContinueOnSemicolons=*/true); 1734176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (HasError) { 1735176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (FormatTok->is(tok::semi)) 1736176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines nextToken(); 1737176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines addUnwrappedLine(); 1738176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 17394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return true; 1740176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 174187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // There is no addUnwrappedLine() here so that we fall through to parsing a 174287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // structural element afterwards. Thus, in "enum A {} n, m;", 1743308232c0aef773d24693f9e456dc3bc983934f7fManuel Klimek // "} n, m;" will end up in one unwrapped line. 1744de7685487c5d628dd9fe64c4f861cd1888f50fc7Manuel Klimek} 1745de7685487c5d628dd9fe64c4f861cd1888f50fc7Manuel Klimek 1746176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid UnwrappedLineParser::parseJavaEnumBody() { 1747176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Determine whether the enum is simple, i.e. does not have a semicolon or 1748176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // constants with class bodies. Simple enums can be formatted like braced 1749176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // lists, contracted to a single line, etc. 1750176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines unsigned StoredPosition = Tokens->getPosition(); 1751176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool IsSimple = true; 1752176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines FormatToken *Tok = Tokens->getNextToken(); 1753176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines while (Tok) { 1754176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (Tok->is(tok::r_brace)) 1755176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 1756176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (Tok->isOneOf(tok::l_brace, tok::semi)) { 1757176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines IsSimple = false; 1758176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 1759176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 1760176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // FIXME: This will also mark enums with braces in the arguments to enum 1761176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // constants as "not simple". This is probably fine in practice, though. 1762176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Tok = Tokens->getNextToken(); 1763176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 1764176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines FormatTok = Tokens->setPosition(StoredPosition); 1765176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1766176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (IsSimple) { 1767176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines parseBracedList(); 1768176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines addUnwrappedLine(); 1769176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return; 1770176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 1771176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1772176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Parse the body of a more complex enum. 1773176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // First add a line for everything up to the "{". 1774176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines nextToken(); 1775176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines addUnwrappedLine(); 1776176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++Line->Level; 1777176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1778176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Parse the enum constants. 1779176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines while (FormatTok) { 1780176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (FormatTok->is(tok::l_brace)) { 1781176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Parse the constant's class body. 1782176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines parseBlock(/*MustBeDeclaration=*/true, /*AddLevel=*/true, 1783176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines /*MunchSemi=*/false); 1784176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } else if (FormatTok->is(tok::l_paren)) { 1785176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines parseParens(); 1786176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } else if (FormatTok->is(tok::comma)) { 1787176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines nextToken(); 1788176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines addUnwrappedLine(); 1789176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } else if (FormatTok->is(tok::semi)) { 1790176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines nextToken(); 1791176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines addUnwrappedLine(); 1792176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 1793176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } else if (FormatTok->is(tok::r_brace)) { 1794176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines addUnwrappedLine(); 1795176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 1796176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } else { 1797176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines nextToken(); 1798176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 1799176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 1800176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 1801176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Parse the class body after the enum's ";" if any. 1802176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines parseLevel(/*HasOpeningBrace=*/true); 1803176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines nextToken(); 1804176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines --Line->Level; 1805176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines addUnwrappedLine(); 1806176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 1807176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 180847ea7f64108163491ed74dc746c8d94e10764704Manuel Klimekvoid UnwrappedLineParser::parseRecord() { 1809176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const FormatToken &InitialToken = *FormatTok; 1810de7685487c5d628dd9fe64c4f861cd1888f50fc7Manuel Klimek nextToken(); 1811b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 1812b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // The actual identifier can be a nested name specifier, and in macros 1813b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // it is often token-pasted. 1814b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar while (FormatTok->isOneOf(tok::identifier, tok::coloncolon, tok::hashhash, 1815b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar tok::kw___attribute, tok::kw___declspec, 1816b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar tok::kw_alignas) || 1817b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ((Style.Language == FormatStyle::LK_Java || 1818b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar Style.Language == FormatStyle::LK_JavaScript) && 1819b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar FormatTok->isOneOf(tok::period, tok::comma))) { 1820b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar bool IsNonMacroIdentifier = 1821b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar FormatTok->is(tok::identifier) && 1822b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar FormatTok->TokenText != FormatTok->TokenText.upper(); 182347ea7f64108163491ed74dc746c8d94e10764704Manuel Klimek nextToken(); 182447ea7f64108163491ed74dc746c8d94e10764704Manuel Klimek // We can have macros or attributes in between 'class' and the class name. 1825b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!IsNonMacroIdentifier && FormatTok->Tok.is(tok::l_paren)) 182647ea7f64108163491ed74dc746c8d94e10764704Manuel Klimek parseParens(); 1827b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar } 182847ea7f64108163491ed74dc746c8d94e10764704Manuel Klimek 1829b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // Note that parsing away template declarations here leads to incorrectly 1830b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // accepting function declarations as record declarations. 1831b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // In general, we cannot solve this problem. Consider: 1832b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // class A<int> B() {} 1833b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // which can be a function definition or a class definition when B() is a 1834b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // macro. If we find enough real-world cases where this is a problem, we 1835b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // can parse for the 'template' keyword in the beginning of the statement, 1836b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // and thus rule out the record production in case there is no template 1837b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // (this would still leave us with an ambiguity between template function 1838b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // and class declarations). 1839b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (FormatTok->isOneOf(tok::colon, tok::less)) { 1840b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar while (!eof()) { 1841b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (FormatTok->is(tok::l_brace)) { 1842b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar calculateBraceTypes(/*ExpectClassBody=*/true); 1843b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (!tryToParseBracedList()) 1844b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar break; 1845606e07ecc0b7b0e01d23baa833b4b4c73af0d4f4Manuel Klimek } 1846b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (FormatTok->Tok.is(tok::semi)) 1847b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return; 1848b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar nextToken(); 1849de7685487c5d628dd9fe64c4f861cd1888f50fc7Manuel Klimek } 185047ea7f64108163491ed74dc746c8d94e10764704Manuel Klimek } 185196e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (FormatTok->Tok.is(tok::l_brace)) { 1852176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (ShouldBreakBeforeBrace(Style, InitialToken)) 185344135b8836fc3ffb84e540d8a097955271ccbc23Manuel Klimek addUnwrappedLine(); 185444135b8836fc3ffb84e540d8a097955271ccbc23Manuel Klimek 1855651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines parseBlock(/*MustBeDeclaration=*/true, /*AddLevel=*/true, 1856aabfb2712e180bb11e5dfc4f2a273890a6c5da66Manuel Klimek /*MunchSemi=*/false); 185744135b8836fc3ffb84e540d8a097955271ccbc23Manuel Klimek } 185887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // There is no addUnwrappedLine() here so that we fall through to parsing a 185987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // structural element afterwards. Thus, in "class A {} n, m;", 186087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // "} n, m;" will end up in one unwrapped line. 1861bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper} 1862bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper 18631abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Webervoid UnwrappedLineParser::parseObjCProtocolList() { 186496e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek assert(FormatTok->Tok.is(tok::less) && "'<' expected."); 18651abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber do 18661abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber nextToken(); 186796e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek while (!eof() && FormatTok->Tok.isNot(tok::greater)); 18681abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber nextToken(); // Skip '>'. 18691abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber} 18701abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber 18711abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Webervoid UnwrappedLineParser::parseObjCUntilAtEnd() { 18721abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber do { 187396e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (FormatTok->Tok.isObjCAtKeyword(tok::objc_end)) { 18741abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber nextToken(); 18751abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber addUnwrappedLine(); 18761abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber break; 18771abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber } 18787186ccc86ee5802c33886d6dd4c5386c7e9fd1aaDaniel Jasper if (FormatTok->is(tok::l_brace)) { 18797186ccc86ee5802c33886d6dd4c5386c7e9fd1aaDaniel Jasper parseBlock(/*MustBeDeclaration=*/false); 18807186ccc86ee5802c33886d6dd4c5386c7e9fd1aaDaniel Jasper // In ObjC interfaces, nothing should be following the "}". 18817186ccc86ee5802c33886d6dd4c5386c7e9fd1aaDaniel Jasper addUnwrappedLine(); 1882651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if (FormatTok->is(tok::r_brace)) { 1883651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Ignore stray "}". parseStructuralElement doesn't consume them. 1884651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines nextToken(); 1885651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addUnwrappedLine(); 18867186ccc86ee5802c33886d6dd4c5386c7e9fd1aaDaniel Jasper } else { 18877186ccc86ee5802c33886d6dd4c5386c7e9fd1aaDaniel Jasper parseStructuralElement(); 18887186ccc86ee5802c33886d6dd4c5386c7e9fd1aaDaniel Jasper } 18891abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber } while (!eof()); 18901abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber} 18911abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber 189250767d8c8f2f667255bdb99692c0467ce992bc67Nico Webervoid UnwrappedLineParser::parseObjCInterfaceOrImplementation() { 189327d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber nextToken(); 1894f9955d309d3de328e65563baf2d34571249dccbbDaniel Jasper nextToken(); // interface name 189527d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber 189627d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber // @interface can be followed by either a base class, or a category. 189796e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (FormatTok->Tok.is(tok::colon)) { 189827d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber nextToken(); 1899f9955d309d3de328e65563baf2d34571249dccbbDaniel Jasper nextToken(); // base class name 190096e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek } else if (FormatTok->Tok.is(tok::l_paren)) 190127d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber // Skip category, if present. 190227d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber parseParens(); 190327d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber 190496e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (FormatTok->Tok.is(tok::less)) 19051abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber parseObjCProtocolList(); 190627d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber 19076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (FormatTok->Tok.is(tok::l_brace)) { 190887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar if (Style.BraceWrapping.AfterObjCDeclaration) 19096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines addUnwrappedLine(); 19102726877196b41b922f10f794801b313980e1a8adNico Weber parseBlock(/*MustBeDeclaration=*/true); 19116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 191227d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber 191327d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber // With instance variables, this puts '}' on its own line. Without instance 191427d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber // variables, this ends the @interface line. 191527d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber addUnwrappedLine(); 191627d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber 19171abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber parseObjCUntilAtEnd(); 19181abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber} 191927d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber 19201abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Webervoid UnwrappedLineParser::parseObjCProtocol() { 19211abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber nextToken(); 1922f9955d309d3de328e65563baf2d34571249dccbbDaniel Jasper nextToken(); // protocol name 19231abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber 192496e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (FormatTok->Tok.is(tok::less)) 19251abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber parseObjCProtocolList(); 19261abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber 19271abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber // Check for protocol declaration. 192896e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (FormatTok->Tok.is(tok::semi)) { 19291abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber nextToken(); 19301abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber return addUnwrappedLine(); 19311abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber } 19321abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber 19331abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber addUnwrappedLine(); 19341abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber parseObjCUntilAtEnd(); 193527d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber} 193627d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber 19370e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesvoid UnwrappedLineParser::parseJavaScriptEs6ImportExport() { 19384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool IsImport = FormatTok->is(Keywords.kw_import); 19394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar assert(IsImport || FormatTok->is(tok::kw_export)); 19400e2c34f92f00628d48968dfea096d36381f494cbStephen Hines nextToken(); 19410e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 1942b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar // Consume the "default" in "export default class/function". 1943b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (FormatTok->is(tok::kw_default)) 1944b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar nextToken(); 19450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 19464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // Consume "async function", "function" and "default function", so that these 19474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // get parsed as free-standing JS functions, i.e. do not require a trailing 19484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // semicolon. 19494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (FormatTok->is(Keywords.kw_async)) 19504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar nextToken(); 1951b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (FormatTok->is(Keywords.kw_function)) { 1952b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar nextToken(); 19530e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return; 19540e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 19550e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 19564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // For imports, `export *`, `export {...}`, consume the rest of the line up 19574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // to the terminating `;`. For everything else, just return and continue 19584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // parsing the structural element, i.e. the declaration or expression for 19594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // `export default`. 19604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!IsImport && !FormatTok->isOneOf(tok::l_brace, tok::star) && 19614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar !FormatTok->isStringLiteral()) 19624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return; 19630e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 19644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar while (!eof() && FormatTok->isNot(tok::semi)) { 19654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (FormatTok->is(tok::l_brace)) { 19664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar FormatTok->BlockKind = BK_Block; 19674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar parseBracedList(); 19684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else { 19694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar nextToken(); 19704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 19710e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 19720e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 19730e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 1974d98927d76557653fc517f997db89378267f9bdf3Daniel JasperLLVM_ATTRIBUTE_UNUSED static void printDebugInfo(const UnwrappedLine &Line, 1975d98927d76557653fc517f997db89378267f9bdf3Daniel Jasper StringRef Prefix = "") { 1976567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper llvm::dbgs() << Prefix << "Line(" << Line.Level << ")" 1977567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper << (Line.InPPDirective ? " MACRO" : "") << ": "; 1978567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper for (std::list<UnwrappedLineNode>::const_iterator I = Line.Tokens.begin(), 1979567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper E = Line.Tokens.end(); 1980567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper I != E; ++I) { 1981ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper llvm::dbgs() << I->Tok->Tok.getName() << "[" << I->Tok->Type << "] "; 1982567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper } 1983567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper for (std::list<UnwrappedLineNode>::const_iterator I = Line.Tokens.begin(), 1984567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper E = Line.Tokens.end(); 1985567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper I != E; ++I) { 1986567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper const UnwrappedLineNode &Node = *I; 1987567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper for (SmallVectorImpl<UnwrappedLine>::const_iterator 1988567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper I = Node.Children.begin(), 1989567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper E = Node.Children.end(); 1990567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper I != E; ++I) { 1991567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper printDebugInfo(*I, "\nChild: "); 1992567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper } 1993567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper } 1994567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper llvm::dbgs() << "\n"; 1995567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper} 1996567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper 1997bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jaspervoid UnwrappedLineParser::addUnwrappedLine() { 1998cbb6c41f3cec4a940201a8e2e65743c9f26c3673Daniel Jasper if (Line->Tokens.empty()) 199926f7e78018ed6ce8aa11b5eef94c772ca4ee48bfDaniel Jasper return; 20008fa37999164844a926448ef4656bbf7c42070235Manuel Klimek DEBUG({ 2001567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper if (CurrentLines == &Lines) 2002567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper printDebugInfo(*Line); 20038fa37999164844a926448ef4656bbf7c42070235Manuel Klimek }); 2004b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar CurrentLines->push_back(std::move(*Line)); 2005cbb6c41f3cec4a940201a8e2e65743c9f26c3673Daniel Jasper Line->Tokens.clear(); 2006525fe168c25a8273899281c5d2326c722fc3f2a5Manuel Klimek if (CurrentLines == &Lines && !PreprocessorDirectives.empty()) { 2007b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar CurrentLines->append( 2008b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar std::make_move_iterator(PreprocessorDirectives.begin()), 2009b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar std::make_move_iterator(PreprocessorDirectives.end())); 2010525fe168c25a8273899281c5d2326c722fc3f2a5Manuel Klimek PreprocessorDirectives.clear(); 2011525fe168c25a8273899281c5d2326c722fc3f2a5Manuel Klimek } 2012bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper} 2013bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper 201496e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimekbool UnwrappedLineParser::eof() const { return FormatTok->Tok.is(tok::eof); } 2015bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper 20166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool UnwrappedLineParser::isOnNewLine(const FormatToken &FormatTok) { 20176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return (Line->InPPDirective || FormatTok.HasUnescapedNewline) && 20186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines FormatTok.NewlinesBefore > 0; 20196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 20206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 202186721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimekvoid UnwrappedLineParser::flushComments(bool NewlineBeforeNext) { 202286721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek bool JustComments = Line->Tokens.empty(); 202396e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek for (SmallVectorImpl<FormatToken *>::const_iterator 202486721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek I = CommentsBeforeNextToken.begin(), 202586721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek E = CommentsBeforeNextToken.end(); 202686721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek I != E; ++I) { 2027b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (isOnNewLine(**I) && JustComments) 202886721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek addUnwrappedLine(); 202986721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek pushToken(*I); 203086721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek } 2031b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (NewlineBeforeNext && JustComments) 203286721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek addUnwrappedLine(); 203386721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek CommentsBeforeNextToken.clear(); 203486721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek} 203586721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek 2036bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jaspervoid UnwrappedLineParser::nextToken() { 2037bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper if (eof()) 2038bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper return; 20396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines flushComments(isOnNewLine(*FormatTok)); 204086721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek pushToken(FormatTok); 20414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Style.Language != FormatStyle::LK_JavaScript) 20424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar readToken(); 20434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar else 20444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar readTokenWithJavaScriptASI(); 20454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 20464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 20474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarconst FormatToken *UnwrappedLineParser::getPreviousToken() { 20484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // FIXME: This is a dirty way to access the previous token. Find a better 20494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // solution. 20504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!Line || Line->Tokens.empty()) 20514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return nullptr; 20524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return Line->Tokens.back().Tok; 2053d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek} 2054d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek 2055d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimekvoid UnwrappedLineParser::readToken() { 205686721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek bool CommentsInCurrentLine = true; 205786721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek do { 205886721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek FormatTok = Tokens->getNextToken(); 2059651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines assert(FormatTok); 206096e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek while (!Line->InPPDirective && FormatTok->Tok.is(tok::hash) && 206196e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek (FormatTok->HasUnescapedNewline || FormatTok->IsFirst)) { 206286721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek // If there is an unfinished unwrapped line, we flush the preprocessor 206386721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek // directives only after that unwrapped line was finished later. 20640e2c34f92f00628d48968dfea096d36381f494cbStephen Hines bool SwitchToPreprocessorLines = !Line->Tokens.empty(); 206586721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek ScopedLineState BlockState(*this, SwitchToPreprocessorLines); 20664128e19d6f3ae42e840bc6aaf6ce6d052a46f7e4Alexander Kornienko // Comments stored before the preprocessor directive need to be output 20674128e19d6f3ae42e840bc6aaf6ce6d052a46f7e4Alexander Kornienko // before the preprocessor directive, at the same level as the 20684128e19d6f3ae42e840bc6aaf6ce6d052a46f7e4Alexander Kornienko // preprocessor directive, as we consider them to apply to the directive. 20696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines flushComments(isOnNewLine(*FormatTok)); 207086721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek parsePPDirective(); 207186721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek } 20726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines while (FormatTok->Type == TT_ConflictStart || 20736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines FormatTok->Type == TT_ConflictEnd || 20746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines FormatTok->Type == TT_ConflictAlternative) { 20756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (FormatTok->Type == TT_ConflictStart) { 20766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines conditionalCompilationStart(/*Unreachable=*/false); 20776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } else if (FormatTok->Type == TT_ConflictAlternative) { 20786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines conditionalCompilationAlternative(); 20796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } else if (FormatTok->Type == TT_ConflictEnd) { 20806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines conditionalCompilationEnd(); 20816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 20826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines FormatTok = Tokens->getNextToken(); 20836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines FormatTok->MustBreakBefore = true; 20846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 20856fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko 20866fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko if (!PPStack.empty() && (PPStack.back() == PP_Unreachable) && 20876fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko !Line->InPPDirective) { 20886fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko continue; 20896fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko } 20906fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko 209196e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek if (!FormatTok->Tok.is(tok::comment)) 209286721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek return; 20936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (isOnNewLine(*FormatTok) || FormatTok->IsFirst) { 209486721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek CommentsInCurrentLine = false; 209586721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek } 209686721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek if (CommentsInCurrentLine) { 209786721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek pushToken(FormatTok); 209886721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek } else { 209986721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek CommentsBeforeNextToken.push_back(FormatTok); 210086721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek } 210186721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek } while (!eof()); 210286721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek} 210386721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek 210496e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimekvoid UnwrappedLineParser::pushToken(FormatToken *Tok) { 2105567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper Line->Tokens.push_back(UnwrappedLineNode(Tok)); 210686721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek if (MustBreakBeforeNextToken) { 2107567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper Line->Tokens.back().Tok->MustBreakBefore = true; 210886721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek MustBreakBeforeNextToken = false; 2109d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek } 2110bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper} 2111bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper 2112cd162384a552ef4e4913244f4f14b9a3e5a791e1Daniel Jasper} // end namespace format 2113cd162384a552ef4e4913244f4f14b9a3e5a791e1Daniel Jasper} // end namespace clang 2114