diff options
author | Paul Hoad <mydeveloperday@gmail.com> | 2019-10-04 07:56:49 +0000 |
---|---|---|
committer | Paul Hoad <mydeveloperday@gmail.com> | 2019-10-04 07:56:49 +0000 |
commit | a2f963bb61e3e83287ea9eecd39198051b0c1cef (patch) | |
tree | 6cd41cf136607d9d12d7eb6f1fa1147970da2bc0 /clang/unittests/Format/FormatTestCSharp.cpp | |
parent | 03b216d85472c45d3359e9e1593f5ea49f2633f7 (diff) | |
download | bcm5719-llvm-a2f963bb61e3e83287ea9eecd39198051b0c1cef.tar.gz bcm5719-llvm-a2f963bb61e3e83287ea9eecd39198051b0c1cef.zip |
[clang-format] [PR43333] Fix C# breaking before function name when using Attributes
Summary:
This is a fix for https://bugs.llvm.org/show_bug.cgi?id=43333
This comes with 3 main parts
- C# attributes cause function names on a new line even when AlwaysBreakAfterReturnType is set to None
- Add AlwaysBreakAfterReturnType to None by default in the Microsoft style,
- C# unit tests are not using Microsoft style (which we created to define the default C# style to match a vanilla C# project).
Reviewers: owenpan, klimek, russellmcc, mitchell-stellar
Reviewed By: mitchell-stellar
Subscribers: cfe-commits
Tags: #clang-tools-extra, #clang, #clang-format
Differential Revision: https://reviews.llvm.org/D67629
llvm-svn: 373707
Diffstat (limited to 'clang/unittests/Format/FormatTestCSharp.cpp')
-rw-r--r-- | clang/unittests/Format/FormatTestCSharp.cpp | 171 |
1 files changed, 138 insertions, 33 deletions
diff --git a/clang/unittests/Format/FormatTestCSharp.cpp b/clang/unittests/Format/FormatTestCSharp.cpp index 7fda9566dc8..031de143389 100644 --- a/clang/unittests/Format/FormatTestCSharp.cpp +++ b/clang/unittests/Format/FormatTestCSharp.cpp @@ -32,48 +32,76 @@ protected: static std::string format(llvm::StringRef Code, - const FormatStyle &Style = getGoogleStyle(FormatStyle::LK_CSharp)) { + const FormatStyle &Style = getMicrosoftStyle(FormatStyle::LK_CSharp)) { return format(Code, 0, Code.size(), Style); } static FormatStyle getStyleWithColumns(unsigned ColumnLimit) { - FormatStyle Style = getGoogleStyle(FormatStyle::LK_CSharp); + FormatStyle Style = getMicrosoftStyle(FormatStyle::LK_CSharp); Style.ColumnLimit = ColumnLimit; return Style; } static void verifyFormat( llvm::StringRef Code, - const FormatStyle &Style = getGoogleStyle(FormatStyle::LK_CSharp)) { + const FormatStyle &Style = getMicrosoftStyle(FormatStyle::LK_CSharp)) { EXPECT_EQ(Code.str(), format(Code, Style)) << "Expected code is not stable"; EXPECT_EQ(Code.str(), format(test::messUp(Code), Style)); } }; TEST_F(FormatTestCSharp, CSharpClass) { - verifyFormat("public class SomeClass {\n" - " void f() {}\n" - " int g() { return 0; }\n" - " void h() {\n" - " while (true) f();\n" - " for (;;) f();\n" - " if (true) f();\n" - " }\n" + verifyFormat("public class SomeClass\n" + "{\n" + " void f()\n" + " {\n" + " }\n" + " int g()\n" + " {\n" + " return 0;\n" + " }\n" + " void h()\n" + " {\n" + " while (true)\n" + " f();\n" + " for (;;)\n" + " f();\n" + " if (true)\n" + " f();\n" + " }\n" "}"); } TEST_F(FormatTestCSharp, AccessModifiers) { - verifyFormat("public String toString() {}"); - verifyFormat("private String toString() {}"); - verifyFormat("protected String toString() {}"); - verifyFormat("internal String toString() {}"); + verifyFormat("public String toString()\n" + "{\n" + "}"); + verifyFormat("private String toString()\n" + "{\n" + "}"); + verifyFormat("protected String toString()\n" + "{\n" + "}"); + verifyFormat("internal String toString()\n" + "{\n" + "}"); - verifyFormat("public override String toString() {}"); - verifyFormat("private override String toString() {}"); - verifyFormat("protected override String toString() {}"); - verifyFormat("internal override String toString() {}"); + verifyFormat("public override String toString()\n" + "{\n" + "}"); + verifyFormat("private override String toString()\n" + "{\n" + "}"); + verifyFormat("protected override String toString()\n" + "{\n" + "}"); + verifyFormat("internal override String toString()\n" + "{\n" + "}"); - verifyFormat("internal static String toString() {}"); + verifyFormat("internal static String toString()\n" + "{\n" + "}"); } TEST_F(FormatTestCSharp, NoStringLiteralBreaks) { @@ -124,45 +152,70 @@ TEST_F(FormatTestCSharp, CSharpNullConditional) { verifyFormat("switch(args?.Length)"); - verifyFormat("public static void Main(string[] args) { string dirPath " - "= args?[0]; }"); + verifyFormat("public static void Main(string[] args)\n" + "{\n" + " string dirPath = args?[0];\n" + "}"); } TEST_F(FormatTestCSharp, Attributes) { verifyFormat("[STAThread]\n" - "static void\n" - "Main(string[] args) {}"); + "static void Main(string[] args)\n" + "{\n" + "}"); verifyFormat("[TestMethod]\n" - "private class Test {}"); + "private class Test\n" + "{\n" + "}"); verifyFormat("[TestMethod]\n" - "protected class Test {}"); + "protected class Test\n" + "{\n" + "}"); verifyFormat("[TestMethod]\n" - "internal class Test {}"); + "internal class Test\n" + "{\n" + "}"); verifyFormat("[TestMethod]\n" - "class Test {}"); + "class Test\n" + "{\n" + "}"); verifyFormat("[TestMethod]\n" "[DeploymentItem(\"Test.txt\")]\n" - "public class Test {}"); + "public class Test\n" + "{\n" + "}"); verifyFormat("[System.AttributeUsage(System.AttributeTargets.Method)]\n" "[System.Runtime.InteropServices.ComVisible(true)]\n" - "public sealed class STAThreadAttribute : Attribute {}"); + "public sealed class STAThreadAttribute : Attribute\n" + "{\n" + "}"); verifyFormat("[Verb(\"start\", HelpText = \"Starts the server listening on " "provided port\")]\n" - "class Test {}"); + "class Test\n" + "{\n" + "}"); verifyFormat("[TestMethod]\n" - "public string Host {\n set;\n get;\n}"); + "public string Host\n" + "{\n" + " set;\n" + " get;\n" + "}"); verifyFormat("[TestMethod(\"start\", HelpText = \"Starts the server " "listening on provided host\")]\n" - "public string Host {\n set;\n get;\n}"); + "public string Host\n" + "{\n" + " set;\n" + " get;\n" + "}"); } TEST_F(FormatTestCSharp, CSharpUsing) { @@ -195,5 +248,57 @@ TEST_F(FormatTestCSharp, CSharpNullCoalescing) { verifyFormat("return _name ?? \"DEF\";"); } +TEST_F(FormatTestCSharp, AttributesIndentation) { + FormatStyle Style = getMicrosoftStyle(FormatStyle::LK_CSharp); + Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None; + + verifyFormat("[STAThread]\n" + "static void Main(string[] args)\n" + "{\n" + "}", + Style); + + verifyFormat("[STAThread]\n" + "void " + "veryLooooooooooooooongFunctionName(string[] args)\n" + "{\n" + "}", + Style); + + verifyFormat("[STAThread]\n" + "veryLoooooooooooooooooooongReturnType " + "veryLooooooooooooooongFunctionName(string[] args)\n" + "{\n" + "}", + Style); + + verifyFormat("[SuppressMessage(\"A\", \"B\", Justification = \"C\")]\n" + "public override X Y()\n" + "{\n" + "}\n", + Style); + + verifyFormat("[SuppressMessage]\n" + "public X Y()\n" + "{\n" + "}\n", + Style); + + verifyFormat("[SuppressMessage]\n" + "public override X Y()\n" + "{\n" + "}\n", + Style); + + verifyFormat("public A(B b) : base(b)\n" + "{\n" + " [SuppressMessage]\n" + " public override X Y()\n" + " {\n" + " }\n" + "}\n", + Style); +} + } // namespace format } // end namespace clang |