This revision adds basic support for formatting C# files with clang-format, I know the barrier to entry is high here so I'm sending this revision in to test the water as to whether this might be something we'd consider landing.
Tracking in Bugzilla as:
https://bugs.llvm.org/show_bug.cgi?id=40850
Justification:
C# code just looks ugly in comparison to the C++ code in our source tree which is clang-formatted.
I've struggled with Visual Studio reformatting to get a clean and consistent style, I want to format our C# code on saving like I do now for C++ and i want it to have the same style as defined in our .clang-format file, so it consistent as it can be with C++. (Braces/Breaking/Spaces/Indent etc..)
Using clang format without this patch leaves the code in a bad state, sometimes when the BreakStringLiterals is set, it fails to compile.
Mostly the C# is similar to Java, except instead of JavaAnnotations I try to reuse the TT_AttributeSquare.
Almost the most valuable portion is to have a new Language in order to partition the configuration for C# within a common .clang-format file, with the auto detection on the .cs extension. But there are other C# specific styles that could be added later if this is accepted. in particular how { set;get } is formatted.
I'm including an example of its usage Before/After to demonstrate it initial capability.
C# code, formatted with current clang-format
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; namespace ConsoleApp1 { class Program { [MainAttribute] static void Main(string[] args) {} public void foo() { float f = 1.0; int a = (int)f; string[] args = new string[1]; args[a] = "Hello"; } public string Foo { set; get; } } [ClassAttribute] public class Bar { public Bar(){} [MethodAttribute] public bool foo() { return true; } [XmlElement(ElementName = "TaxRate")] public int taxRate; [MethodAttribute] internal bool foo() { string longstring = "VeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongLongLongLong"; return true; } } internal class InternalBar { public InternalBar() {} } [TestClass][DeploymentItem("testData")] public class Test { } }
Same C# code, formatted with current clang-format with this revision (no .clang-format file, out-of-box formatting)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; namespace ConsoleApp1 { class Program { [MainAttribute] static void Main(string[] args) {} public void foo() { float f = 1.0; int a = (int) f; string[] args = new string[1]; args[a] = "Hello"; } public string Foo { set; get; } } [ClassAttribute] public class Bar { public Bar(){} [MethodAttribute] public bool foo() { return true; } [XmlElement(ElementName = "TaxRate")] public int taxRate; [MethodAttribute] internal bool foo() { string longstring = "VeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongLongLongLong"; return true; } } internal class InternalBar { public InternalBar() {} } [TestClass] [DeploymentItem("testData")] public class Test {} }
Tiny nit: please try to keep comments formatted as sentence (upper-case first letter, "." in the end).