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
RunForLibrary(cscOptions: cscOptions); RunForLibrary(cscOptions: cscOptions);
} }
[Test, Ignore("tuple type support not yet implemented for SRM")] [Test]
public void TupleTests([ValueSource("roslynOnlyOptions")] CSharpCompilerOptions cscOptions) public void TupleTests([ValueSource("roslynOnlyOptions")] CSharpCompilerOptions cscOptions)
{ {
RunForLibrary(cscOptions: cscOptions); RunForLibrary(cscOptions: cscOptions);

5
ICSharpCode.Decompiler/CSharp/RequiredNamespaceCollector.cs

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

2
ICSharpCode.Decompiler/TypeSystem/ApplyAttributeTypeVisitor.cs

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

24
ICSharpCode.Decompiler/TypeSystem/DecompilerTypeSystem.cs

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

33
ICSharpCode.Decompiler/TypeSystem/MetadataLoader.cs

@ -674,17 +674,38 @@ namespace ICSharpCode.Decompiler.TypeSystem
foreach (var handle in attributes) { foreach (var handle in attributes) {
var attribute = currentMetadata.GetCustomAttribute(handle); var attribute = currentMetadata.GetCustomAttribute(handle);
var typeHandle = attribute.GetAttributeType(currentMetadata); var typeHandle = attribute.GetAttributeType(currentMetadata);
switch (typeHandle.GetFullTypeName(currentMetadata).ReflectionName) { if (IgnoreAttribute(typeHandle.GetFullTypeName(currentMetadata))) {
case "System.Runtime.CompilerServices.DynamicAttribute": continue;
case "System.Runtime.CompilerServices.ExtensionAttribute":
case "System.Runtime.CompilerServices.DecimalConstantAttribute":
case "System.ParamArrayAttribute":
continue;
} }
targetCollection.Add(ReadAttribute(handle)); 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) public IUnresolvedAttribute ReadAttribute(CustomAttributeHandle handle)
{ {
var attribute = currentMetadata.GetCustomAttribute(handle); var attribute = currentMetadata.GetCustomAttribute(handle);

2
ICSharpCode.Decompiler/TypeSystem/TypeProvider.cs

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

Loading…
Cancel
Save