Fix attribute type checking and use null-conditional operator (#17902)
This commit is contained in:
parent
8d9388459a
commit
1d674abffe
2 changed files with 28 additions and 14 deletions
|
@ -347,7 +347,8 @@ namespace Microsoft.DotNet.SourceBuild.Tasks.LeakDetection
|
||||||
using var peReader = new PEReader(stream);
|
using var peReader = new PEReader(stream);
|
||||||
|
|
||||||
MetadataReader reader = peReader.GetMetadataReader();
|
MetadataReader reader = peReader.GetMetadataReader();
|
||||||
return reader.CustomAttributes.Select(attrHandle => reader.GetCustomAttribute(attrHandle))
|
return reader.CustomAttributes
|
||||||
|
.Select(attrHandle => reader.GetCustomAttribute(attrHandle))
|
||||||
.Any(attr => IsAttributeSbrp(reader, attr));
|
.Any(attr => IsAttributeSbrp(reader, attr));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -357,13 +358,23 @@ namespace Microsoft.DotNet.SourceBuild.Tasks.LeakDetection
|
||||||
|
|
||||||
if (attr.Constructor.Kind == HandleKind.MemberReference)
|
if (attr.Constructor.Kind == HandleKind.MemberReference)
|
||||||
{
|
{
|
||||||
MemberReference mref = reader.GetMemberReference((MemberReferenceHandle)attr.Constructor);
|
var mref = reader.GetMemberReference((MemberReferenceHandle)attr.Constructor);
|
||||||
|
|
||||||
if (mref.Parent.Kind == HandleKind.TypeReference)
|
if (mref.Parent.Kind == HandleKind.TypeReference)
|
||||||
{
|
{
|
||||||
TypeReference tref = reader.GetTypeReference((TypeReferenceHandle)mref.Parent);
|
var tref = reader.GetTypeReference((TypeReferenceHandle)mref.Parent);
|
||||||
attributeType = $"{reader.GetString(tref.Namespace)}.{reader.GetString(tref.Name)}";
|
attributeType = $"{reader.GetString(tref.Namespace)}.{reader.GetString(tref.Name)}";
|
||||||
}
|
}
|
||||||
|
else if (mref.Parent.Kind == HandleKind.TypeDefinition)
|
||||||
|
{
|
||||||
|
var tdef = reader.GetTypeDefinition((TypeDefinitionHandle)mref.Parent);
|
||||||
|
attributeType = $"{reader.GetString(tdef.Namespace)}.{reader.GetString(tdef.Name)}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (attr.Constructor.Kind == HandleKind.MethodDefinition)
|
||||||
|
{
|
||||||
|
var mdef = reader.GetMethodDefinition((MethodDefinitionHandle)attr.Constructor);
|
||||||
|
var tdef = reader.GetTypeDefinition(mdef.GetDeclaringType());
|
||||||
|
attributeType = $"{reader.GetString(tdef.Namespace)}.{reader.GetString(tdef.Name)}";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (attributeType == SbrpAttributeType)
|
if (attributeType == SbrpAttributeType)
|
||||||
|
@ -371,7 +382,7 @@ namespace Microsoft.DotNet.SourceBuild.Tasks.LeakDetection
|
||||||
var decodedValue = attr.DecodeValue(DummyAttributeTypeProvider.Instance);
|
var decodedValue = attr.DecodeValue(DummyAttributeTypeProvider.Instance);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
return decodedValue.FixedArguments[0].Value.ToString() == "source" && decodedValue.FixedArguments[1].Value.ToString() == "source-build-reference-packages";
|
return decodedValue.FixedArguments[0].Value?.ToString() == "source" && decodedValue.FixedArguments[1].Value?.ToString() == "source-build-reference-packages";
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
|
|
|
@ -7,28 +7,31 @@ using System.Reflection;
|
||||||
using System.Reflection.Metadata;
|
using System.Reflection.Metadata;
|
||||||
using System.Reflection.Metadata.Ecma335;
|
using System.Reflection.Metadata.Ecma335;
|
||||||
|
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
namespace Microsoft.DotNet.SourceBuild.Tasks.LeakDetection
|
namespace Microsoft.DotNet.SourceBuild.Tasks.LeakDetection
|
||||||
{
|
{
|
||||||
|
|
||||||
// An empty ICustomAttributeTypeProvider implementation is necessary to read metadata attribute values.
|
// An empty ICustomAttributeTypeProvider implementation is necessary to read metadata attribute values.
|
||||||
internal class DummyAttributeTypeProvider : ICustomAttributeTypeProvider<Type>
|
internal class DummyAttributeTypeProvider : ICustomAttributeTypeProvider<Type?>
|
||||||
{
|
{
|
||||||
public static readonly DummyAttributeTypeProvider Instance = new();
|
public static readonly DummyAttributeTypeProvider Instance = new();
|
||||||
|
|
||||||
public Type GetPrimitiveType(PrimitiveTypeCode typeCode) => default(Type);
|
public Type? GetPrimitiveType(PrimitiveTypeCode typeCode) => default(Type);
|
||||||
|
|
||||||
public Type GetSystemType() => default(Type);
|
public Type? GetSystemType() => default(Type);
|
||||||
|
|
||||||
public Type GetSZArrayType(Type elementType) => default(Type);
|
public Type? GetSZArrayType(Type? elementType) => default(Type);
|
||||||
|
|
||||||
public Type GetTypeFromDefinition(MetadataReader reader, TypeDefinitionHandle handle, byte rawTypeKind) => default(Type);
|
public Type? GetTypeFromDefinition(MetadataReader reader, TypeDefinitionHandle handle, byte rawTypeKind) => default(Type);
|
||||||
|
|
||||||
public Type GetTypeFromReference(MetadataReader reader, TypeReferenceHandle handle, byte rawTypeKind) => default(Type);
|
public Type? GetTypeFromReference(MetadataReader reader, TypeReferenceHandle handle, byte rawTypeKind) => default(Type);
|
||||||
|
|
||||||
public Type GetTypeFromSerializedName(string name) => default(Type);
|
public Type? GetTypeFromSerializedName(string name) => default(Type);
|
||||||
|
|
||||||
public PrimitiveTypeCode GetUnderlyingEnumType(Type type) => default(PrimitiveTypeCode);
|
public PrimitiveTypeCode GetUnderlyingEnumType(Type? type) => default(PrimitiveTypeCode);
|
||||||
|
|
||||||
public bool IsSystemType(Type type) => default(bool);
|
public bool IsSystemType(Type? type) => default(bool);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue