Browse Source

Fixed accessibility of property accessors.

pull/112/head
Artur Zgodziski 15 years ago
parent
commit
c15d5d304e
  1. 40
      ICSharpCode.Decompiler/Ast/AstBuilder.cs
  2. 125
      ICSharpCode.Decompiler/Tests/Types/S_TypeMemberDeclarations.cs

40
ICSharpCode.Decompiler/Ast/AstBuilder.cs

@ -739,6 +739,20 @@ namespace ICSharpCode.Decompiler.Ast @@ -739,6 +739,20 @@ namespace ICSharpCode.Decompiler.Ast
getterModifiers = ConvertModifiers(propDef.GetMethod);
setterModifiers = ConvertModifiers(propDef.SetMethod);
astProp.Modifiers = FixUpVisibility(getterModifiers | setterModifiers);
if (accessor.IsVirtual && !accessor.IsNewSlot && (propDef.GetMethod == null || propDef.SetMethod == null)) {
var baseType = propDef.DeclaringType.BaseType.Resolve();
while (baseType != null && baseType.BaseType != null) {
var basePropDef = baseType.Properties.FirstOrDefault(pd => CouldOverride(pd, propDef));
if (basePropDef != null)
if (basePropDef.GetMethod != null && basePropDef.SetMethod != null) {
var propVisibilityModifiers = ConvertModifiers(basePropDef.GetMethod) | ConvertModifiers(basePropDef.SetMethod);
astProp.Modifiers = FixUpVisibility((astProp.Modifiers & ~Modifiers.VisibilityMask) | (propVisibilityModifiers & Modifiers.VisibilityMask));
break;
} else if ((basePropDef.GetMethod ?? basePropDef.SetMethod).IsNewSlot)
break;
baseType = baseType.BaseType.Resolve();
}
}
}
astProp.Name = CleanName(propDef.Name);
astProp.ReturnType = ConvertType(propDef.PropertyType, propDef);
@ -790,7 +804,31 @@ namespace ICSharpCode.Decompiler.Ast @@ -790,7 +804,31 @@ namespace ICSharpCode.Decompiler.Ast
}
return astProp;
}
bool CouldOverride(PropertyDefinition baseProperty, PropertyDefinition property)
{
if (baseProperty.Name != property.Name || baseProperty.PropertyType.Resolve() != property.PropertyType.Resolve())
return false;
if (baseProperty.HasParameters) {
if (!property.HasParameters) {
return false;
}
var parameters1 = baseProperty.Parameters;
var parameters2 = property.Parameters;
if (parameters1.Count != parameters2.Count)
return false;
for (int index = 0; index < parameters1.Count; index++) {
if (parameters1[index].ParameterType.Resolve() != parameters2[index].ParameterType.Resolve())
return false;
}
}
return true;
}
bool IsDefaultMemberAttribute(CustomAttribute ca)
{
return ca.AttributeType.Name == "DefaultMemberAttribute" && ca.AttributeType.Namespace == "System.Reflection";

125
ICSharpCode.Decompiler/Tests/Types/S_TypeMemberDeclarations.cs

@ -303,3 +303,128 @@ namespace PropertyPublicGetProtectedSet @@ -303,3 +303,128 @@ namespace PropertyPublicGetProtectedSet
}
}
}
//$$ PropertyOverrideDefaultAccessorOnly
namespace PropertyOverrideDefaultAccessorOnly
{
public class MyClass
{
public virtual int MyProperty
{
get
{
return 3;
}
protected set
{
}
}
}
public class Derived : MyClass
{
public override int MyProperty
{
get
{
return 4;
}
}
}
}
//$$ PropertyOverrideRestrictedAccessorOnly
namespace PropertyOverrideRestrictedAccessorOnly
{
public class MyClass
{
public virtual int MyProperty
{
get
{
return 3;
}
protected set
{
}
}
}
public class Derived : MyClass
{
public override int MyProperty
{
protected set
{
}
}
}
}
//$$ PropertyOverrideOneAccessor
namespace PropertyOverrideOneAccessor
{
public class MyClass
{
protected internal virtual int MyProperty
{
get
{
return 3;
}
protected set
{
}
}
}
public class DerivedNew : MyClass
{
public virtual int MyProperty
{
set
{
}
}
}
public class DerivedOverride : DerivedNew
{
public override int MyProperty
{
set
{
}
}
}
}
//$$ IndexerOverrideRestrictedAccessorOnly
namespace IndexerOverrideRestrictedAccessorOnly
{
public class MyClass
{
public virtual int this[string s]
{
get
{
return 3;
}
protected set
{
}
}
protected internal virtual int this[int i]
{
protected get
{
return 2;
}
set
{
}
}
}
public class Derived : MyClass
{
protected internal override int this[int i]
{
protected get
{
return 4;
}
}
}
}

Loading…
Cancel
Save