Hi djasper,
Merge template strings (marked by backticks ``).
Do not format any contents of template strings.
http://reviews.llvm.org/D7763
Files:
lib/Format/Format.cpp
lib/Format/FormatToken.h
unittests/Format/FormatTestJS.cpp
EMAIL PREFERENCES
http://reviews.llvm.org/settings/panel/emailpreferences/
Index: lib/Format/Format.cpp
===================================================================
--- lib/Format/Format.cpp
+++ lib/Format/Format.cpp
@@ -617,7 +617,7 @@
do {
Tokens.push_back(getNextToken());
tryMergePreviousTokens();
- if (Tokens.back()->NewlinesBefore > 0)
+ if (Tokens.back()->NewlinesBefore > 0 || Tokens.back()->IsMultiline)
FirstInLineIndex = Tokens.size() - 1;
} while (Tokens.back()->Tok.isNot(tok::eof));
return Tokens;
@@ -639,6 +639,8 @@
return;
if (tryMergeEscapeSequence())
return;
+ if (tryMergeTemplateString())
+ return;
static tok::TokenKind JSIdentity[] = {tok::equalequal, tok::equal};
static tok::TokenKind JSNotIdentity[] = {tok::exclaimequal, tok::equal};
@@ -779,6 +781,42 @@
return false;
}
+ bool tryMergeTemplateString() {
+ if (Tokens.size() < 2)
+ return false;
+ FormatToken *End = Tokens.back();
+ if (!(End->is(tok::unknown) && End->TokenText == "`"))
+ return false;
+ unsigned TokenCount = 0;
+ unsigned LastColumn = End->OriginalColumn;
+ bool IsMultiline = false;
+ const char *EndOffset = End->TokenText.data() + 1;
+ for (auto I = Tokens.rbegin() + 1, E = Tokens.rend(); I != E; I++) {
+ ++TokenCount;
+ IsMultiline =
+ IsMultiline || I[0]->NewlinesBefore > 0 || I[0]->IsMultiline;
+ if (I[0]->isNot(tok::unknown) || I[0]->TokenText != "`")
+ continue;
+
+ Tokens.resize(Tokens.size() - TokenCount);
+ Tokens.back()->Type = TT_TemplateString;
+ Tokens.back()->TokenText =
+ StringRef(Tokens.back()->TokenText.data(),
+ EndOffset - Tokens.back()->TokenText.data());
+ if (!IsMultiline) {
+ auto StartCol =
+ SourceMgr.getSpellingColumnNumber(Tokens.back()->Tok.getLocation());
+ auto EndCol =
+ SourceMgr.getSpellingColumnNumber(End->Tok.getLocation()) + 1;
+ Tokens.back()->ColumnWidth = EndCol - StartCol;
+ }
+ Tokens.back()->LastLineColumnWidth = LastColumn;
+ Tokens.back()->IsMultiline = IsMultiline;
+ return true;
+ }
+ return false;
+ }
+
bool tryMerge_TMacro() {
if (Tokens.size() < 4)
return false;
Index: lib/Format/FormatToken.h
===================================================================
--- lib/Format/FormatToken.h
+++ lib/Format/FormatToken.h
@@ -70,6 +70,7 @@
TT_StartOfName,
TT_TemplateCloser,
TT_TemplateOpener,
+ TT_TemplateString,
TT_TrailingAnnotation,
TT_TrailingReturnArrow,
TT_TrailingUnaryOperator,
Index: unittests/Format/FormatTestJS.cpp
===================================================================
--- unittests/Format/FormatTestJS.cpp
+++ unittests/Format/FormatTestJS.cpp
@@ -573,5 +573,33 @@
"};");
}
+TEST_F(FormatTestJS, TemplateStrings) {
+ // Keeps any whitespace/indentation within the template string.
+ EXPECT_EQ("var x = `hello\n"
+ " ${ name }\n"
+ " !`;",
+ format("var x = `hello\n"
+ " ${ name }\n"
+ " !`;"));
+ verifyFormat("var x =\n"
+ " `hello ${world}` >= some();",
+ getGoogleJSStyleWithColumns(34)); // Barely doesn't fit.
+ verifyFormat("var x = `hello ${world}` >= some();",
+ getGoogleJSStyleWithColumns(35)); // Barely fits.
+ EXPECT_EQ("var x = `hello\n"
+ " ${world}` >=\n"
+ " some();",
+ format("var x =\n"
+ " `hello\n"
+ " ${world}` >= some();",
+ getGoogleJSStyleWithColumns(21))); // Barely doesn't fit.
+ EXPECT_EQ("var x = `hello\n"
+ " ${world}` >= some();",
+ format("var x =\n"
+ " `hello\n"
+ " ${world}` >= some();",
+ getGoogleJSStyleWithColumns(22))); // Barely fits.
+}
+
} // end namespace tooling
} // end namespace clang
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits