diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index 6cbaf8a30812..11acb597aa40 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -3115,6 +3115,16 @@ bool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line, Keywords.kw_lock)) return Style.SpaceBeforeParens == FormatStyle::SBPO_ControlStatements || spaceRequiredBeforeParens(Right); + + // space between method modifier and opening parenthesis of a tuple return + // type + if (Left.isOneOf(tok::kw_public, tok::kw_private, tok::kw_protected, + tok::kw_virtual, tok::kw_extern, tok::kw_static, + Keywords.kw_internal, Keywords.kw_abstract, + Keywords.kw_sealed, Keywords.kw_override, + Keywords.kw_async, Keywords.kw_unsafe) && + Right.is(tok::l_paren)) + return true; } else if (Style.Language == FormatStyle::LK_JavaScript) { if (Left.is(TT_JsFatArrow)) return true; diff --git a/clang/unittests/Format/FormatTestCSharp.cpp b/clang/unittests/Format/FormatTestCSharp.cpp index a2c551e5c25e..ae4cdda1c845 100644 --- a/clang/unittests/Format/FormatTestCSharp.cpp +++ b/clang/unittests/Format/FormatTestCSharp.cpp @@ -777,6 +777,20 @@ foreach ((A a, B b) in someList) { verifyFormat(R"(private float[ , ] Values;)", Style); verifyFormat(R"(string dirPath = args?[ 0 ];)", Style); verifyFormat(R"(char[ ,, ] rawCharArray = MakeCharacterGrid();)", Style); + + // Method returning tuple + verifyFormat(R"(public (string name, int age) methodTuple() {})", Style); + verifyFormat(R"(private (string name, int age) methodTuple() {})", Style); + verifyFormat(R"(protected (string name, int age) methodTuple() {})", Style); + verifyFormat(R"(virtual (string name, int age) methodTuple() {})", Style); + verifyFormat(R"(extern (string name, int age) methodTuple() {})", Style); + verifyFormat(R"(static (string name, int age) methodTuple() {})", Style); + verifyFormat(R"(internal (string name, int age) methodTuple() {})", Style); + verifyFormat(R"(abstract (string name, int age) methodTuple() {})", Style); + verifyFormat(R"(sealed (string name, int age) methodTuple() {})", Style); + verifyFormat(R"(override (string name, int age) methodTuple() {})", Style); + verifyFormat(R"(async (string name, int age) methodTuple() {})", Style); + verifyFormat(R"(unsafe (string name, int age) methodTuple() {})", Style); } TEST_F(FormatTestCSharp, CSharpNullableTypes) {