Skip to content

Releases: belav/csharpier

1.3.0

07 Jun 17:55
c3fe3f2

Choose a tag to compare

1.3.0

Breaking Changes

Change xml formatting to return error when it runs into syntax error so it is consistent with c# #1854

Previously CSharpier treated an invalid xml file as a warning instead of an error. This was inconsistent with how it treated c# files.
Invalid c# or xml files are not treated as errors.
The --compilation-errors-as-warnings argument has been renamed to --syntax-errors-as-warnings and can be used to return warnings instead of errors when encountering invalid files.

What's Changed

Feature: Configurable whitespace handling for xml #1790

CSharpier now supports two types of xml whitespace formatting strict or ignore.
By default all xml except xaml or axaml is treated as strict whitespace. See details

Feature: Move closing bracket for xml elements to the same line. #1598

With strict xml whitespace handling, csharpier now keeps the closing bracket for an element on the same line instead of breaking it to a new line.

<!-- input & expected output -->
<ElementWithAttribute Attribute="AttributeValue__________________"
  >TextValue</ElementWithAttribute>

<!-- 1.2.6 -->
<ElementWithAttribute Attribute="AttributeValue__________________"
  >TextValue</ElementWithAttribute
>

Feature: Support for csharpier-ignore with XML formatter #1788

CSharpier now supports csharpier-ignore in xml files. See details

Feature: Add MSBuild transitive and multi-target support #1833

CSharpier.MSBuild can now work as a transitive dependency.

Feature: allow checking formatting with cache #1830

The csharpier check command now supports a --use-cache option.

Feature: remove dependency on Microsoft.AspNetCore.App #1508

Previously CSharpier required that Microsoft.AspNetCore.App be installed. CSharpier has been modified to use an HttpListener when it is run using server to remove the need for this dependency.

Fix: csharpier-ignore comment removes linespaces before block #1867

CSharpier was removing blank lines before csharpier-ignore comments in some cases

// input and expected output
var x = 1;
    
// csharpier-ignore
var y=1;

/// 1.2.6
var x = 1;
// csharpier-ignore
var y=1;

Fix: Inconsistent indentation for raw string literals. #1857

CSharpier was not consistently indenting raw string literals when they were inside of simple lambdas.

// input & expected output
CallMethod(() =>
{
    var someString = """
        SomeRawString
        """;
});

// 1.2.6
CallMethod(() =>
{
    var someString = """
    SomeRawString
    """;
});

Fix: case of modifier reorder with leading trivia #1855

CSharpier was incorrectly reporting a syntax validation failure when it was reordering modifiers. This is now resolved.

// when this code is modified and the modifiers are reorderd it should not report a syntax validation failure.
public class ClassName
{
    // SomeComment
    override public int GetHashCode() => 0;
}

Fix: Xml breaks final element when it contains mixed content #1841

CSharpier was breaking the end element in some cases when it should not be.

<!-- input & expected output -->
<HtmlTypeElement
  >Some long text to make things break <a href="http://url.com"
    >url.com</a> more text.</HtmlTypeElement>

<!-- 1.2.6 -->
<HtmlTypeElement
  >Some long text to make things break <a href="http://url.com"
    >url.com</a
  > more text.</HtmlTypeElement
>

Fix: Unable to ignore csharpier formatting within case statement group #1824

CSharpier now supports csharpier-ignore comments within case statements.

switch (1)
{
    case 2:
        // csharpier-ignore
        var unformatted      = true;
        break;
}

Fix: Incorrect formatting for simple lambda expression with comment #1147

CSharpier was indenting code for a simple lambda with a leading comment.

// input & expected output
this.Where___________________(
    // Comment
    x =>
    {
        return x;
    }
);

// 1.2.6
this.Where___________________(
    // Comment
    x =>
{
    return x;
});

Fix: Ignores files it shouldn't ignore when negative patterns are used #1803

Fixed a couple more edgecases with CSharpier not handling negative ignore patterns the same way that git does

Fix: Tolerate missing directories when formatting from stdin #1848

CSharpier was throwing a DirectoryNotFoundException if it were passed a path via --stdin-path with a directory that did not exist.

Fix: Stop .gitignore walk at git worktree boundary #1860

When CSharpier walks up the target directory looking for .gitignore files it stops when encountering a .git directory. However in a git worktree there is no directory, .git is a file. This change ensures CSharpier stops when encountering a .git file so that CSharpier behaves the same in a worktree.

