Browse Source

Add IsArrayInterfaceType extension method

net10upgrade-future
Siegfried Pammer 2 days ago
parent
commit
2c85c744f6
  1. 21
      ICSharpCode.Decompiler/CSharp/Resolver/TypeInference.cs
  2. 17
      ICSharpCode.Decompiler/TypeSystem/TypeSystemExtensions.cs

21
ICSharpCode.Decompiler/CSharp/Resolver/TypeInference.cs

@ -759,7 +759,7 @@ namespace ICSharpCode.Decompiler.CSharp.Resolver @@ -759,7 +759,7 @@ namespace ICSharpCode.Decompiler.CSharp.Resolver
MakeLowerBoundInference(arrU.ElementType, arrV.ElementType);
return;
}
else if (arrU != null && IsGenericInterfaceImplementedByArray(pV) && arrU.Dimensions == 1)
else if (arrU != null && pV.IsArrayInterfaceType() && arrU.Dimensions == 1)
{
MakeLowerBoundInference(arrU.ElementType, pV.GetTypeArgument(0));
return;
@ -829,23 +829,6 @@ namespace ICSharpCode.Decompiler.CSharp.Resolver @@ -829,23 +829,6 @@ namespace ICSharpCode.Decompiler.CSharp.Resolver
return;
}
}
static bool IsGenericInterfaceImplementedByArray(ParameterizedType rt)
{
if (rt == null || rt.TypeParameterCount != 1)
return false;
switch (rt.GetDefinition()?.KnownTypeCode)
{
case KnownTypeCode.IEnumerableOfT:
case KnownTypeCode.ICollectionOfT:
case KnownTypeCode.IListOfT:
case KnownTypeCode.IReadOnlyCollectionOfT:
case KnownTypeCode.IReadOnlyListOfT:
return true;
default:
return false;
}
}
#endregion
#region MakeUpperBoundInference (§7.5.2.10)
@ -880,7 +863,7 @@ namespace ICSharpCode.Decompiler.CSharp.Resolver @@ -880,7 +863,7 @@ namespace ICSharpCode.Decompiler.CSharp.Resolver
MakeUpperBoundInference(arrU.ElementType, arrV.ElementType);
return;
}
else if (arrV != null && IsGenericInterfaceImplementedByArray(pU) && arrV.Dimensions == 1)
else if (arrV != null && pU.IsArrayInterfaceType() && arrV.Dimensions == 1)
{
MakeUpperBoundInference(pU.GetTypeArgument(0), arrV.ElementType);
return;

17
ICSharpCode.Decompiler/TypeSystem/TypeSystemExtensions.cs

@ -306,6 +306,23 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -306,6 +306,23 @@ namespace ICSharpCode.Decompiler.TypeSystem
}
}
public static bool IsArrayInterfaceType(this IType type)
{
if (type == null || type.TypeParameterCount != 1)
return false;
switch (type.GetDefinition()?.KnownTypeCode)
{
case KnownTypeCode.IEnumerableOfT:
case KnownTypeCode.ICollectionOfT:
case KnownTypeCode.IListOfT:
case KnownTypeCode.IReadOnlyCollectionOfT:
case KnownTypeCode.IReadOnlyListOfT:
return true;
default:
return false;
}
}
public static bool IsInlineArrayType(this IType type)
{
if (type.Kind != TypeKind.Struct)

Loading…
Cancel
Save