Browse Source

Fix tuple types.

pull/1198/head
Daniel Grunwald 7 years ago
parent
commit
98d00415d1
  1. 2
      ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs
  2. 5
      ICSharpCode.Decompiler/CSharp/RequiredNamespaceCollector.cs
  3. 2
      ICSharpCode.Decompiler/TypeSystem/ApplyAttributeTypeVisitor.cs
  4. 24
      ICSharpCode.Decompiler/TypeSystem/DecompilerTypeSystem.cs
  5. 33
      ICSharpCode.Decompiler/TypeSystem/MetadataLoader.cs
  6. 2
      ICSharpCode.Decompiler/TypeSystem/TypeProvider.cs

2
ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs

@ -279,7 +279,7 @@ namespace ICSharpCode.Decompiler.Tests @@ -279,7 +279,7 @@ namespace ICSharpCode.Decompiler.Tests
RunForLibrary(cscOptions: cscOptions);
}
[Test, Ignore("tuple type support not yet implemented for SRM")]
[Test]
public void TupleTests([ValueSource("roslynOnlyOptions")] CSharpCompilerOptions cscOptions)
{
RunForLibrary(cscOptions: cscOptions);

5
ICSharpCode.Decompiler/CSharp/RequiredNamespaceCollector.cs

@ -118,6 +118,11 @@ namespace ICSharpCode.Decompiler.CSharp @@ -118,6 +118,11 @@ namespace ICSharpCode.Decompiler.CSharp
case PointerType pointerType:
CollectNamespacesForTypeReference(pointerType.ElementType, namespaces);
break;
case TupleType tupleType:
foreach (var elementType in tupleType.ElementTypes) {
CollectNamespacesForTypeReference(elementType, namespaces);
}
break;
default:
namespaces.Add(type.Namespace);
break;

2
ICSharpCode.Decompiler/TypeSystem/ApplyAttributeTypeVisitor.cs

@ -40,7 +40,7 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -40,7 +40,7 @@ namespace ICSharpCode.Decompiler.TypeSystem
/// <summary>
/// Introduces 'dynamic' and tuple types based on attribute values.
/// </summary>
class ApplyAttributeTypeVisitor : TypeVisitor
sealed class ApplyAttributeTypeVisitor : TypeVisitor
{
public static IType ApplyAttributesToType(
IType inputType,

24
ICSharpCode.Decompiler/TypeSystem/DecompilerTypeSystem.cs

@ -145,6 +145,18 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -145,6 +145,18 @@ namespace ICSharpCode.Decompiler.TypeSystem
typeAttributeOptions
);
}
IType ResolveDeclaringType(SRM.EntityHandle declaringTypeReference)
{
// resolve without substituting dynamic/tuple types
return MetadataTypeReference.Resolve(
declaringTypeReference,
moduleDefinition.Metadata,
context,
typeAttributes: null,
attributeOptions: TypeAttributeOptions.None
);
}
#endregion
public SRM.MethodSignature<IType> DecodeMethodSignature(SRM.StandaloneSignatureHandle handle)
@ -186,7 +198,7 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -186,7 +198,7 @@ namespace ICSharpCode.Decompiler.TypeSystem
case SRM.HandleKind.FieldDefinition:
var fieldDefHandle = (SRM.FieldDefinitionHandle)fieldReference;
var fieldDef = metadata.GetFieldDefinition(fieldDefHandle);
declaringType = ResolveAsType(fieldDef.GetDeclaringType());
declaringType = ResolveDeclaringType(fieldDef.GetDeclaringType());
returnType = new FieldTypeReference(fieldDefHandle, metadata, typeAttributeOptions);
var declaringTypeDefinition = declaringType.GetDefinition();
if (declaringTypeDefinition == null)
@ -199,7 +211,7 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -199,7 +211,7 @@ namespace ICSharpCode.Decompiler.TypeSystem
case SRM.HandleKind.MemberReference:
var memberRef = metadata.GetMemberReference((SRM.MemberReferenceHandle)fieldReference);
Debug.Assert(memberRef.GetKind() == SRM.MemberReferenceKind.Field);
declaringType = ResolveAsType(memberRef.Parent);
declaringType = ResolveDeclaringType(memberRef.Parent);
field = FindNonGenericField(metadata, memberRef, declaringType);
break;
default:
@ -318,7 +330,7 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -318,7 +330,7 @@ namespace ICSharpCode.Decompiler.TypeSystem
switch (methodReference.Kind) {
case SRM.HandleKind.MethodDefinition:
var methodDef = metadata.GetMethodDefinition((SRM.MethodDefinitionHandle)methodReference);
declaringType = ResolveAsType(methodDef.GetDeclaringType());
declaringType = ResolveDeclaringType(methodDef.GetDeclaringType());
declaringTypeDefinition = declaringType.GetDefinition();
if (declaringTypeDefinition == null) {
return CreateFakeMethod(declaringType, metadata.GetString(methodDef.Name), methodDef.DecodeSignature(TypeReferenceSignatureDecoder.Instance, default));
@ -343,7 +355,7 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -343,7 +355,7 @@ namespace ICSharpCode.Decompiler.TypeSystem
FindNonGenericMethod(metadata, memberRef.Parent, out declaringType);
break;
default:
declaringType = ResolveAsType(memberRef.Parent);
declaringType = ResolveDeclaringType(memberRef.Parent);
break;
}
declaringTypeDefinition = declaringType.GetDefinition();
@ -480,7 +492,7 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -480,7 +492,7 @@ namespace ICSharpCode.Decompiler.TypeSystem
{
var propertyDefinition = metadata.GetPropertyDefinition(handle);
var declaringType = metadata.GetMethodDefinition(propertyDefinition.GetAccessors().GetAny()).GetDeclaringType();
ITypeDefinition typeDef = ResolveAsType(declaringType).GetDefinition();
ITypeDefinition typeDef = ResolveDeclaringType(declaringType).GetDefinition();
if (typeDef == null)
return null;
foreach (IProperty property in typeDef.Properties) {
@ -518,7 +530,7 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -518,7 +530,7 @@ namespace ICSharpCode.Decompiler.TypeSystem
{
var eventDefinition = metadata.GetEventDefinition(handle);
var declaringType = metadata.GetMethodDefinition(eventDefinition.GetAccessors().GetAny()).GetDeclaringType();
ITypeDefinition typeDef = ResolveAsType(declaringType).GetDefinition();
ITypeDefinition typeDef = ResolveDeclaringType(declaringType).GetDefinition();
if (typeDef == null)
return null;
var returnType = ResolveAsType(eventDefinition.Type);

33
ICSharpCode.Decompiler/TypeSystem/MetadataLoader.cs

@ -674,17 +674,38 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -674,17 +674,38 @@ namespace ICSharpCode.Decompiler.TypeSystem
foreach (var handle in attributes) {
var attribute = currentMetadata.GetCustomAttribute(handle);
var typeHandle = attribute.GetAttributeType(currentMetadata);
switch (typeHandle.GetFullTypeName(currentMetadata).ReflectionName) {
case "System.Runtime.CompilerServices.DynamicAttribute":
case "System.Runtime.CompilerServices.ExtensionAttribute":
case "System.Runtime.CompilerServices.DecimalConstantAttribute":
case "System.ParamArrayAttribute":
continue;
if (IgnoreAttribute(typeHandle.GetFullTypeName(currentMetadata))) {
continue;
}
targetCollection.Add(ReadAttribute(handle));
}
}
bool IgnoreAttribute(FullTypeName typeName)
{
if (typeName.IsNested || typeName.TopLevelTypeName.TypeParameterCount != 0)
return false;
switch (typeName.TopLevelTypeName.Namespace) {
case "System.Runtime.CompilerServices":
switch (typeName.Name) {
case "DynamicAttribute":
return UseDynamicType;
case "TupleElementNamesAttribute":
return UseTupleTypes;
case "ExtensionAttribute":
return true; // TODO: shouldn't we disable extension methods in C# 2.0 mode?
case "DecimalConstantAttribute":
return true;
default:
return false;
}
case "System":
return typeName.Name == "ParamArrayAttribute";
default:
return false;
}
}
public IUnresolvedAttribute ReadAttribute(CustomAttributeHandle handle)
{
var attribute = currentMetadata.GetCustomAttribute(handle);

2
ICSharpCode.Decompiler/TypeSystem/TypeProvider.cs

@ -28,7 +28,7 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -28,7 +28,7 @@ namespace ICSharpCode.Decompiler.TypeSystem
/// <summary>
/// Allows decoding signatures using decompiler types.
/// </summary>
class TypeProvider : SRM.ISignatureTypeProvider<IType, ITypeResolveContext>, SRM.ICustomAttributeTypeProvider<IType>
sealed class TypeProvider : SRM.ISignatureTypeProvider<IType, ITypeResolveContext>, SRM.ICustomAttributeTypeProvider<IType>
{
readonly IAssembly assembly;
readonly ICompilation compilation;

Loading…
Cancel
Save