Author: Jonathan Coe Date: 2020-02-27T13:47:29Z New Revision: 7dfe0cc7f5765dc729685a0aa468cdf54a265a11
URL: https://github.com/llvm/llvm-project/commit/7dfe0cc7f5765dc729685a0aa468cdf54a265a11 DIFF: https://github.com/llvm/llvm-project/commit/7dfe0cc7f5765dc729685a0aa468cdf54a265a11.diff LOG: [clang-format] Recognize C# named argument colons as a token type Summary: No longer merge 'name' and ':' into a single token. Ensure that line breaks cannot be placed before or after a named-argument colon. Ensure that no space is inserted before a named-argument colon. Reviewers: krasimir Reviewed By: krasimir Subscribers: cfe-commits, MyDeveloperDay Tags: #clang-format, #clang Differential Revision: https://reviews.llvm.org/D75244 Added: Modified: clang/lib/Format/FormatToken.h clang/lib/Format/FormatTokenLexer.cpp clang/lib/Format/FormatTokenLexer.h clang/lib/Format/TokenAnnotator.cpp clang/unittests/Format/FormatTestCSharp.cpp Removed: ################################################################################ diff --git a/clang/lib/Format/FormatToken.h b/clang/lib/Format/FormatToken.h index 6bbfdcf37f93..bab513a03a33 100644 --- a/clang/lib/Format/FormatToken.h +++ b/clang/lib/Format/FormatToken.h @@ -103,7 +103,7 @@ namespace format { TYPE(UnaryOperator) \ TYPE(CSharpStringLiteral) \ TYPE(CSharpNullCoalescing) \ - TYPE(CSharpNamedArgument) \ + TYPE(CSharpNamedArgumentColon) \ TYPE(Unknown) enum TokenType { diff --git a/clang/lib/Format/FormatTokenLexer.cpp b/clang/lib/Format/FormatTokenLexer.cpp index 8acae56e2232..aa8cf427d468 100644 --- a/clang/lib/Format/FormatTokenLexer.cpp +++ b/clang/lib/Format/FormatTokenLexer.cpp @@ -76,8 +76,6 @@ void FormatTokenLexer::tryMergePreviousTokens() { return; if (Style.isCSharp()) { - if (tryMergeCSharpNamedArgument()) - return; if (tryMergeCSharpAttributeAndTarget()) return; if (tryMergeCSharpKeywordVariables()) @@ -186,39 +184,6 @@ bool FormatTokenLexer::tryMergeJSPrivateIdentifier() { return true; } -// Merge 'argName' and ':' into a single token in `foo(argName: bar)`. -bool FormatTokenLexer::tryMergeCSharpNamedArgument() { - if (Tokens.size() < 2) - return false; - auto &Colon = *(Tokens.end() - 1); - if (!Colon->is(tok::colon)) - return false; - - auto &Name = *(Tokens.end() - 2); - if (!Name->is(tok::identifier)) - return false; - - const FormatToken *CommaOrLeftParen = nullptr; - for (auto I = Tokens.rbegin() + 2, E = Tokens.rend(); I != E; ++I) { - // NB: Because previous pointers are not initialized yet, this cannot use - // Token.getPreviousNonComment. - if ((*I)->isNot(tok::comment)) { - CommaOrLeftParen = *I; - break; - } - } - - if (!CommaOrLeftParen || !CommaOrLeftParen->isOneOf(tok::l_paren, tok::comma)) - return false; - - Name->TokenText = StringRef(Name->TokenText.begin(), - Colon->TokenText.end() - Name->TokenText.begin()); - Name->ColumnWidth += Colon->ColumnWidth; - Name->Type = TT_CSharpNamedArgument; - Tokens.erase(Tokens.end() - 1); - return true; -} - // Search for verbatim or interpolated string literals @"ABC" or // $"aaaaa{abc}aaaaa" i and mark the token as TT_CSharpStringLiteral, and to // prevent splitting of @, $ and ". @@ -609,7 +574,7 @@ void FormatTokenLexer::handleCSharpVerbatimAndInterpolatedStrings() { size_t LastBreak = LiteralText.rfind('\n'); if (LastBreak != StringRef::npos) { CSharpStringLiteral->IsMultiline = true; - unsigned StartColumn = 0; // The template tail spans the entire line. + unsigned StartColumn = 0; CSharpStringLiteral->LastLineColumnWidth = encoding::columnWidthWithTabs( LiteralText.substr(LastBreak + 1, LiteralText.size()), StartColumn, Style.TabWidth, Encoding); diff --git a/clang/lib/Format/FormatTokenLexer.h b/clang/lib/Format/FormatTokenLexer.h index 1f930d75e805..4fffb36272f7 100644 --- a/clang/lib/Format/FormatTokenLexer.h +++ b/clang/lib/Format/FormatTokenLexer.h @@ -56,7 +56,6 @@ class FormatTokenLexer { bool tryMergeCSharpDoubleQuestion(); bool tryTransformCSharpForEach(); bool tryMergeCSharpAttributeAndTarget(); - bool tryMergeCSharpNamedArgument(); bool tryMergeTokens(ArrayRef<tok::TokenKind> Kinds, TokenType NewType); diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index ff5827c8c4d4..fb60b8fb7b58 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -776,6 +776,11 @@ class AnnotatingParser { Tok->Type = TT_JsTypeColon; break; } + } else if (Style.isCSharp()) { + if (Contexts.back().ContextKind == tok::l_paren) { + Tok->Type = TT_CSharpNamedArgumentColon; + break; + } } if (Contexts.back().ColonIsDictLiteral || Style.Language == FormatStyle::LK_Proto || @@ -3052,6 +3057,8 @@ bool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line, return Style.SpacesInContainerLiterals; if (Right.is(TT_AttributeColon)) return false; + if (Right.is(TT_CSharpNamedArgumentColon)) + return false; return true; } if (Left.is(TT_UnaryOperator)) { @@ -3200,7 +3207,11 @@ bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line, if (Right.NewlinesBefore > 1 && Style.MaxEmptyLinesToKeep > 0) return true; - if (Style.Language == FormatStyle::LK_JavaScript) { + if (Style.isCSharp()) { + if (Right.is(TT_CSharpNamedArgumentColon) || + Left.is(TT_CSharpNamedArgumentColon)) + return false; + } else if (Style.Language == FormatStyle::LK_JavaScript) { // FIXME: This might apply to other languages and token kinds. if (Right.is(tok::string_literal) && Left.is(tok::plus) && Left.Previous && Left.Previous->is(tok::string_literal)) @@ -3485,9 +3496,12 @@ bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line, bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line, const FormatToken &Right) { const FormatToken &Left = *Right.Previous; - // Language-specific stuff. - if (Style.Language == FormatStyle::LK_Java) { + if (Style.isCSharp()) { + if (Left.is(TT_CSharpNamedArgumentColon) || + Right.is(TT_CSharpNamedArgumentColon)) + return false; + } else if (Style.Language == FormatStyle::LK_Java) { if (Left.isOneOf(Keywords.kw_throws, Keywords.kw_extends, Keywords.kw_implements)) return false; diff --git a/clang/unittests/Format/FormatTestCSharp.cpp b/clang/unittests/Format/FormatTestCSharp.cpp index 0428de34728a..ec8dfff94a2b 100644 --- a/clang/unittests/Format/FormatTestCSharp.cpp +++ b/clang/unittests/Format/FormatTestCSharp.cpp @@ -546,6 +546,8 @@ PrintOrderDetails(orderNum: 31, productName: "Red Mug", PrintOrderDetails(orderNum: 31, productName: "Red Mug", // comment sellerName: "Gift Shop");)", Style); + + verifyFormat(R"(foreach (var tickCount in task.Begin(seed: 0)) {)", Style); } TEST_F(FormatTestCSharp, CSharpPropertyAccessors) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits