Browse Source

Fix order of DirectBaseTypes and typo in SpecializedParameter

pull/1198/head
Siegfried Pammer 7 years ago
parent
commit
7d7b7b7d98
  1. 27
      ICSharpCode.Decompiler.Tests/TypeSystem/TypeSystemLoaderTests.cs
  2. 15
      ICSharpCode.Decompiler.Tests/TypeSystem/TypeSystemTestCase.cs
  3. 10
      ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataTypeDefinition.cs
  4. 2
      ICSharpCode.Decompiler/TypeSystem/Implementation/SpecializedParameter.cs

27
ICSharpCode.Decompiler.Tests/TypeSystem/TypeSystemLoaderTests.cs

@ -1082,6 +1082,33 @@ namespace ICSharpCode.Decompiler.Tests.TypeSystem @@ -1082,6 +1082,33 @@ namespace ICSharpCode.Decompiler.Tests.TypeSystem
Assert.That(prop.Setter.IsOverridable, Is.True);
}
[Test]
public void InterfaceShouldDeriveFromObject()
{
ITypeDefinition type = GetTypeDefinition(typeof(IInterfaceWithProperty));
Assert.That(type.DirectBaseTypes.Count() == 1, "Should have exactly one direct base type");
Assert.That(type.DirectBaseTypes.First().IsKnownType(KnownTypeCode.Object), "Base type should be object");
}
[Test]
public void InterfaceShouldDeriveFromObject2()
{
ITypeDefinition type = GetTypeDefinition(typeof(IShadowTestDerived));
Assert.That(type.DirectBaseTypes.Count() == 2, "Should have exactly two direct base types");
Assert.That(type.DirectBaseTypes.First() == GetTypeDefinition(typeof(IShadowTestBase)), "Base type should be IShadowTestBase");
Assert.That(type.DirectBaseTypes.Skip(1).First().IsKnownType(KnownTypeCode.Object), "Base type should be object");
}
[Test]
public void CheckInterfaceDirectBaseTypes()
{
ITypeDefinition type = GetTypeDefinition(typeof(IDerived));
Assert.That(type.DirectBaseTypes.Count() == 3, "Should have exactly three direct base types");
Assert.That(type.DirectBaseTypes.First() == GetTypeDefinition(typeof(IBase1)), "Base type should be IBase1");
Assert.That(type.DirectBaseTypes.Skip(1).First() == GetTypeDefinition(typeof(IBase2)), "Base type should be IBase2");
Assert.That(type.DirectBaseTypes.Skip(2).First().IsKnownType(KnownTypeCode.Object), "Base type should be object");
}
[Test]
public void VirtualPropertyAccessorsShouldNotBeOverrides()
{

15
ICSharpCode.Decompiler.Tests/TypeSystem/TypeSystemTestCase.cs

@ -260,6 +260,21 @@ namespace ICSharpCode.Decompiler.Tests.TypeSystem @@ -260,6 +260,21 @@ namespace ICSharpCode.Decompiler.Tests.TypeSystem
int Prop { get; set; }
}
public interface IBase1
{
int Prop { get; set; }
}
public interface IBase2
{
int Prop { get; set; }
}
public interface IDerived : IBase1, IBase2
{
int Prop { get; set; }
}
public class ClassWithVirtualProperty
{
public virtual int Prop { get; protected set; }

10
ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataTypeDefinition.cs

@ -261,13 +261,17 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation @@ -261,13 +261,17 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
var context = new GenericContext(TypeParameters);
var interfaceImplCollection = td.GetInterfaceImplementations();
baseTypes = new List<IType>(1 + interfaceImplCollection.Count);
if (!td.BaseType.IsNil) {
baseTypes.Add(assembly.ResolveType(td.BaseType, context));
}
foreach (var h in interfaceImplCollection) {
var iface = metadata.GetInterfaceImplementation(h);
baseTypes.Add(assembly.ResolveType(iface.Interface, context, iface.GetCustomAttributes()));
}
if (!td.BaseType.IsNil) {
baseTypes.Add(assembly.ResolveType(td.BaseType, context));
} else if (Kind == TypeKind.Interface) {
// td.BaseType.IsNil is always true for interfaces,
// but the type system expects every interface to derive from System.Object as well.
baseTypes.Add(Compilation.FindType(KnownTypeCode.Object));
}
return LazyInit.GetOrSet(ref this.directBaseTypes, baseTypes);
}
}

2
ICSharpCode.Decompiler/TypeSystem/Implementation/SpecializedParameter.cs

@ -37,7 +37,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation @@ -37,7 +37,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
IReadOnlyList<IAttribute> IParameter.Attributes => baseParameter.Attributes;
bool IParameter.IsRef => baseParameter.IsRef;
bool IParameter.IsOut => baseParameter.IsOptional;
bool IParameter.IsOut => baseParameter.IsOut;
bool IParameter.IsParams => baseParameter.IsParams;
bool IParameter.IsOptional => baseParameter.IsOptional;
IParameterizedMember IParameter.Owner => newOwner;

Loading…
Cancel
Save