Browse Source

Fix: #3407 Add "private protected" feature for 7.2 decompiler options

pull/3443/head
Siegfried Pammer 3 months ago
parent
commit
96caa4ecb7
  1. 1
      ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs
  2. 1
      ICSharpCode.Decompiler/CSharp/OutputVisitor/CSharpAmbience.cs
  3. 21
      ICSharpCode.Decompiler/CSharp/Syntax/TypeSystemAstBuilder.cs
  4. 21
      ICSharpCode.Decompiler/DecompilerSettings.cs
  5. 5
      ICSharpCode.Decompiler/Output/IAmbience.cs
  6. 19
      ILSpy/Properties/Resources.Designer.cs
  7. 5
      ILSpy/Properties/Resources.resx
  8. 3
      ILSpy/Properties/Resources.zh-Hans.resx

1
ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs

@ -528,6 +528,7 @@ namespace ICSharpCode.Decompiler.CSharp
{ {
var typeSystemAstBuilder = new TypeSystemAstBuilder(); var typeSystemAstBuilder = new TypeSystemAstBuilder();
typeSystemAstBuilder.ShowAttributes = true; typeSystemAstBuilder.ShowAttributes = true;
typeSystemAstBuilder.UsePrivateProtectedAccessibility = settings.IntroducePrivateProtectedAccessibility;
typeSystemAstBuilder.SortAttributes = settings.SortCustomAttributes; typeSystemAstBuilder.SortAttributes = settings.SortCustomAttributes;
typeSystemAstBuilder.AlwaysUseShortTypeNames = true; typeSystemAstBuilder.AlwaysUseShortTypeNames = true;
typeSystemAstBuilder.AddResolveResultAnnotations = true; typeSystemAstBuilder.AddResolveResultAnnotations = true;

1
ICSharpCode.Decompiler/CSharp/OutputVisitor/CSharpAmbience.cs

@ -236,6 +236,7 @@ namespace ICSharpCode.Decompiler.CSharp.OutputVisitor
astBuilder.ShowTypeParametersForUnboundTypes = true; astBuilder.ShowTypeParametersForUnboundTypes = true;
astBuilder.ShowModifiers = (ConversionFlags & ConversionFlags.ShowModifiers) == ConversionFlags.ShowModifiers; astBuilder.ShowModifiers = (ConversionFlags & ConversionFlags.ShowModifiers) == ConversionFlags.ShowModifiers;
astBuilder.ShowAccessibility = (ConversionFlags & ConversionFlags.ShowAccessibility) == ConversionFlags.ShowAccessibility; astBuilder.ShowAccessibility = (ConversionFlags & ConversionFlags.ShowAccessibility) == ConversionFlags.ShowAccessibility;
astBuilder.UsePrivateProtectedAccessibility = (ConversionFlags & ConversionFlags.UsePrivateProtectedAccessibility) == ConversionFlags.UsePrivateProtectedAccessibility;
astBuilder.AlwaysUseShortTypeNames = (ConversionFlags & ConversionFlags.UseFullyQualifiedTypeNames) != ConversionFlags.UseFullyQualifiedTypeNames; astBuilder.AlwaysUseShortTypeNames = (ConversionFlags & ConversionFlags.UseFullyQualifiedTypeNames) != ConversionFlags.UseFullyQualifiedTypeNames;
astBuilder.ShowParameterNames = (ConversionFlags & ConversionFlags.ShowParameterNames) == ConversionFlags.ShowParameterNames; astBuilder.ShowParameterNames = (ConversionFlags & ConversionFlags.ShowParameterNames) == ConversionFlags.ShowParameterNames;
astBuilder.UseNullableSpecifierForValueTypes = (ConversionFlags & ConversionFlags.UseNullableSpecifierForValueTypes) != 0; astBuilder.UseNullableSpecifierForValueTypes = (ConversionFlags & ConversionFlags.UseNullableSpecifierForValueTypes) != 0;

21
ICSharpCode.Decompiler/CSharp/Syntax/TypeSystemAstBuilder.cs

@ -70,6 +70,7 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
this.UseKeywordsForBuiltinTypes = true; this.UseKeywordsForBuiltinTypes = true;
this.UseNullableSpecifierForValueTypes = true; this.UseNullableSpecifierForValueTypes = true;
this.ShowAccessibility = true; this.ShowAccessibility = true;
this.UsePrivateProtectedAccessibility = true;
this.ShowModifiers = true; this.ShowModifiers = true;
this.ShowBaseTypes = true; this.ShowBaseTypes = true;
this.ShowTypeParameters = true; this.ShowTypeParameters = true;
@ -93,13 +94,19 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
public bool AddResolveResultAnnotations { get; set; } public bool AddResolveResultAnnotations { get; set; }
/// <summary> /// <summary>
/// Controls the accessibility modifiers are shown. /// Controls whether accessibility modifiers are shown.
/// The default value is <see langword="true" />. /// The default value is <see langword="true" />.
/// </summary> /// </summary>
public bool ShowAccessibility { get; set; } public bool ShowAccessibility { get; set; }
/// <summary> /// <summary>
/// Controls the non-accessibility modifiers are shown. /// Controls whether "private protected" accessibility modifiers are shown.
/// The default value is <see langword="true" />.
/// </summary>
public bool UsePrivateProtectedAccessibility { get; set; }
/// <summary>
/// Controls whether non-accessibility modifiers are shown.
/// The default value is <see langword="true" />. /// The default value is <see langword="true" />.
/// </summary> /// </summary>
public bool ShowModifiers { get; set; } public bool ShowModifiers { get; set; }
@ -1805,7 +1812,7 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
Modifiers modifiers = Modifiers.None; Modifiers modifiers = Modifiers.None;
if (this.ShowAccessibility) if (this.ShowAccessibility)
{ {
modifiers |= ModifierFromAccessibility(typeDefinition.Accessibility); modifiers |= ModifierFromAccessibility(typeDefinition.Accessibility, UsePrivateProtectedAccessibility);
} }
if (this.ShowModifiers) if (this.ShowModifiers)
{ {
@ -2073,7 +2080,7 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
} }
} }
if (this.ShowAccessibility && accessor.Accessibility != ownerAccessibility) if (this.ShowAccessibility && accessor.Accessibility != ownerAccessibility)
decl.Modifiers = ModifierFromAccessibility(accessor.Accessibility); decl.Modifiers = ModifierFromAccessibility(accessor.Accessibility, UsePrivateProtectedAccessibility);
if (this.ShowModifiers && accessor.HasReadonlyModifier()) if (this.ShowModifiers && accessor.HasReadonlyModifier())
decl.Modifiers |= Modifiers.Readonly; decl.Modifiers |= Modifiers.Readonly;
TokenRole keywordRole = kind switch { TokenRole keywordRole = kind switch {
@ -2342,7 +2349,7 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
#endregion #endregion
#region Convert Modifiers #region Convert Modifiers
public static Modifiers ModifierFromAccessibility(Accessibility accessibility) public static Modifiers ModifierFromAccessibility(Accessibility accessibility, bool usePrivateProtected)
{ {
switch (accessibility) switch (accessibility)
{ {
@ -2357,7 +2364,7 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
case Accessibility.ProtectedOrInternal: case Accessibility.ProtectedOrInternal:
return Modifiers.Protected | Modifiers.Internal; return Modifiers.Protected | Modifiers.Internal;
case Accessibility.ProtectedAndInternal: case Accessibility.ProtectedAndInternal:
return Modifiers.Private | Modifiers.Protected; return usePrivateProtected ? Modifiers.Private | Modifiers.Protected : Modifiers.Protected;
default: default:
return Modifiers.None; return Modifiers.None;
} }
@ -2388,7 +2395,7 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
Modifiers m = Modifiers.None; Modifiers m = Modifiers.None;
if (this.ShowAccessibility && NeedsAccessibility(member)) if (this.ShowAccessibility && NeedsAccessibility(member))
{ {
m |= ModifierFromAccessibility(member.Accessibility); m |= ModifierFromAccessibility(member.Accessibility, UsePrivateProtectedAccessibility);
} }
if (this.ShowModifiers) if (this.ShowModifiers)
{ {

21
ICSharpCode.Decompiler/DecompilerSettings.cs

@ -112,6 +112,7 @@ namespace ICSharpCode.Decompiler
introduceRefModifiersOnStructs = false; introduceRefModifiersOnStructs = false;
nonTrailingNamedArguments = false; nonTrailingNamedArguments = false;
refExtensionMethods = false; refExtensionMethods = false;
introducePrivateProtectedAccessibilty = false;
} }
if (languageVersion < CSharp.LanguageVersion.CSharp7_3) if (languageVersion < CSharp.LanguageVersion.CSharp7_3)
{ {
@ -185,7 +186,7 @@ namespace ICSharpCode.Decompiler
|| patternBasedFixedStatement) || patternBasedFixedStatement)
return CSharp.LanguageVersion.CSharp7_3; return CSharp.LanguageVersion.CSharp7_3;
if (introduceRefModifiersOnStructs || introduceReadonlyAndInModifiers if (introduceRefModifiersOnStructs || introduceReadonlyAndInModifiers
|| nonTrailingNamedArguments || refExtensionMethods) || nonTrailingNamedArguments || refExtensionMethods || introducePrivateProtectedAccessibilty)
return CSharp.LanguageVersion.CSharp7_2; return CSharp.LanguageVersion.CSharp7_2;
// C# 7.1 missing // C# 7.1 missing
if (outVariables || throwExpressions || tupleTypes || tupleConversions if (outVariables || throwExpressions || tupleTypes || tupleConversions
@ -1418,6 +1419,24 @@ namespace ICSharpCode.Decompiler
} }
} }
bool introducePrivateProtectedAccessibilty = true;
/// <summary>
/// Gets/Sets whether "private protected" should be used.
/// </summary>
[Category("C# 7.2 / VS 2017.4")]
[Description("DecompilerSettings.IntroducePrivateProtectedAccessibility")]
public bool IntroducePrivateProtectedAccessibility {
get { return introducePrivateProtectedAccessibilty; }
set {
if (introducePrivateProtectedAccessibilty != value)
{
introducePrivateProtectedAccessibilty = value;
OnPropertyChanged();
}
}
}
bool readOnlyMethods = true; bool readOnlyMethods = true;
[Category("C# 8.0 / VS 2019")] [Category("C# 8.0 / VS 2019")]

5
ICSharpCode.Decompiler/Output/IAmbience.cs

@ -117,9 +117,14 @@ namespace ICSharpCode.Decompiler.Output
/// Support C# 11 <c>operator checked</c>. /// Support C# 11 <c>operator checked</c>.
/// </summary> /// </summary>
SupportOperatorChecked = 0x100000, SupportOperatorChecked = 0x100000,
/// <summary>
/// Support C# 7.2 <c>private protected</c>.
/// </summary>
UsePrivateProtectedAccessibility = 0x200000,
StandardConversionFlags = ShowParameterNames | StandardConversionFlags = ShowParameterNames |
ShowAccessibility | ShowAccessibility |
UsePrivateProtectedAccessibility |
ShowParameterList | ShowParameterList |
ShowParameterModifiers | ShowParameterModifiers |
ShowParameterDefaultValues | ShowParameterDefaultValues |

19
ILSpy/Properties/Resources.Designer.cs generated

@ -1080,6 +1080,15 @@ namespace ICSharpCode.ILSpy.Properties {
} }
} }
/// <summary>
/// Looks up a localized string similar to Introduce &apos;private protected&apos; accessibility.
/// </summary>
public static string DecompilerSettings_IntroducePrivateProtectedAccessibility {
get {
return ResourceManager.GetString("DecompilerSettings.IntroducePrivateProtectedAccessibility", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Introduce static local functions. /// Looks up a localized string similar to Introduce static local functions.
/// </summary> /// </summary>
@ -1118,6 +1127,16 @@ namespace ICSharpCode.ILSpy.Properties {
} }
} }
/// <summary>
/// Looks up a localized resource of type System.Object.
/// </summary>
public static object DecompilerSettings_LifetimeAnnotations {
get {
object obj = ResourceManager.GetObject("DecompilerSettings.LifetimeAnnotations", resourceCulture);
return ((object)(obj));
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Use nint/nuint types. /// Looks up a localized string similar to Use nint/nuint types.
/// </summary> /// </summary>

5
ILSpy/Properties/Resources.resx

@ -595,7 +595,7 @@ Are you sure you want to continue?</value>
<value>Enable folding on all blocks in braces</value> <value>Enable folding on all blocks in braces</value>
</data> </data>
<data name="EnableSmoothScrolling" xml:space="preserve"> <data name="EnableSmoothScrolling" xml:space="preserve">
<value>Enable smooth scrolling</value> <value>Enable smooth scrolling</value>
</data> </data>
<data name="EnableWordWrap" xml:space="preserve"> <data name="EnableWordWrap" xml:space="preserve">
<value>Enable word wrap</value> <value>Enable word wrap</value>
@ -1108,4 +1108,7 @@ Do you want to continue?</value>
<data name="_Window" xml:space="preserve"> <data name="_Window" xml:space="preserve">
<value>_Window</value> <value>_Window</value>
</data> </data>
<data name="DecompilerSettings.IntroducePrivateProtectedAccessibility" xml:space="preserve">
<value>Introduce 'private protected' accessibility</value>
</data>
</root> </root>

3
ILSpy/Properties/Resources.zh-Hans.resx

@ -369,6 +369,9 @@
<data name="DecompilerSettings.IntroduceLocalFunctions" xml:space="preserve"> <data name="DecompilerSettings.IntroduceLocalFunctions" xml:space="preserve">
<value>引入局部函数(local functions)</value> <value>引入局部函数(local functions)</value>
</data> </data>
<data name="DecompilerSettings.IntroducePrivateProtectedAccessibility" xml:space="preserve">
<value />
</data>
<data name="DecompilerSettings.IntroduceStaticLocalFunctions" xml:space="preserve"> <data name="DecompilerSettings.IntroduceStaticLocalFunctions" xml:space="preserve">
<value>引入静态局部函数(static local functions)</value> <value>引入静态局部函数(static local functions)</value>
</data> </data>

Loading…
Cancel
Save