[PATCH] D58404: [clang-format] Add basic support for formatting C# files

MyDeveloperDay via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Feb 19 13:33:36 PST 2019


MyDeveloperDay created this revision.
MyDeveloperDay added reviewers: djasper, klimek, krasimir, benhamilton, JonasToth.
MyDeveloperDay added a project: clang.
Herald added subscribers: jdoerfert, mgorny.

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.

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 {}
  }




Repository:
  rCTE Clang Tools Extra

https://reviews.llvm.org/D58404

Files:
  docs/ClangFormat.rst
  docs/ClangFormatStyleOptions.rst
  include/clang/Format/Format.h
  lib/Format/ContinuationIndenter.cpp
  lib/Format/Format.cpp
  lib/Format/FormatToken.h
  lib/Format/TokenAnnotator.cpp
  lib/Format/UnwrappedLineFormatter.cpp
  lib/Format/UnwrappedLineParser.cpp
  tools/clang-format/ClangFormat.cpp
  unittests/Format/CMakeLists.txt
  unittests/Format/FormatTestCSharp.cpp

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D58404.187433.patch
Type: text/x-patch
Size: 17237 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190219/70fea512/attachment-0001.bin>


More information about the cfe-commits mailing list