Browse Source

Merge pull request #2408 from yyjdelete/issue2406

Fix #2406: for readonly property with only getter, move readonly to property instead of getter
pull/2423/head
Siegfried Pammer 4 years ago committed by GitHub
parent
commit
dc400fb700
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/RefLocalsAndReturns.cs
  2. 10
      ICSharpCode.Decompiler/CSharp/Syntax/TypeSystemAstBuilder.cs
  3. 3
      ICSharpCode.Decompiler/CSharp/Transforms/PatternStatementTransform.cs

7
ICSharpCode.Decompiler.Tests/TestCases/Pretty/RefLocalsAndReturns.cs

@ -98,6 +98,13 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty @@ -98,6 +98,13 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
}
}
public readonly int ReadOnlyPropertyWithOnlyGetter {
get {
Console.WriteLine("No inlining");
return 1;
}
}
public ref int RefProperty => ref arr[0];
public ref readonly int RefReadonlyProperty => ref arr[0];
public readonly ref int ReadonlyRefProperty => ref arr[0];

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

@ -1972,7 +1972,7 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax @@ -1972,7 +1972,7 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
}
if (this.ShowAccessibility && accessor.Accessibility != ownerAccessibility)
decl.Modifiers = ModifierFromAccessibility(accessor.Accessibility);
if (accessor.HasReadonlyModifier())
if (this.ShowModifiers && accessor.HasReadonlyModifier())
decl.Modifiers |= Modifiers.Readonly;
TokenRole keywordRole = kind switch {
MethodSemanticsAttributes.Getter => PropertyDeclaration.GetKeywordRole,
@ -2035,13 +2035,19 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax @@ -2035,13 +2035,19 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
static void MergeReadOnlyModifiers(EntityDeclaration decl, Accessor accessor1, Accessor accessor2)
{
if (accessor1.HasModifier(Modifiers.Readonly) && accessor2.HasModifier(Modifiers.Readonly))
if (accessor1.HasModifier(Modifiers.Readonly) && accessor2.IsNull)
{
accessor1.Modifiers &= ~Modifiers.Readonly;
decl.Modifiers |= Modifiers.Readonly;
}
else if (accessor1.HasModifier(Modifiers.Readonly) && accessor2.HasModifier(Modifiers.Readonly))
{
accessor1.Modifiers &= ~Modifiers.Readonly;
accessor2.Modifiers &= ~Modifiers.Readonly;
decl.Modifiers |= Modifiers.Readonly;
}
}
IndexerDeclaration ConvertIndexer(IProperty indexer)
{
IndexerDeclaration decl = new IndexerDeclaration();

3
ICSharpCode.Decompiler/CSharp/Transforms/PatternStatementTransform.cs

@ -630,7 +630,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms @@ -630,7 +630,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
}
if (field == null || !NameCouldBeBackingFieldOfAutomaticProperty(field.Name, out _))
return null;
if (propertyDeclaration.Setter.HasModifier(Modifiers.Readonly))
if (propertyDeclaration.Setter.HasModifier(Modifiers.Readonly) || (propertyDeclaration.HasModifier(Modifiers.Readonly) && !propertyDeclaration.Setter.IsNull))
return null;
if (field.IsCompilerGenerated() && field.DeclaringTypeDefinition == property.DeclaringTypeDefinition)
{
@ -638,6 +638,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms @@ -638,6 +638,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
RemoveCompilerGeneratedAttribute(propertyDeclaration.Setter.Attributes);
propertyDeclaration.Getter.Body = null;
propertyDeclaration.Setter.Body = null;
propertyDeclaration.Modifiers &= ~Modifiers.Readonly;
propertyDeclaration.Getter.Modifiers &= ~Modifiers.Readonly;
// Add C# 7.3 attributes on backing field:

Loading…
Cancel
Save