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);
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
|
@ -357,13 +358,23 @@ namespace Microsoft.DotNet.SourceBuild.Tasks.LeakDetection
|
|||
|
||||
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)
|
||||
{
|
||||
TypeReference tref = reader.GetTypeReference((TypeReferenceHandle)mref.Parent);
|
||||
var tref = reader.GetTypeReference((TypeReferenceHandle)mref.Parent);
|
||||
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)
|
||||
|
@ -371,7 +382,7 @@ namespace Microsoft.DotNet.SourceBuild.Tasks.LeakDetection
|
|||
var decodedValue = attr.DecodeValue(DummyAttributeTypeProvider.Instance);
|
||||
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
|
||||
{
|
||||
|
|
|
@ -7,28 +7,31 @@ using System.Reflection;
|
|||
using System.Reflection.Metadata;
|
||||
using System.Reflection.Metadata.Ecma335;
|
||||
|
||||
#nullable enable
|
||||
|
||||
namespace Microsoft.DotNet.SourceBuild.Tasks.LeakDetection
|
||||
{
|
||||
|
||||
// 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 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