Support wrapping comment lines #1286
Annotations
8 errors and 2 warnings
Run dotnet test CSharpier.sln --configuration Release --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" -- RunConfiguration.CollectSourceInformation=true:
Src/CSharpier.Tests/obj/Release/net8.0/generated/CSharpier.Tests.Generators/CSharpier.Tests.Generators.FormattingTestsGenerator/FormattingTests.cs#L132
Expected normalizedCode to be "// --------------------------------------------------------------------------------------------------------------------
// <copyright file="ClassComments.cst" company="CSharpier">
// NewLineAfterThis
// </copyright>
// --------------------------------------------------------------------------------------------------------------------
// public class
public class ClassName { }
// other class
class ClassName2 { }
// leading
public // trailing
static // trailing
class // trailing
ClassName2 { }
// this
public
// is
static
// valid
// wtf
class
// yeah
ClassName3 // more trailing
{
// yeah
private
// no
readonly string Tester = "lajsdf";
}
/// single line doc comment
class ClassName { }
class ClassName
{
// indents
}
namespace NameSpace
{
class ClassName
{
// indents
}
}
public class ClassName
{
// method
public void MethodName() { }
// leading modifer
public // trailing modifier
static // more trailing
// leading return type
void // more trailing
MethodName2() { }
public static void MethodName3() { }
void //other trailing
MethodName4() { }
void TrailingCommentTest() // shouldn't space before the next brace
{
return;
}
void TrailingCommentWithParameters(
string oasdflkjasdfljkaksjdfasjdkfjslakdf,
string ljasdfjklaskldfkalsfjkasdf
) // shouldn't space before the next brace
{
return;
}
void MethodName()
{
// indents
}
IReadOnlyList<IArgument> ICommand.Arguments => Arguments;
/// <DocumentationCommentDoesNotCauseBreaking />
IReadOnlyList<IArgument> ICommand.Arguments => Arguments;
// regular comment does not cause breaking
IReadOnlyList<IArgument> ICommand.Arguments => Arguments;
}
class ClassName
{
void MethodName()
{
var x = 1;
// keep line before this
}
// keep line before this
}
" with a length of 1943, but "//
// --------------------------------------------------------------------------------------------------------------------
// <copyright file="ClassComments.cst" company="CSharpier">
// NewLineAfterThis
// </copyright>
//
// --------------------------------------------------------------------------------------------------------------------
// public class
public class ClassName { }
// other class
class ClassName2 { }
// leading
public // trailing
static // trailing
class // trailing
ClassName2 { }
// this
public
// is
static
// valid
// wtf
class
// yeah
ClassName3 // more trailing
{
// yeah
private
// no
readonly string Tester = "lajsdf";
}
/// single line doc comment
class ClassName { }
class ClassName
{
// indents
}
namespace NameSpace
{
class ClassName
{
// indents
}
}
public class ClassName
{
// method
public void MethodName() { }
// leading modifer
public // trailing modifier
static // more trailing
// leading return type
void // more trailing
MethodName2() { }
public static void MethodName3() { }
void //other trailing
MethodName4() { }
void TrailingCommentTest() // shouldn't space before the next brace
{
return;
}
void TrailingCommentWithParameters(
string oasdflkjasdfljkaksjdfasjdkfjslakdf,
string ljasdfjklaskldfkalsfjkasdf
) // shouldn't space before the next brace
{
return;
}
void MethodName()
{
// indents
}
IReadOnlyList<IArgument> ICommand.Arguments => Arguments;
/// <DocumentationCommentDoesNotCauseBreaking />
IReadOnlyList<IArgument> ICommand.Arguments => Arguments;
// regular comment does not cause breaking
IReadOnlyList<IArgument> ICommand.Arguments => Arguments;
}
class ClassName
{
void MethodName()
{
var x = 1;
// keep line before this
}
// keep line before this
}
" has a length of 1949, differs near "
//" (index 2).
|
Run dotnet test CSharpier.sln --configuration Release --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" -- RunConfiguration.CollectSourceInformation=true:
Src/CSharpier.Tests/obj/Release/net8.0/generated/CSharpier.Tests.Generators/CSharpier.Tests.Generators.FormattingTestsGenerator/FormattingTests.cs#L137
Expected normalizedCode to be "public class ClassName
{
/// singleLine documentation
/// second line
private string field;
public void Method()
{
/* this should keep the * aligned
* multiline
*/
var variable = true;
}
/// <summary> no tabs here
/// Tabs here
/// </summary>
public class ClassName { }
/* this works fine
* because indentation does not change
*/
public class ClassName2 { }
/* this doesn't fail
by trying to move it left 4 spaces */
public class ClassName2 { }
/*
public string String;
*/
}
public interface Interface
{
/// <summary>
/// </summary> tab here before <
void Method();
/* this should ditch the tabs
that were in from of here
*/
void Method();
}
/*
public class CommentedCodeShouldKeepFormatting
{
void MethodName() { }
}
*/
" with a length of 873, but "public class ClassName
{
/// singleLine documentation
/// second line
private string field;
public void Method()
{
/* this should keep the * aligned
* multiline
*/
var variable = true;
}
/// <summary> no tabs here
/// Tabs here
/// </summary>
public class ClassName { }
/* this works fine
* because indentation does not change
*/
public class ClassName2 { }
/* this doesn't fail
by trying to move it left 4 spaces */
public class ClassName2 { }
/*
public string String;
*/
}
public interface Interface
{
/// <summary>
/// </summary> tab here before <
void Method();
/* this should ditch the tabs
that were in from of here
*/
void Method();
}
/*
public class CommentedCodeShouldKeepFormatting
{
void MethodName() { }
}
*/
" has a length of 813, differs near "/* " (index 140).
|
Run dotnet test CSharpier.sln --configuration Release --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" -- RunConfiguration.CollectSourceInformation=true:
Src/CSharpier.Tests/obj/Release/net8.0/generated/CSharpier.Tests.Generators/CSharpier.Tests.Generators.FormattingTestsGenerator/FormattingTests.cs#L142
Expected normalizedCode to be "public class Foo
{
/**
* comment
*/
public class Bar
{
/**
* comment
*/
var x = 0;
}
public void SomeFunction()
{
/*
The following line is an example with an indent:
This line is indented by one tab.
*/
/*
The following line is an example with an indent:
This line is indented by 4 spaces but will be converted to 1 tab
*/
/*
The following line is an example with an indent:
This line is indented by 3 spaces but will be left as 3 spaces
*/
}
}
" with a length of 496, but "public class Foo
{
/**
* comment
*/
public class Bar
{
/**
* comment
*/
var x = 0;
}
public void SomeFunction()
{
/*
The following line is an example with an indent:
This line is indented by one tab.
*/
/*
The following line is an example with an indent:
This line is indented by 4 spaces but will be converted to 1 tab
*/
/*
The following line is an example with an indent:
This line is indented by 3 spaces but will be left as 3 spaces
*/
}
}
" has a length of 454, differs near "/**" (index 19).
|
Run dotnet test CSharpier.sln --configuration Release --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" -- RunConfiguration.CollectSourceInformation=true:
Src/CSharpier.Tests/obj/Release/net8.0/generated/CSharpier.Tests.Generators/CSharpier.Tests.Generators.FormattingTestsGenerator/FormattingTests.cs#L202
Expected normalizedCode to be "public class BasicClass
{
public BasicClass() { }
[Obsolete]
public BasicClass(string one) { }
public ClassName() => this.Value = 1;
public BasicClass(int two, string exactly100___________________________________________________)
{
return;
}
public BasicClass(
int two,
string justOver100___________________________________________________
)
{
return;
}
}
public class Initializers : BasicClass
{
public Initializers()
: this(true) { }
public Initializers(string value)
: base(value) { }
public Initializers(
string longParameter_______________________________________________________________________________
)
: base(
longParameter_______________________________________________________________________________
) { }
public Initializers(
string longParameter_______________________________________________________________________________
)
: base(
longParameter_______________________________________________________________________________
)
{
WithBody();
}
public Initializers(
string longParameter____________________________________________________________
)
: base(false) { }
public Initializers(
string longParameter____________________________________________________________
)
: base(false)
{
WithBody();
}
public LongMethodName___________________________________________________________________________()
: base(false) { }
public WithParameters(string parameter)
: base(
longParameter____________________________________________________________________________
) { }
// this may change, see #372
public WithParameters(string parameter)
: base(
longParameter____________________________________________________________________________
)
{
WithBody();
}
public LongMethodName___________________________________________________________________________()
: base(
longParameter____________________________________________________________________________
) { }
public Initializers(string value) /*Comment*/
: base(value) { }
public LongMethodName___________________________________________________________()
/*Comment*/: base(false) { }
public LongInitializerBreaksAtEdgeCase()
: this(someParameter, someOtherParameter___________________________________________________)
{
WithBody();
}
public LongParametersWithEmptyBody(string parameter, bool anotherParameter_________________) { }
public LongParametersWithEmptyBody(string parameter, bool anotherParameter__________________)
{ }
public LongInitializerWithEmptyBody()
: base(parameter, anotherParameter___________________) { }
public LongInitializerWithEmptyBody()
: base(parameter, anotherParameter__________________) { }
public LongInitializerWithEmptyBody()
: base(parameter______________, anotherParameter___________________________________________)
{ }
}
public class Exactly100
{
public Exactly100()
: this(someParameter, someOtherParameter___________________________________________________)
{
WithBody();
}
public Exactly100(int longParameter____________________________________________________________)
{
return;
}
// leading comments don't affect this
public Exactly100(int longParameter____________________________________________________________)
{
return;
}
}
" with a length of 3726, but "public class BasicClass
{
public BasicClass() { }
[Obsolete]
public BasicClass(string one) { }
public ClassName() => this.Value = 1;
public BasicClass(int two, string exactly100___________________________________________________)
{
return;
}
public BasicClass(
|
Run dotnet test CSharpier.sln --configuration Release --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" -- RunConfiguration.CollectSourceInformation=true:
Src/CSharpier.Tests/obj/Release/net8.0/generated/CSharpier.Tests.Generators/CSharpier.Tests.Generators.FormattingTestsGenerator/FormattingTests.cs#L302
Expected normalizedCode to be "public enum SubCode
{
First,
// force line
BasicComment,
/* force line */
MultiLineComment,
/// force line
XmlComment,
/// SingleLine
ExistingLine,
DoNotKeepLine,
[ForceLine]
ForceLine,
}
" with a length of 242, but "public enum SubCode
{
First,
// force line
BasicComment,
/* force line */
MultiLineComment,
/// force line
XmlComment,
/// SingleLine
ExistingLine,
DoNotKeepLine,
[ForceLine]
ForceLine,
}
" has a length of 238, differs near "/* " (index 71).
|
Run dotnet test CSharpier.sln --configuration Release --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" -- RunConfiguration.CollectSourceInformation=true:
Src/CSharpier.Tests/obj/Release/net8.0/generated/CSharpier.Tests.Generators/CSharpier.Tests.Generators.FormattingTestsGenerator/FormattingTests.cs#L552
Expected normalizedCode to be "// these are here so we can see how they change over time, see https://github.com/belav/csharpier/issues/272
// try to clean these up if you are modifying formatting that affects them.
class ClassName
{
public readonly StackObjectPool<
Dictionary<object, KeyedItemInfo>
> KeyedItemInfoDictionaryPool_____;
internal StackObjectPool<
Dictionary<object, KeyedItemInfo>
> KeyedItemInfoDictionaryPool { get; } =
new StackObjectPool<Dictionary<object, KeyedItemInfo>>(
maxPreservedItems: 10,
() => new Dictionary<object, KeyedItemInfo>()
);
RenderFragment<AuthenticationState> customNotAuthorized = state =>
builder => builder.AddContent(0, $"Go away, {state.User.Identity.Name}");
public List<(
ClaimsPrincipal user,
object resource,
IEnumerable<IAuthorizationRequirement> requirements
)> AuthorizeCalls { get; } =
new List<(
ClaimsPrincipal user,
object resource,
IEnumerable<IAuthorizationRequirement> requirements
)>();
private static readonly Action<ILogger, string, string, Exception> _displayingNotFound =
LoggerMessage.Define<string, string>(
LogLevel.Debug,
new EventId(1, "DisplayingNotFound"),
$"Displaying {nameof(NotFound)} because path '{{Path}}' with base URI '{{BaseUri}}' does not match any component route"
);
private static readonly Action<
ILogger,
Type,
string,
string,
Exception
> _navigatingToComponent = LoggerMessage.Define<Type, string, string>(
LogLevel.Debug,
new EventId(2, "NavigatingToComponent"),
"Navigating to component {ComponentType} in response to path '{Path}' with base URI '{BaseUri}'"
);
public void MethodName()
{
builder_________________.OpenComponent<
SecondCascadingParameterConsumerComponent<string, int>
>(0);
}
public static IRemoteAuthenticationBuilder<
RemoteAuthenticationState,
RemoteUserAccount
> AddAccountClaimsPrincipalFactory<
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
TAccountClaimsPrincipalFactory
>(this IRemoteAuthenticationBuilder<RemoteAuthenticationState, RemoteUserAccount> builder)
where TAccountClaimsPrincipalFactory : AccountClaimsPrincipalFactory<RemoteUserAccount> =>
builder.AddAccountClaimsPrincipalFactory<
RemoteAuthenticationState,
RemoteUserAccount,
TAccountClaimsPrincipalFactory
>();
private static readonly Action<IApplicationBuilder> ActionNotImplemented =
new Action<IApplicationBuilder>(_ =>
{
throw new NotImplementedException();
});
public void MapFrom<TResult>(Func<TSource, TDestination, TMember, TResult> mappingFunction)
{
if (true)
{
PropertyMapActions.Add(pm =>
{
Expression<Func<TSource, TDestination, TMember, ResolutionContext, TResult>> expr =
(src, dest, destMember, ctxt) => mappingFunction(src, dest, destMember);
pm.CustomMapFunction = expr;
});
}
}
public void Condition(
Func<ConditionParameters<TSource, TDestination, TMember>, bool> condition
) =>
PathMapActions.Add(pm =>
{
Expression<
Func<TSource, TDestination, TMember, TMember, ResolutionContext, bool>
> expr = (src, dest, srcMember, destMember, ctxt) =>
condition(
new ConditionParameters<TSource, TDestination, TMember>(
src,
dest,
srcMember,
destMember,
ctxt
)
);
pm.Condition = expr;
});
public override Type SourceType
{
get =>
_sour
|
Run dotnet test CSharpier.sln --configuration Release --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" -- RunConfiguration.CollectSourceInformation=true:
Src/CSharpier.Tests/obj/Release/net8.0/generated/CSharpier.Tests.Generators/CSharpier.Tests.Generators.FormattingTestsGenerator/FormattingTests.cs#L502
Expected normalizedCode to be "public class ClassRules
{
public void NeverLineBeforeFirstMember() { }
public void AlwaysLineBetweenMethods() { }
public void EvenWithLambdaBody() => "";
private enum AlwaysLineBeforeEnum
{
One,
Two,
}
private enum NoDoubleLines
{
One,
Two,
}
private class AlwaysLineBeforeClass { }
private class NoDoubleLines { }
private interface IAlwaysLineBeforeInterface { }
private interface INoDoubleLines { }
public ClassRules() { }
public ClassRules() { }
public ~ClassName() { }
public ~ClassName() { }
public static implicit operator ClassRules(string s)
{
return new Test();
}
public static implicit operator ClassRules(int i)
{
return new Test();
}
public record SomeRecord1(string property);
public record SomeRecord2(string property);
public struct SomeStruct1 { }
public struct SomeStruct2 { }
static ClassRules operator +(ClassRules a, ClassRules b)
{
return a.Add(b);
}
static ClassRules operator -(ClassRules a, ClassRules b)
{
return a.Subtract(b);
}
private string FieldsCanBeGroupedBecauseLinesWillBeKept;
private string ButLinesAreNotForcedHere;
// comments force a line
private string FieldWithComment;
/* comments force a line */
private string FieldWithComment;
/// <summary> comments force a line </summary> ///
private string FieldWithComment;
[AttributesForceALine]
private string FieldWithAttribute;
private string PropertiesCanBeGrouped { get; set; }
private string BecauseTheyDontForceLines { get; set; }
// comments force a line
private string PropertyWithComment;
[AttributesForceALine]
private string PropertyWithAttribute;
delegate void DelegatesAreLikeFields();
delegate void AndCanBeGrouped();
// comments force a line
delegate void DelegateWithComment();
[AttributesForceALine]
delegate void DelegateWithAttribute();
public void AlwaysLineBetweenMethods() { }
private string FieldAfterMethodGetsLine;
#if EDGE_CASE_SHOULD_KEEP_LINE_ABOVE_METHOD
private string Field;
#else
private string Field;
#endif
public void SomeMethod() { }
#pragma warning disable 0618
public void KeepLineAboveAndBelow() { }
#pragma warning restore 0618
public void SomeMethod() { }
}
public class LineBeforeClass { }
public interface InterfaceRulesAreLikeClassesButMethodsFollowTheFieldRulesAbove
{
void NeverLineHere();
void ExistingLineHereIsKept();
void ButNoLineIsAdded();
// comments do force a line
void MethodWithComment();
}
abstract class AbstractClass
{
abstract void NoLineHere() { }
abstract void KeepTheLineHere();
abstract void DoNotForceTheLineHere();
void ButForceLineForRealMethod() { }
}
public class ClassName
{
private string someField1;
#if KEEP_LINE_ABOVE
private string someField2;
#endif
private string someField2;
}
public class ClassName
{
#region RegionWithSpaceBeforeAndAfterMethod
void SomeMethod() { }
#endregion
void SomeMethod() { }
}
" with a length of 3193, but "public class ClassRules
{
public void NeverLineBeforeFirstMember() { }
public void AlwaysLineBetweenMethods() { }
public void EvenWithLambdaBody() => "";
private enum AlwaysLineBeforeEnum
{
One,
Two,
}
private enum NoDoubleLines
{
One,
Two,
}
private class AlwaysLineBeforeClass { }
private class NoDoubleLines { }
private interface IAlwaysLineBeforeInterface { }
private interface INoDoubleLines { }
public ClassRules() { }
public ClassRules() { }
public ~ClassName() { }
public ~ClassName() { }
public static implicit operator ClassRules(string s)
{
return new Test();
}
public static implicit operator ClassRules(int i)
{
return new Test();
}
public record SomeRecord1(string prop
|
|
The following actions uses node12 which is deprecated and will be forced to run on node16: actions/checkout@v2. For more info: https://github.blog/changelog/2023-06-13-github-actions-all-actions-will-run-on-node16-instead-of-node12-by-default/
|
The following actions use a deprecated Node.js version and will be forced to run on node20: actions/checkout@v2, actions/setup-dotnet@v3. For more info: https://github.blog/changelog/2024-03-07-github-actions-all-actions-will-run-on-node20-instead-of-node16-by-default/
|
Loading