Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ public static OmniSharpSyntaxFormattingOptionsWrapper Create(
(spaceBeforeComma ? SpacePlacement.BeforeComma : 0) |
(spaceAfterDot ? SpacePlacement.AfterDot : 0) |
(spaceBeforeDot ? SpacePlacement.BeforeDot : 0),
SpacingAroundBinaryOperator = (BinaryOperatorSpacingOptions)spacingAroundBinaryOperator,
SpacingAroundBinaryOperator = (BinaryOperatorSpacingOptionsInternal)spacingAroundBinaryOperator,
NewLines =
(newLineForMembersInObjectInit ? NewLinePlacement.BeforeMembersInObjectInitializers : 0) |
(newLineForMembersInAnonymousTypes ? NewLinePlacement.BeforeMembersInAnonymousTypes : 0) |
Expand All @@ -125,7 +125,7 @@ public static OmniSharpSyntaxFormattingOptionsWrapper Create(
(newLinesForBracesInLambdaExpressionBody ? NewLinePlacement.BeforeOpenBraceInLambdaExpressionBody : 0) |
(newLinesForBracesInControlBlocks ? NewLinePlacement.BeforeOpenBraceInControlBlocks : 0) |
(newLineForClausesInQuery ? NewLinePlacement.BetweenQueryExpressionClauses : 0),
LabelPositioning = (LabelPositionOptions)labelPositioning,
LabelPositioning = (LabelPositionOptionsInternal)labelPositioning,
Indentation =
(indentBraces ? IndentationPlacement.Braces : 0) |
(indentBlock ? IndentationPlacement.BlockContents : 0) |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,9 @@ public CSharpSyntaxFormattingOptions ToCSharpSyntaxFormattingOptions()
=> new()
{
Spacing = (SpacePlacement)Spacing,
SpacingAroundBinaryOperator = (BinaryOperatorSpacingOptions)SpacingAroundBinaryOperator,
SpacingAroundBinaryOperator = (BinaryOperatorSpacingOptionsInternal)SpacingAroundBinaryOperator,
NewLines = (NewLinePlacement)NewLines,
LabelPositioning = (LabelPositionOptions)LabelPositioning,
LabelPositioning = (LabelPositionOptionsInternal)LabelPositioning,
Indentation = (IndentationPlacement)Indentation,
WrappingKeepStatementsOnSingleLine = WrappingKeepStatementsOnSingleLine,
WrappingPreserveSingleLine = WrappingPreserveSingleLine,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,13 @@ public int Indent_CaseLabels
public int Indent_FlushLabelsLeft
{
get { return (int)GetOption(CSharpFormattingOptions2.LabelPositioning); }
set { SetOption(CSharpFormattingOptions2.LabelPositioning, (LabelPositionOptions)value); }
set { SetOption(CSharpFormattingOptions2.LabelPositioning, (LabelPositionOptionsInternal)value); }
}

public int Indent_UnindentLabels
{
get { return (int)GetOption(CSharpFormattingOptions2.LabelPositioning); }
set { SetOption(CSharpFormattingOptions2.LabelPositioning, (LabelPositionOptions)value); }
set { SetOption(CSharpFormattingOptions2.LabelPositioning, (LabelPositionOptionsInternal)value); }
}

public int NewLines_AnonymousTypeInitializer_EachMember
Expand Down Expand Up @@ -186,7 +186,7 @@ public int Space_AfterSemicolonsInForStatement
public int Space_AroundBinaryOperator
{
get { return (int)GetOption(CSharpFormattingOptions2.SpacingAroundBinaryOperator); }
set { SetOption(CSharpFormattingOptions2.SpacingAroundBinaryOperator, (BinaryOperatorSpacingOptions)value); }
set { SetOption(CSharpFormattingOptions2.SpacingAroundBinaryOperator, (BinaryOperatorSpacingOptionsInternal)value); }
}

public int Space_BeforeBasesColon
Expand Down Expand Up @@ -282,7 +282,7 @@ public int Space_WithinSquares
public int Wrapping_IgnoreSpacesAroundBinaryOperators
{
get { return (int)GetOption(CSharpFormattingOptions2.SpacingAroundBinaryOperator); }
set { SetOption(CSharpFormattingOptions2.SpacingAroundBinaryOperator, (BinaryOperatorSpacingOptions)value); }
set { SetOption(CSharpFormattingOptions2.SpacingAroundBinaryOperator, (BinaryOperatorSpacingOptionsInternal)value); }
}

public int Wrapping_IgnoreSpacesAroundVariableDeclaration
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,8 @@ public IndentationViewModel(OptionStore optionStore, IServiceProvider servicePro

Items.Add(new TextBlock() { Text = CSharpVSResources.Label_Indentation });

Items.Add(new RadioButtonViewModel<LabelPositionOptions>(CSharpVSResources.Place_goto_labels_in_leftmost_column, GotoLabelPreview, "goto", LabelPositionOptions.LeftMost, CSharpFormattingOptions2.LabelPositioning, this, optionStore));
Items.Add(new RadioButtonViewModel<LabelPositionOptions>(CSharpVSResources.Indent_labels_normally, GotoLabelPreview, "goto", LabelPositionOptions.NoIndent, CSharpFormattingOptions2.LabelPositioning, this, optionStore));
Items.Add(new RadioButtonViewModel<LabelPositionOptions>(CSharpVSResources.Place_goto_labels_one_indent_less_than_current, GotoLabelPreview, "goto", LabelPositionOptions.OneLess, CSharpFormattingOptions2.LabelPositioning, this, optionStore));
Items.Add(new RadioButtonViewModel<LabelPositionOptionsInternal>(CSharpVSResources.Place_goto_labels_in_leftmost_column, GotoLabelPreview, "goto", LabelPositionOptionsInternal.LeftMost, CSharpFormattingOptions2.LabelPositioning, this, optionStore));
Items.Add(new RadioButtonViewModel<LabelPositionOptionsInternal>(CSharpVSResources.Indent_labels_normally, GotoLabelPreview, "goto", LabelPositionOptionsInternal.NoIndent, CSharpFormattingOptions2.LabelPositioning, this, optionStore));
Items.Add(new RadioButtonViewModel<LabelPositionOptionsInternal>(CSharpVSResources.Place_goto_labels_one_indent_less_than_current, GotoLabelPreview, "goto", LabelPositionOptionsInternal.OneLess, CSharpFormattingOptions2.LabelPositioning, this, optionStore));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -150,8 +150,8 @@ public SpacingViewModel(OptionStore optionStore, IServiceProvider serviceProvide

Items.Add(new HeaderItemViewModel() { Header = CSharpVSResources.Set_spacing_for_operators });

Items.Add(new RadioButtonViewModel<BinaryOperatorSpacingOptions>(CSharpVSResources.Ignore_spaces_around_binary_operators, s_expressionSpacingPreview, "binary", BinaryOperatorSpacingOptions.Ignore, CSharpFormattingOptions2.SpacingAroundBinaryOperator, this, OptionStore));
Items.Add(new RadioButtonViewModel<BinaryOperatorSpacingOptions>(CSharpVSResources.Remove_spaces_before_and_after_binary_operators, s_expressionSpacingPreview, "binary", BinaryOperatorSpacingOptions.Remove, CSharpFormattingOptions2.SpacingAroundBinaryOperator, this, OptionStore));
Items.Add(new RadioButtonViewModel<BinaryOperatorSpacingOptions>(CSharpVSResources.Insert_space_before_and_after_binary_operators, s_expressionSpacingPreview, "binary", BinaryOperatorSpacingOptions.Single, CSharpFormattingOptions2.SpacingAroundBinaryOperator, this, OptionStore));
Items.Add(new RadioButtonViewModel<BinaryOperatorSpacingOptionsInternal>(CSharpVSResources.Ignore_spaces_around_binary_operators, s_expressionSpacingPreview, "binary", BinaryOperatorSpacingOptionsInternal.Ignore, CSharpFormattingOptions2.SpacingAroundBinaryOperator, this, OptionStore));
Items.Add(new RadioButtonViewModel<BinaryOperatorSpacingOptionsInternal>(CSharpVSResources.Remove_spaces_before_and_after_binary_operators, s_expressionSpacingPreview, "binary", BinaryOperatorSpacingOptionsInternal.Remove, CSharpFormattingOptions2.SpacingAroundBinaryOperator, this, OptionStore));
Items.Add(new RadioButtonViewModel<BinaryOperatorSpacingOptionsInternal>(CSharpVSResources.Insert_space_before_and_after_binary_operators, s_expressionSpacingPreview, "binary", BinaryOperatorSpacingOptionsInternal.Single, CSharpFormattingOptions2.SpacingAroundBinaryOperator, this, OptionStore));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@

#pragma warning disable RS0030 // Do not used banned APIs

using System;
using System.Runtime.CompilerServices;
using Humanizer;
using Microsoft.CodeAnalysis.Formatting;
using Microsoft.CodeAnalysis.Options;

Expand Down Expand Up @@ -133,7 +136,7 @@ public SpacePlacementInternalStorageMapping(IOption2 internalOption, SpacePlacem
public static Option<bool> SpaceBeforeSemicolonsInForStatement { get; } = CSharpFormattingOptions2.SpaceBeforeSemicolonsInForStatement.ToPublicOption();

/// <inheritdoc cref="CSharpFormattingOptions2.SpacingAroundBinaryOperator"/>
public static Option<BinaryOperatorSpacingOptions> SpacingAroundBinaryOperator { get; } = CSharpFormattingOptions2.SpacingAroundBinaryOperator.ToPublicOption();
public static Option<BinaryOperatorSpacingOptions> SpacingAroundBinaryOperator { get; } = ConvertEnumOption<BinaryOperatorSpacingOptionsInternal, BinaryOperatorSpacingOptions>(CSharpFormattingOptions2.SpacingAroundBinaryOperator.ToPublicOption());

/// <inheritdoc cref="CSharpFormattingOptions2.IndentBraces"/>
public static Option<bool> IndentBraces { get; } = CSharpFormattingOptions2.IndentBraces.ToPublicOption();
Expand All @@ -151,7 +154,7 @@ public SpacePlacementInternalStorageMapping(IOption2 internalOption, SpacePlacem
public static Option<bool> IndentSwitchCaseSectionWhenBlock { get; } = CSharpFormattingOptions2.IndentSwitchCaseSectionWhenBlock.ToPublicOption();

/// <inheritdoc cref="CSharpFormattingOptions2.LabelPositioning"/>
public static Option<LabelPositionOptions> LabelPositioning { get; } = CSharpFormattingOptions2.LabelPositioning.ToPublicOption();
public static Option<LabelPositionOptions> LabelPositioning { get; } = ConvertEnumOption<LabelPositionOptionsInternal, LabelPositionOptions>(CSharpFormattingOptions2.LabelPositioning.ToPublicOption());

/// <inheritdoc cref="CSharpFormattingOptions2.WrappingPreserveSingleLine"/>
public static Option<bool> WrappingPreserveSingleLine { get; } = CSharpFormattingOptions2.WrappingPreserveSingleLine.ToPublicOption();
Expand Down Expand Up @@ -186,4 +189,73 @@ public SpacePlacementInternalStorageMapping(IOption2 internalOption, SpacePlacem

/// <inheritdoc cref="CSharpFormattingOptions2.NewLineForClausesInQuery"/>
public static Option<bool> NewLineForClausesInQuery { get; } = CSharpFormattingOptions2.NewLineForClausesInQuery.ToPublicOption();

private static Option<TToEnum> ConvertEnumOption<TFromEnum, TToEnum>(Option<TFromEnum> option)
where TFromEnum : struct, Enum
where TToEnum : struct, Enum
{
// Ensure that this is only called for enums that are actually compatible with each other.
Contract.ThrowIfTrue(typeof(TFromEnum).GetEnumUnderlyingType() != typeof(int));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't this just be typeof(TFromEnum).GetEnumUnderlyingType() != typeof(TToEnum).GetEnumUnderlyingType()?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this has changed. i previously took a dependency on int in teh impl code. now i have a TEnumUnderlyingType that i can use instead.

And i do confirm that everything is cromulent between all 3 type parameters.

Contract.ThrowIfTrue(typeof(TToEnum).GetEnumUnderlyingType() != typeof(int));

var definition = (OptionDefinition<TFromEnum>)((IOption2)option).Definition;
var newDefaultValue = Convert<TFromEnum, TToEnum>(Unsafe.Unbox<TFromEnum>(definition.DefaultValue));
var newSerializer = ConvertSerializer<TFromEnum, TToEnum>(definition.Serializer);

var newDefinition = new OptionDefinition<TToEnum>(
defaultValue: newDefaultValue, newSerializer, definition.Group, definition.ConfigName, definition.StorageMapping, definition.IsEditorConfigOption);

return new(newDefinition, option.Feature, option.Name, option.StorageLocations);
}

private static EditorConfigValueSerializer<TToEnum>? ConvertSerializer<TFromEnum, TToEnum>(EditorConfigValueSerializer<TFromEnum> serializer)
where TFromEnum : struct
where TToEnum : struct
{
return new(
value => Convert<TFromEnum, TToEnum>(serializer.ParseValue(value)),
value => serializer.SerializeValue(Convert<TToEnum, TFromEnum>(value)));
}

private static Optional<TToEnum> Convert<TFromEnum, TToEnum>(Optional<TFromEnum> optional)
where TFromEnum : struct
where TToEnum : struct
{
if (!optional.HasValue)
return default;

return Convert<TFromEnum, TToEnum>(optional.Value);
}

private static TToEnum Convert<TFromEnum, TToEnum>(TFromEnum value)
where TFromEnum : struct
where TToEnum : struct
{
var intValue = Unsafe.As<TFromEnum, int>(ref value);
return Unsafe.As<int, TToEnum>(ref intValue);
}
}

public enum LabelPositionOptions
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thse are not new apis. they just moved from the shared location her.e we don't want it in teh shared location as that adds public types to multiple assemblies, which is bad (esp. for code that then references both assemblies.

{
/// Placed in the Zeroth column of the text editor
LeftMost = LabelPositionOptionsInternal.LeftMost,

/// Placed at one less indent to the current context
OneLess = LabelPositionOptionsInternal.OneLess,

/// Placed at the same indent as the current context
NoIndent = LabelPositionOptionsInternal.NoIndent,
}

public enum BinaryOperatorSpacingOptions
{
/// Single Spacing
Single = BinaryOperatorSpacingOptionsInternal.Single,

/// Ignore Formatting
Ignore = BinaryOperatorSpacingOptionsInternal.Ignore,

/// Remove Spacing
Remove = BinaryOperatorSpacingOptionsInternal.Remove,
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public sealed class CSharpEditorConfigCodeStyleParserTests
[InlineData(" none ", BinaryOperatorSpacingOptions.Remove)]
[InlineData(" before_and_after ", BinaryOperatorSpacingOptions.Single)]
public void TestParseSpacingAroundBinaryOperator(string rawValue, BinaryOperatorSpacingOptions parsedValue)
=> Assert.Equal(parsedValue, CSharpFormattingOptions2.ParseEditorConfigSpacingAroundBinaryOperator(rawValue));
=> Assert.Equal(parsedValue, (BinaryOperatorSpacingOptions)CSharpFormattingOptions2.ParseEditorConfigSpacingAroundBinaryOperator(rawValue));

[Theory]
[InlineData("flush_left", LabelPositionOptions.LeftMost)]
Expand All @@ -37,7 +37,7 @@ public void TestParseSpacingAroundBinaryOperator(string rawValue, BinaryOperator
[InlineData(" no_change ", LabelPositionOptions.NoIndent)]
[InlineData(" one_less_than_current ", LabelPositionOptions.OneLess)]
public void TestParseLabelPositioning(string rawValue, LabelPositionOptions parsedValue)
=> Assert.Equal(parsedValue, CSharpFormattingOptions2.ParseEditorConfigLabelPositioning(rawValue));
=> Assert.Equal(parsedValue, (LabelPositionOptions)CSharpFormattingOptions2.ParseEditorConfigLabelPositioning(rawValue));

[Theory]
[InlineData("false:none", (int)ExpressionBodyPreference.Never, ReportDiagnostic.Suppress)]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ internal void TestParseSpacingWithinParenthesesList(string list, SpacePlacementW
InlineData("before_and_after", BinaryOperatorSpacingOptions.Single)]
public void TestParseEditorConfigSpacingAroundBinaryOperatorTrue(string value, BinaryOperatorSpacingOptions expectedResult)
{
Assert.True(CSharpFormattingOptions2.ParseEditorConfigSpacingAroundBinaryOperator(value) == expectedResult,
Assert.True(CSharpFormattingOptions2.ParseEditorConfigSpacingAroundBinaryOperator(value) == (BinaryOperatorSpacingOptionsInternal)expectedResult,
$"Expected option {value} to be parsed as set.");
}

Expand All @@ -47,7 +47,7 @@ public void TestParseEditorConfigSpacingAroundBinaryOperatorTrue(string value, B
InlineData("before_and_after,ignore")]
public void TestParseEditorConfigSpacingAroundBinaryOperatorFalse(string value)
{
Assert.True(CSharpFormattingOptions2.ParseEditorConfigSpacingAroundBinaryOperator(value) == BinaryOperatorSpacingOptions.Single,
Assert.True(CSharpFormattingOptions2.ParseEditorConfigSpacingAroundBinaryOperator(value) == BinaryOperatorSpacingOptionsInternal.Single,
$"Expected option {value} to be parsed as default option.");
}

Expand All @@ -57,7 +57,7 @@ public void TestParseEditorConfigSpacingAroundBinaryOperatorFalse(string value)
InlineData("one_less_than_current", LabelPositionOptions.OneLess)]
public void TestParseEditorConfigLabelPositioningTrue(string value, LabelPositionOptions expectedValue)
{
Assert.True(CSharpFormattingOptions2.ParseEditorConfigLabelPositioning(value) == expectedValue,
Assert.True(CSharpFormattingOptions2.ParseEditorConfigLabelPositioning(value) == (LabelPositionOptionsInternal)expectedValue,
$"Expected option {value} to be parsed as set.");
}

Expand All @@ -67,7 +67,7 @@ public void TestParseEditorConfigLabelPositioningTrue(string value, LabelPositio
InlineData("one_less_thancurrent")]
public void TestParseEditorConfigLabelPositioningFalse(string value)
{
Assert.True(CSharpFormattingOptions2.ParseEditorConfigLabelPositioning(value) == LabelPositionOptions.NoIndent,
Assert.True(CSharpFormattingOptions2.ParseEditorConfigLabelPositioning(value) == LabelPositionOptionsInternal.NoIndent,
$"Expected option {value} to be parsed default");
}

Expand Down
4 changes: 2 additions & 2 deletions src/Workspaces/CoreTest/Formatter/FormatterTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ static void ValidateCSharpOptions(CSharpSyntaxFormattingOptions formattingOption
Assert.True(formattingOptions.Spacing.HasFlag(SpacePlacement.AfterDot));
Assert.True(formattingOptions.Spacing.HasFlag(SpacePlacement.BeforeDot));

Assert.Equal(BinaryOperatorSpacingOptions.Remove, formattingOptions.SpacingAroundBinaryOperator);
Assert.Equal(BinaryOperatorSpacingOptionsInternal.Remove, formattingOptions.SpacingAroundBinaryOperator);

Assert.False(formattingOptions.NewLines.HasFlag(NewLinePlacement.BeforeMembersInObjectInitializers));
Assert.False(formattingOptions.NewLines.HasFlag(NewLinePlacement.BeforeMembersInAnonymousTypes));
Expand All @@ -187,7 +187,7 @@ static void ValidateCSharpOptions(CSharpSyntaxFormattingOptions formattingOption
Assert.False(formattingOptions.NewLines.HasFlag(NewLinePlacement.BeforeOpenBraceInControlBlocks));
Assert.False(formattingOptions.NewLines.HasFlag(NewLinePlacement.BetweenQueryExpressionClauses));

Assert.Equal(LabelPositionOptions.LeftMost, formattingOptions.LabelPositioning);
Assert.Equal(LabelPositionOptionsInternal.LeftMost, formattingOptions.LabelPositioning);

Assert.True(formattingOptions.Indentation.HasFlag(IndentationPlacement.Braces));
Assert.False(formattingOptions.Indentation.HasFlag(IndentationPlacement.BlockContents));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,16 +89,16 @@ internal static string ToEditorConfigValue(NewLineBeforeOpenBracePlacement value
_ => ToEditorConfigFlagList((int)value, static v => s_newLineOptionsEditorConfigMap[(NewLineBeforeOpenBracePlacement)v])
};

internal static BinaryOperatorSpacingOptions ParseEditorConfigSpacingAroundBinaryOperator(string binaryOperatorSpacingValue)
=> s_binaryOperatorSpacingOptionsEditorConfigMap.TryGetValue(binaryOperatorSpacingValue.Trim(), out var value) ? value : BinaryOperatorSpacingOptions.Single;
internal static BinaryOperatorSpacingOptionsInternal ParseEditorConfigSpacingAroundBinaryOperator(string binaryOperatorSpacingValue)
=> s_binaryOperatorSpacingOptionsEditorConfigMap.TryGetValue(binaryOperatorSpacingValue.Trim(), out var value) ? value : BinaryOperatorSpacingOptionsInternal.Single;

private static string GetSpacingAroundBinaryOperatorEditorConfigString(BinaryOperatorSpacingOptions value)
private static string GetSpacingAroundBinaryOperatorEditorConfigString(BinaryOperatorSpacingOptionsInternal value)
=> s_binaryOperatorSpacingOptionsEditorConfigMap.TryGetKey(value, out var key) ? key : "";

internal static LabelPositionOptions ParseEditorConfigLabelPositioning(string labelIndentationValue)
=> s_labelPositionOptionsEditorConfigMap.TryGetValue(labelIndentationValue.Trim(), out var value) ? value : LabelPositionOptions.NoIndent;
internal static LabelPositionOptionsInternal ParseEditorConfigLabelPositioning(string labelIndentationValue)
=> s_labelPositionOptionsEditorConfigMap.TryGetValue(labelIndentationValue.Trim(), out var value) ? value : LabelPositionOptionsInternal.NoIndent;

private static string GetLabelPositionOptionEditorConfigString(LabelPositionOptions value)
private static string GetLabelPositionOptionEditorConfigString(LabelPositionOptionsInternal value)
=> s_labelPositionOptionsEditorConfigMap.TryGetKey(value, out var key) ? key : "";

internal static bool DetermineIfIgnoreSpacesAroundVariableDeclarationIsSet(string value)
Expand Down
Loading