perf: cache IgnoreWithBasePath #1758

perf: fast comparison using FullSpan and source code #1737

perf: optimise SyntaxNodeComparer #1730

perf: set capacity of List in MembersForcedLine #1709

perf: use Stack.Peek to reduce Pop and Push churn #1708

perf: add Doc.Null check to Argument avoids Concat creation #1706

perf: use overload for Any( SyntaxTriviaList to prevent allocations #1703

Full Changelog: 1.2.6...1.3.0

1.2.6

06 Feb 20:20
189cdc0

Choose a tag to compare

What's Changed

[Bug]: XML with DOCTYPE results in "invalid xml" warning #1809

CSharpier was not formatting xml that included a doctype and instead reporting that it was invalid xml.

<?xml version="1.0"?>
<!DOCTYPE staff SYSTEM "staff.dtd"[
    <!ENTITY ent1 "es">
]>
<staff></staff>

[Bug]: Initializing a span using stackalloc leads to different formatting compared to new #1808

When initializing a spacn using stackalloc, it was not being formatting consistently with other code

// input & expected output
Span<int> metatable = new int[]
{
    00000000000000000000000001,
    00000000000000000000000002,
    00000000000000000000000003,
};

Span<int> metatable = stackalloc int[]
{
    00000000000000000000000001,
    00000000000000000000000002,
    00000000000000000000000003,
};

// 1.2.5
Span<int> metatable = new int[]
{
    00000000000000000000000001,
    00000000000000000000000002,
    00000000000000000000000003,
};

Span<int> metatable =
    stackalloc int[] {
        00000000000000000000000001,
        00000000000000000000000002,
        00000000000000000000000003,
    };

[Bug]: Comments in otherwise empty object pattern disappear when formatting #1804

CSharpier was removing comments if they were the only content of an object pattern.

// input & expected output
var match = obj is {
    //Property: 123
};

// 1.2.5
var match = obj is { };

Full Changelog: 1.2.5...1.2.6

1.2.5

31 Dec 22:15
12ac464

Choose a tag to compare

What's Changed

Performance issue when running CLI in project with pnpm on Windows #1781

1.2.4 did not properly address this

The code to determine if there is a version of CSharpier.MsBuild referenced that does not match the version of CSharpier being run has been optimized to not look in node_modules or .git. This significantly speeds things up in some setups.

Full Changelog: 1.2.4...1.2.5

1.2.4

23 Dec 23:24
c3b87f8

Choose a tag to compare

1.2.4

What's Changed

Weird enter in closing when formatting XAML TextBlock #1785

CSharpier was breaking an end element to a new line when it did not need to.

<!-- input & expected output -->
<root>
  <TextBlock Foreground="DarkGray">
    I saw the sign. When I opened up my eyes, I saw the sign.
  </TextBlock>
  <TextBlock>
    I saw the sign. When I opened up my eyes, I saw the sign.
  </TextBlock>
</root>

<!-- 1.2.3 -->
<root>
  <TextBlock Foreground="DarkGray">
    I saw the sign. When I opened up my eyes, I saw the sign.
  </TextBlock
  >
  <TextBlock>
    I saw the sign. When I opened up my eyes, I saw the sign.
  </TextBlock>
</root>

Order Modifiers (IDE0036) not formatting when code is preceded by a comment. #1784

When incorrectly ordered modifiers were preceded by a comment they were not being reordered. Thanks go to @TimothyMakkison for the contribution

// input & 1.2.3

// Comment
required public int Prop1 { get; set; }

// expected output
// Comment
public required int Prop1 { get; set; }

Performance issue when running CLI in project with pnpm on Windows #1781

The code to determine if there is a version of CSharpier.MsBuild referenced that does not match the version of CSharpier being run has been optimized to not look in node_modules or .git. This significantly speeds things up in some setups.

Full Changelog: 1.2.3...1.2.4

1.2.3

14 Dec 18:02
d9beb9f

Choose a tag to compare

What's Changed

Large directories ignored in .gitignore significantly impact performance. #1776

CSharpier was enumerating all files within all subdirectories and then determining if they should be formatted or not. That logic was optimized to only enumerate files in directories that are not ignored.

Full Changelog: 1.2.2...1.2.3

1.2.2

13 Dec 17:13
4316fe8

Choose a tag to compare

What's Changed

The null coalescing operator is grouped in an unexpected place #1769

Null coalescing is now consistently broken thanks to a contribution from @ogaken-1

// input & expected output
var x =
    someValue.SomeCall().SomeProperty.SomeProperty
    ?? someValue.SomeCall().SomeProperty.SomeProperty;

var x =
    someValue.SomeCall().SomeProperty?.SomeCall().SomeProperty
    ?? someValue.SomeCall().SomeProperty?.SomeCall().SomeProperty;

var x =
    someValue.SomeCall().A_______.B_______.C_______
    ?? someValue.SomeCall().A_______.B_______.C_______;

// 1.2.1
var x =
    someValue.SomeCall().SomeProperty.SomeProperty ?? someValue
        .SomeCall()
        .SomeProperty.SomeProperty;

var x =
    someValue.SomeCall().SomeProperty?.SomeCall().SomeProperty ?? someValue
        .SomeCall()
        .SomeProperty?.SomeCall()
        .SomeProperty;

var x =
    someValue.SomeCall().A_______.B_______.C_______ ?? someValue
        .SomeCall()
        .A_______.B_______.C_______;

Xml formatter should not add a second line #1760

When formatting an xml file with a declaration and extra blank line was being added.

<!-- input & expected output -->
<?xml version="1.0" encoding="utf-8"?>

<Element />

<!-- 1.2.1 -->
<?xml version="1.0" encoding="utf-8"?>


<Element />

Git ignore patterns do not work the same as git #1759

The handling of ignore patterns did not properly match how git handles them. The logic has been reworked and now has tests that compare it directly to git.

Fix server crash when launched without console #1774

If a plugin launched csharpier server without a console it would crash. This has been resolved thanks to @rcdailey

Full Changelog: 1.2.1...1.2.2

1.2.1

10 Nov 23:58
1ad752d

Choose a tag to compare

What's Changed

Multiline comments are now formatted in a single line in XML format #1747

The 1.2.0 release was combining xml comments into a single line.

<!-- input & expected output -->
<Root>
  <!-- This is the first line comment-->
  <!-- This is the second line of my comment-->
</Root>

<!-- 1.2.0 -->
<Root>
  <!-- This is the first line comment--><!-- This is the second line of my comment-->
</Root>

Full Changelog: 1.2.0...1.2.1

1.2.0

10 Nov 01:25
adf7026

Choose a tag to compare

What's Changed

Custom XML Parser #1679

CSharpier now has a custom xml parser. XmlDocument and XDocument do not provide the original white space or the original attribute values from the file that was parsed which blocked the ability to implement supporting keeping empty new lines and not automatically encoding attributes.

Support for keeping empty lines in xml files #1599

CSharpier now supports keeping a single empty line between elements in xml files. It will remove any initial or trailing empty lines.

<!-- input -->
<Root>

  <Element />


  <Element />

</Root>

<!-- expected output -->
<Root>
  <Element />

  <Element />
</Root>

<!-- 1.1.2 -->
<Root>
  <Element />
  <Element />
</Root>

Xml - don't automatically encode attribute values #1610

CSharpier will no longer encode attribute values. It will leave them encoded if they are supplied that way.

<!-- input & expected output -->
<Target Name="Transform" BeforeTargets="Build">
  <Message Importance="high" Text="@(MyItems->'MyItems has %(Identity)', ', ')" />
</Target>

<!-- 1.1.2 -->
<Target Name="Transform" BeforeTargets="Build">
  <Message Importance="high" Text="@(MyItems-&gt;'MyItems has %(Identity)', ', ')" />
</Target>

Add option to all integrations to report incorrect formatting as a warning instead of error #1687

Formatting "using" import split on multiple lines requires formatting it twice to get the expected result #1698

When a using contained a newline before the namespace it was not being sorted properly.

// input
using System.Net;
using
    SomeProject.Bar;
using Microsoft.Extensions.Logging;

// expected output
using System.Net;
using Microsoft.Extensions.Logging;
using SomeProject.Bar;

// 1.1.2
using System.Net;
using SomeProject.Bar;
using Microsoft.Extensions.Logging;

An empty line is inserted in lambda #1694

CSharpier was inserting an extra blank line in some situations with a lambda and a collection expression

// input & expected output
CallMethod(
    (parameter1, parameter2) =>
        [
            LongValue________________________________________________,
            LongValue________________________________________________,
        ]
);

// 1.1.2
CallMethod(
    (parameter1, parameter2) =>

        [
            LongValue________________________________________________,
            LongValue________________________________________________,
        ]
);

Indent .ThenInclude() for clearer navigation hierarchy in EF Core queries #1602

CSharpier now treats .ThenInclude as a special case to improve formatting of EF queries

// input & expected output
websiteQueryable = websiteQueryable
    .Include(o => o.Categories)
    .Include(o => o.Categories)
        .ThenInclude(c => c.Products)
    .Include(o => o.Categories)
        .ThenInclude(c => c.RuleManager)
            .ThenInclude(rm => rm.RuleClauses)
    .Include(o => o.Categories)
        .ThenInclude(c => c.RuleManager)
            .ThenInclude(rm => rm.RuleClauses)
                .ThenInclude(rc => rc.RuleTypeOption);

// 1.1.2
websiteQueryable = websiteQueryable
    .Include(o => o.Categories)
    .Include(o => o.Categories)
    .ThenInclude(c => c.Products)
    .Include(o => o.Categories)
    .ThenInclude(c => c.RuleManager)
    .ThenInclude(rm => rm.RuleClauses)
    .Include(o => o.Categories)
    .ThenInclude(c => c.RuleManager)
    .ThenInclude(rm => rm.RuleClauses)
    .ThenInclude(rc => rc.RuleTypeOption);

Inconsistent indentation between is and other operators #1601

Pattern operators were being indented inconsistently with other operators. The formatting is now more consistent

// input & expected output
var b2 = (
    System.Environment.SpecialFolder.AdminTools
    is System.Environment.SpecialFolder.AdminTools
        or System.Environment.SpecialFolder.AdminTools
        or System.Environment.SpecialFolder.AdminTools
);

var b2 =
    System.Environment.SpecialFolder.AdminTools
    is System.Environment.SpecialFolder.AdminTools
        or System.Environment.SpecialFolder.AdminTools
        or System.Environment.SpecialFolder.AdminTools;

var b2 =
    someLongValue____________________________________________
    == someOtherLongValue______________________________
        + someOtherLongValue______________________________;

var b2 = (
    someLongValue____________________________________________
    == someOtherLongValue______________________________
        + someOtherLongValue______________________________
);

// 1.1.2
var b2 = (
    System.Environment.SpecialFolder.AdminTools
        is System.Environment.SpecialFolder.AdminTools
            or System.Environment.SpecialFolder.AdminTools
            or System.Environment.SpecialFolder.AdminTools
);

var b2 =
    System.Environment.SpecialFolder.AdminTools
        is System.Environment.SpecialFolder.AdminTools
            or System.Environment.SpecialFolder.AdminTools
            or System.Environment.SpecialFolder.AdminTools;

var b2 =
    someLongValue____________________________________________
    == someOtherLongValue______________________________
        + someOtherLongValue______________________________;

var b2 = (
    someLongValue____________________________________________
    == someOtherLongValue______________________________
        + someOtherLongValue______________________________
);

Error when formatting with an indent size <= 0 #1741

Previously csharpier would attempt to format code when indent size was set to 0. This was not intentional and had a number of bugs. CSharpier now error out when encountering an indent size of 0

Fix condition causing FirstTargetFramework build property erasure #1696

In some situations CSharpier.Msbuild was running into a build failure.

Full Changelog: 1.1.2...1.2.0

1.1.2

16 Aug 20:05
068b1df

Choose a tag to compare

What's Changed

Inconsistencies with null-coalescing wrapping on method chains #1573

On longer method chains, depending on the exact chain a null coalescing expression wouldn't always be preceded by a new line.

// input & expected output
var x =
    someValue
        .Property.CallLongMethod_____________________________________()
        .CallMethod__________()
    ?? throw new Exception();

var x =
    someValue
        .Property.CallLongMethod_____________________________________()
        .CallLongMethod___________________________________________________()
    ?? throw new Exception();

// 1.1.1
var x =
    someValue
        .Property.CallLongMethod_____________________________________()
        .CallMethod__________() ?? throw new Exception();

var x =
    someValue
        .Property.CallLongMethod_____________________________________()
        .CallLongMethod___________________________________________________()
    ?? throw new Exception();

Full Changelog: 1.1.1...1.1.2

1.1.1

04 Aug 02:24

Choose a tag to compare

What's Changed

Unhandled exception: System.ArgumentOutOfRangeException: startIndex cannot be larger than length of string. (Parameter 'startIndex') #1673

CSharpier was throwing an exception when formating a directory contained a file without an extension.