@@ -1010,36 +1010,20 @@ class FormatTokenLexer {
1010
1010
return false ;
1011
1011
1012
1012
unsigned TokenCount = 0 ;
1013
- bool IsMultiline = false ;
1014
- unsigned EndColumnInFirstLine =
1015
- EndBacktick->OriginalColumn + EndBacktick->ColumnWidth ;
1016
1013
for (auto I = Tokens.rbegin () + 1 , E = Tokens.rend (); I != E; I++) {
1017
1014
++TokenCount;
1018
- if (I[0 ]->IsMultiline )
1019
- IsMultiline = true ;
1020
1015
1021
1016
// If there was a preceding template string, this must be the start of a
1022
1017
// template string, not the end.
1023
1018
if (I[0 ]->is (TT_TemplateString))
1024
1019
return false ;
1025
1020
1026
- if (I[0 ]->isNot (tok::unknown) || I[0 ]->TokenText != " `" ) {
1027
- // Keep track of the rhs offset of the last token to wrap across lines -
1028
- // its the rhs offset of the first line of the template string, used to
1029
- // determine its width.
1030
- if (I[0 ]->IsMultiline )
1031
- EndColumnInFirstLine = I[0 ]->OriginalColumn + I[0 ]->ColumnWidth ;
1032
- // If the token has newlines, the token before it (if it exists) is the
1033
- // rhs end of the previous line.
1034
- if (I[0 ]->NewlinesBefore > 0 && (I + 1 != E)) {
1035
- EndColumnInFirstLine = I[1 ]->OriginalColumn + I[1 ]->ColumnWidth ;
1036
- IsMultiline = true ;
1037
- }
1021
+ if (I[0 ]->isNot (tok::unknown) || I[0 ]->TokenText != " `" )
1038
1022
continue ;
1039
- }
1040
1023
1041
1024
Tokens.resize (Tokens.size () - TokenCount);
1042
- Tokens.back ()->Type = TT_TemplateString;
1025
+ FormatToken *TemplateStringToken = Tokens.back ();
1026
+ TemplateStringToken->Type = TT_TemplateString;
1043
1027
const char *EndOffset =
1044
1028
EndBacktick->TokenText .data () + 1 + CommentBacktickPos;
1045
1029
if (CommentBacktickPos != 0 ) {
@@ -1048,32 +1032,26 @@ class FormatTokenLexer {
1048
1032
SourceLocation Loc = EndBacktick->Tok .getLocation ();
1049
1033
resetLexer (SourceMgr.getFileOffset (Loc) + CommentBacktickPos + 1 );
1050
1034
}
1051
- Tokens.back ()->TokenText =
1052
- StringRef (Tokens.back ()->TokenText .data (),
1053
- EndOffset - Tokens.back ()->TokenText .data ());
1054
-
1055
- unsigned EndOriginalColumn = EndBacktick->OriginalColumn ;
1056
- if (EndOriginalColumn == 0 ) {
1057
- SourceLocation Loc = EndBacktick->Tok .getLocation ();
1058
- EndOriginalColumn = SourceMgr.getSpellingColumnNumber (Loc);
1059
- }
1060
- // If the ` is further down within the token (e.g. in a comment).
1061
- EndOriginalColumn += CommentBacktickPos;
1062
-
1063
- if (IsMultiline) {
1064
- // ColumnWidth is from backtick to last token in line.
1065
- // LastLineColumnWidth is 0 to backtick.
1066
- // x = `some content
1067
- // until here`;
1068
- Tokens.back ()->ColumnWidth =
1069
- EndColumnInFirstLine - Tokens.back ()->OriginalColumn ;
1070
- // +1 for the ` itself.
1071
- Tokens.back ()->LastLineColumnWidth = EndOriginalColumn + 1 ;
1072
- Tokens.back ()->IsMultiline = true ;
1073
- } else {
1074
- // Token simply spans from start to end, +1 for the ` itself.
1075
- Tokens.back ()->ColumnWidth =
1076
- EndOriginalColumn - Tokens.back ()->OriginalColumn + 1 ;
1035
+ StringRef LiteralText =
1036
+ StringRef (TemplateStringToken->TokenText .data (),
1037
+ EndOffset - TemplateStringToken->TokenText .data ());
1038
+ TemplateStringToken->TokenText = LiteralText;
1039
+
1040
+ size_t FirstBreak = LiteralText.find (' \n ' );
1041
+ StringRef FirstLineText = FirstBreak == StringRef::npos
1042
+ ? LiteralText
1043
+ : LiteralText.substr (0 , FirstBreak);
1044
+ TemplateStringToken->ColumnWidth = encoding::columnWidthWithTabs (
1045
+ FirstLineText, TemplateStringToken->OriginalColumn , Style.TabWidth ,
1046
+ Encoding);
1047
+ size_t LastBreak = LiteralText.rfind (' \n ' );
1048
+ if (LastBreak != StringRef::npos) {
1049
+ TemplateStringToken->IsMultiline = true ;
1050
+ unsigned StartColumn = 0 ; // The template tail spans the entire line.
1051
+ TemplateStringToken->LastLineColumnWidth =
1052
+ encoding::columnWidthWithTabs (
1053
+ LiteralText.substr (LastBreak + 1 , LiteralText.size ()),
1054
+ StartColumn, Style.TabWidth , Encoding);
1077
1055
}
1078
1056
return true ;
1079
1057
}
0 commit comments