From: Martin Probst Date: Fri, 2 Sep 2016 14:29:48 +0000 (+0000) Subject: clang-format: [JS] merge requoting replacements. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9348abc0492d694ebc44e08502e7adaaf44f6e78;p=clang clang-format: [JS] merge requoting replacements. Summary: When formatting source code that needs both requoting and reindentation, merge the replacements to avoid erroring out for conflicting replacements. Also removes the misleading Replacements parameter from the TokenAnalyzer API. Reviewers: djasper Subscribers: klimek, cfe-commits Differential Revision: https://reviews.llvm.org/D24155 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@280487 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index 26ef38d60c..625f8554de 100644 --- a/lib/Format/Format.cpp +++ b/lib/Format/Format.cpp @@ -801,14 +801,15 @@ public: tooling::Replacements analyze(TokenAnnotator &Annotator, SmallVectorImpl &AnnotatedLines, - FormatTokenLexer &Tokens, tooling::Replacements &Result) override { + FormatTokenLexer &Tokens) override { + tooling::Replacements RequoteReplaces; deriveLocalStyle(AnnotatedLines); AffectedRangeMgr.computeAffectedLines(AnnotatedLines.begin(), AnnotatedLines.end()); if (Style.Language == FormatStyle::LK_JavaScript && Style.JavaScriptQuotes != FormatStyle::JSQS_Leave) - requoteJSStringLiteral(AnnotatedLines, Result); + requoteJSStringLiteral(AnnotatedLines, RequoteReplaces); for (unsigned i = 0, e = AnnotatedLines.size(); i != e; ++i) { Annotator.calculateFormattingInformation(*AnnotatedLines[i]); @@ -825,7 +826,7 @@ public: UnwrappedLineFormatter(&Indenter, &Whitespaces, Style, Tokens.getKeywords(), IncompleteFormat) .format(AnnotatedLines); - return Whitespaces.generateReplacements(); + return RequoteReplaces.merge(Whitespaces.generateReplacements()); } private: @@ -997,7 +998,7 @@ public: tooling::Replacements analyze(TokenAnnotator &Annotator, SmallVectorImpl &AnnotatedLines, - FormatTokenLexer &Tokens, tooling::Replacements &Result) override { + FormatTokenLexer &Tokens) override { // FIXME: in the current implementation the granularity of affected range // is an annotated line. However, this is not sufficient. Furthermore, // redundant code introduced by replacements does not necessarily diff --git a/lib/Format/SortJavaScriptImports.cpp b/lib/Format/SortJavaScriptImports.cpp index 2a90e9ab76..42089c522e 100644 --- a/lib/Format/SortJavaScriptImports.cpp +++ b/lib/Format/SortJavaScriptImports.cpp @@ -127,7 +127,7 @@ public: tooling::Replacements analyze(TokenAnnotator &Annotator, SmallVectorImpl &AnnotatedLines, - FormatTokenLexer &Tokens, tooling::Replacements &) override { + FormatTokenLexer &Tokens) override { tooling::Replacements Result; AffectedRangeMgr.computeAffectedLines(AnnotatedLines.begin(), AnnotatedLines.end()); @@ -282,7 +282,6 @@ private: SmallVectorImpl &AnnotatedLines) { SmallVector References; SourceLocation Start; - bool FoundLines = false; AnnotatedLine *FirstNonImportLine = nullptr; bool AnyImportAffected = false; for (auto Line : AnnotatedLines) { @@ -296,7 +295,6 @@ private: Start = Line->First->Tok.getLocation(); if (!Current) continue; // Only comments on this line. - FoundLines = true; JsModuleReference Reference; Reference.Range.setBegin(Start); if (!parseModuleReference(Keywords, Reference)) { diff --git a/lib/Format/TokenAnalyzer.cpp b/lib/Format/TokenAnalyzer.cpp index 7baba62f0a..d3122ca2ee 100644 --- a/lib/Format/TokenAnalyzer.cpp +++ b/lib/Format/TokenAnalyzer.cpp @@ -107,7 +107,7 @@ tooling::Replacements TokenAnalyzer::process() { } tooling::Replacements RunResult = - analyze(Annotator, AnnotatedLines, Tokens, Result); + analyze(Annotator, AnnotatedLines, Tokens); DEBUG({ llvm::dbgs() << "Replacements for run " << Run << ":\n"; diff --git a/lib/Format/TokenAnalyzer.h b/lib/Format/TokenAnalyzer.h index c1aa9c594f..aef1ae3163 100644 --- a/lib/Format/TokenAnalyzer.h +++ b/lib/Format/TokenAnalyzer.h @@ -87,7 +87,7 @@ protected: virtual tooling::Replacements analyze(TokenAnnotator &Annotator, SmallVectorImpl &AnnotatedLines, - FormatTokenLexer &Tokens, tooling::Replacements &Result) = 0; + FormatTokenLexer &Tokens) = 0; void consumeUnwrappedLine(const UnwrappedLine &TheLine) override; diff --git a/unittests/Format/FormatTestJS.cpp b/unittests/Format/FormatTestJS.cpp index 60063934cd..ed227852ef 100644 --- a/unittests/Format/FormatTestJS.cpp +++ b/unittests/Format/FormatTestJS.cpp @@ -1334,6 +1334,13 @@ TEST_F(FormatTestJS, RequoteStringsSingle) { "let x = \"single\";\n"); } +TEST_F(FormatTestJS, RequoteAndIndent) { + verifyFormat("let x = someVeryLongFunctionThatGoesOnAndOn(\n" + " 'double quoted string that needs wrapping');", + "let x = someVeryLongFunctionThatGoesOnAndOn(" + "\"double quoted string that needs wrapping\");"); +} + TEST_F(FormatTestJS, RequoteStringsDouble) { FormatStyle DoubleQuotes = getGoogleStyle(FormatStyle::LK_JavaScript); DoubleQuotes.JavaScriptQuotes = FormatStyle::JSQS_Double;