From df9b104999d9dcf363cf56d9aa8130425d28a040 Mon Sep 17 00:00:00 2001 From: vitek-karas Date: Wed, 21 Apr 2021 12:00:47 -0700 Subject: [PATCH 1/8] Annotate required APIs with DynamicallyAccessedMemberTypes.Interfaces After the basic annotation of Type.GetInterface and Type.GetInterfaces this propagates this annotation to all places which require it. It also resolves warnings in all the places where this shows up. --- .../Runtime/InteropServices/ComActivator.cs | 10 ++- .../src/System/Reflection/Emit/EnumBuilder.cs | 2 + .../Emit/GenericTypeParameterBuilder.cs | 2 + .../src/System/Reflection/Emit/SymbolType.cs | 2 + .../src/System/Reflection/Emit/TypeBuilder.cs | 5 ++ .../Emit/TypeBuilderInstantiation.cs | 3 + .../src/System/RuntimeType.CoreCLR.cs | 16 +++- .../CompilerServices/ConversionResolution.vb | 13 ++- .../CompilerServices/OverloadResolution.vb | 4 + .../VisualBasic/CompilerServices/Symbols.vb | 6 +- .../src/System/Dynamic/Utils/TypeUtils.cs | 24 +++--- .../src/System/Linq/EnumerableRewriter.cs | 85 ++++++++++++++----- .../src/System/Linq/TypeHelper.cs | 8 ++ .../Tracing/TraceLogging/Statics.cs | 6 +- .../src/System/Reflection/SignatureType.cs | 6 ++ .../src/System/Reflection/TypeDelegator.cs | 2 + .../src/System/Reflection/TypeInfo.cs | 6 +- .../src/System/Type.Helpers.cs | 5 ++ .../System.Private.CoreLib/src/System/Type.cs | 3 + .../Serialization/ClassDataContract.cs | 4 +- .../System/Xml/Serialization/CodeGenerator.cs | 4 + .../ref/System.Reflection.TypeExtensions.cs | 2 +- .../src/System/Reflection/TypeExtensions.cs | 3 +- .../IEnumerableConverterFactoryHelpers.cs | 5 ++ .../Reflection/Emit/DerivedTypes.Mono.cs | 2 + .../Reflection/Emit/EnumBuilder.Mono.cs | 2 + .../Emit/GenericTypeParameterBuilder.cs | 2 + .../Reflection/Emit/TypeBuilder.Mono.cs | 2 + .../Emit/TypeBuilderInstantiation.cs | 2 + .../src/System/RuntimeType.Mono.cs | 2 + 30 files changed, 188 insertions(+), 50 deletions(-) diff --git a/src/coreclr/System.Private.CoreLib/src/Internal/Runtime/InteropServices/ComActivator.cs b/src/coreclr/System.Private.CoreLib/src/Internal/Runtime/InteropServices/ComActivator.cs index d28441194f4a36..d696e278f60ca8 100644 --- a/src/coreclr/System.Private.CoreLib/src/Internal/Runtime/InteropServices/ComActivator.cs +++ b/src/coreclr/System.Private.CoreLib/src/Internal/Runtime/InteropServices/ComActivator.cs @@ -409,15 +409,17 @@ private static AssemblyLoadContext GetALC(string assemblyPath) private sealed class BasicClassFactory : IClassFactory { private readonly Guid _classId; + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] private readonly Type _classType; - public BasicClassFactory(Guid clsid, Type classType) + public BasicClassFactory(Guid clsid, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] Type classType) { _classId = clsid; _classType = classType; } - public static Type GetValidatedInterfaceType(Type classType, ref Guid riid, object? outer) + public static Type GetValidatedInterfaceType([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] Type classType, ref Guid riid, object? outer) { Debug.Assert(classType != null); if (riid == Marshal.IID_IUnknown) @@ -516,9 +518,11 @@ private sealed class LicenseClassFactory : IClassFactory2 { private readonly LicenseInteropProxy _licenseProxy = new LicenseInteropProxy(); private readonly Guid _classId; + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] private readonly Type _classType; - public LicenseClassFactory(Guid clsid, Type classType) + public LicenseClassFactory(Guid clsid, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] Type classType) { _classId = clsid; _classType = classType; diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.cs index 1ec9ba8e64f836..6ab2e1c193e1b8 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.cs @@ -137,11 +137,13 @@ public override FieldInfo[] GetFields(BindingFlags bindingAttr) return m_typeBuilder.GetFields(bindingAttr); } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type? GetInterface(string name, bool ignoreCase) { return m_typeBuilder.GetInterface(name, ignoreCase); } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type[] GetInterfaces() { return m_typeBuilder.GetInterfaces(); diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/GenericTypeParameterBuilder.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/GenericTypeParameterBuilder.cs index 87c04da9552ab0..0b47f1559b72e0 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/GenericTypeParameterBuilder.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/GenericTypeParameterBuilder.cs @@ -115,8 +115,10 @@ public override Type MakeArrayType(int rank) [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields)] public override FieldInfo[] GetFields(BindingFlags bindingAttr) { throw new NotSupportedException(); } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type GetInterface(string name, bool ignoreCase) { throw new NotSupportedException(); } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type[] GetInterfaces() { throw new NotSupportedException(); } [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicEvents | DynamicallyAccessedMemberTypes.NonPublicEvents)] diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/SymbolType.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/SymbolType.cs index 05f19ed70a2f07..3e157cf2041046 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/SymbolType.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/SymbolType.cs @@ -397,11 +397,13 @@ public override FieldInfo[] GetFields(BindingFlags bindingAttr) throw new NotSupportedException(SR.NotSupported_NonReflectedType); } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type GetInterface(string name, bool ignoreCase) { throw new NotSupportedException(SR.NotSupported_NonReflectedType); } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type[] GetInterfaces() { throw new NotSupportedException(SR.NotSupported_NonReflectedType); diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.cs index 064e8edcd6eab8..18098c8eae2fda 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.cs @@ -837,6 +837,7 @@ public override FieldInfo[] GetFields(BindingFlags bindingAttr) return m_bakedRuntimeType.GetFields(bindingAttr); } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type? GetInterface(string name, bool ignoreCase) { if (!IsCreated()) @@ -845,6 +846,7 @@ public override FieldInfo[] GetFields(BindingFlags bindingAttr) return m_bakedRuntimeType.GetInterface(name, ignoreCase); } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type[] GetInterfaces() { if (m_bakedRuntimeType != null) @@ -947,6 +949,9 @@ public override MemberInfo[] GetMembers(BindingFlags bindingAttr) return m_bakedRuntimeType.GetMembers(bindingAttr); } + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2070:UnrecognizedReflectionPattern", + Justification = "The GetInterfaces technically requires all interfaces to be preserved" + + "But in this case it acts only on TypeBuilder which is never trimmed (as it's runtime created).")] public override bool IsAssignableFrom([NotNullWhen(true)] Type? c) { if (IsTypeEqual(c, this)) diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilderInstantiation.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilderInstantiation.cs index 2513d0f96596bc..86120cd501cdc7 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilderInstantiation.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilderInstantiation.cs @@ -178,7 +178,10 @@ public override Type? BaseType [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields)] public override FieldInfo[] GetFields(BindingFlags bindingAttr) { throw new NotSupportedException(); } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type GetInterface(string name, bool ignoreCase) { throw new NotSupportedException(); } + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type[] GetInterfaces() { throw new NotSupportedException(); } [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicEvents | DynamicallyAccessedMemberTypes.NonPublicEvents)] diff --git a/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs index f645ad15a40735..434fabfc184b9b 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs @@ -803,6 +803,10 @@ private RuntimeConstructorInfo[] PopulateConstructors(Filter filter) return list.ToArray(); } + [UnconditionalSuppressMessage ("ReflectionAnalysis", "IL2075:UnrecognizedReflectionPattern", + Justification = "Calls to GetInterfaces technically require all interfaces on ReflectedType" + + "But this is not a public API to enumerate reflection items, all the public APIs which do that" + + "should be annotated accordingly.")] private RuntimeFieldInfo[] PopulateFields(Filter filter) { ListBuilder list = default; @@ -983,7 +987,11 @@ private void PopulateLiteralFields(Filter filter, RuntimeType declaringType, ref } } - private void AddSpecialInterface(ref ListBuilder list, Filter filter, RuntimeType iList, bool addSubInterface) + private void AddSpecialInterface( + ref ListBuilder list, + Filter filter, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] RuntimeType iList, + bool addSubInterface) { if (iList.IsAssignableFrom(ReflectedType)) { @@ -1003,6 +1011,10 @@ private void AddSpecialInterface(ref ListBuilder list, Filter filte } } + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2065:UnrecognizedReflectionPattern", + Justification = "Calls to GetInterfaces technically require all interfaces on ReflectedType" + + "But this is not a public API to enumerate reflection items, all the public APIs which do that" + + "should be annotated accordingly.")] private RuntimeType[] PopulateInterfaces(Filter filter) { ListBuilder list = default; @@ -2611,6 +2623,7 @@ public override FieldInfo[] GetFields(BindingFlags bindingAttr) return GetFieldCandidates(null, bindingAttr, false).ToArray(); } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type[] GetInterfaces() { RuntimeType[] candidates = Cache.GetInterfaceList(MemberListType.All, null); @@ -2903,6 +2916,7 @@ public override InterfaceMapping GetInterfaceMap(Type ifaceType) return match; } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type? GetInterface(string fullname, bool ignoreCase) { if (fullname is null) throw new ArgumentNullException(nameof(fullname)); diff --git a/src/libraries/Microsoft.VisualBasic.Core/src/Microsoft/VisualBasic/CompilerServices/ConversionResolution.vb b/src/libraries/Microsoft.VisualBasic.Core/src/Microsoft/VisualBasic/CompilerServices/ConversionResolution.vb index 8c9ea8ed3640d9..b9292242a31be7 100644 --- a/src/libraries/Microsoft.VisualBasic.Core/src/Microsoft/VisualBasic/CompilerServices/ConversionResolution.vb +++ b/src/libraries/Microsoft.VisualBasic.Core/src/Microsoft/VisualBasic/CompilerServices/ConversionResolution.vb @@ -176,7 +176,7 @@ Namespace Microsoft.VisualBasic.CompilerServices Debug.Assert(TypeCode.String = 18, "wrong value!") End Sub - + Friend Shared Function ClassifyConversion(ByVal targetType As System.Type, ByVal sourceType As System.Type, ByRef operatorMethod As Method) As ConversionClass 'This function classifies the nature of the conversion from the source type to the target 'type. If such a conversion requires a user-defined conversion, it will be supplied as an @@ -205,6 +205,7 @@ Namespace Microsoft.VisualBasic.CompilerServices Return s_conversionTable(targetTypeCode)(sourceTypeCode) End Function + Friend Shared Function ClassifyPredefinedCLRConversion(ByVal targetType As System.Type, ByVal sourceType As System.Type) As ConversionClass ' This function classifies all intrinsic CLR conversions, such as inheritance, ' implementation, and array covariance. @@ -355,6 +356,7 @@ Namespace Microsoft.VisualBasic.CompilerServices End Function + Private Shared Function ClassifyCLRArrayToInterfaceConversion(ByVal targetInterface As System.Type, ByVal sourceArrayType As System.Type) As ConversionClass Debug.Assert(IsInterface(targetInterface), "Non-Interface type unexpected!!!") @@ -424,6 +426,7 @@ Namespace Microsoft.VisualBasic.CompilerServices End Function + Private Shared Function ClassifyCLRConversionForArrayElementTypes(ByVal targetElementType As System.Type, ByVal sourceElementType As System.Type) As ConversionClass ' The element types must either be the same or @@ -467,6 +470,7 @@ Namespace Microsoft.VisualBasic.CompilerServices End Function + Friend Shared Function ClassifyPredefinedConversion(ByVal targetType As System.Type, ByVal sourceType As System.Type) As ConversionClass ' This function classifies all intrinsic language conversions, such as inheritance, ' implementation, array covariance, and conversions between intrinsic types. @@ -553,6 +557,7 @@ Namespace Microsoft.VisualBasic.CompilerServices Return result End Function + Private Shared Function Encompasses(ByVal larger As System.Type, ByVal smaller As System.Type) As Boolean 'Definition: LARGER is said to encompass SMALLER if SMALLER widens to or is LARGER. @@ -564,6 +569,7 @@ Namespace Microsoft.VisualBasic.CompilerServices Return result = ConversionClass.Widening OrElse result = ConversionClass.Identity End Function + Private Shared Function NotEncompasses(ByVal larger As System.Type, ByVal smaller As System.Type) As Boolean 'Definition: LARGER is said to not encompass SMALLER if SMALLER narrows to or is LARGER. @@ -575,7 +581,7 @@ Namespace Microsoft.VisualBasic.CompilerServices Return result = ConversionClass.Narrowing OrElse result = ConversionClass.Identity End Function - + Private Shared Function MostEncompassing(ByVal types As List(Of System.Type)) As System.Type 'Given a set TYPES, determine the most encompassing type. An element 'CANDIDATE of TYPES is said to be most encompassing if no other element of @@ -601,7 +607,7 @@ Namespace Microsoft.VisualBasic.CompilerServices Return maxEncompassing End Function - + Private Shared Function MostEncompassed(ByVal types As List(Of System.Type)) As System.Type 'Given a set TYPES, determine the most encompassed type. An element 'CANDIDATE of TYPES is said to be most encompassed if CANDIDATE encompasses @@ -687,6 +693,7 @@ Namespace Microsoft.VisualBasic.CompilerServices operatorList.Add(operatorToInsert) End Sub + Private Shared Function ResolveConversion( ByVal targetType As System.Type, ByVal sourceType As System.Type, diff --git a/src/libraries/Microsoft.VisualBasic.Core/src/Microsoft/VisualBasic/CompilerServices/OverloadResolution.vb b/src/libraries/Microsoft.VisualBasic.Core/src/Microsoft/VisualBasic/CompilerServices/OverloadResolution.vb index 3834ba9c047d9e..0509feb047ed03 100644 --- a/src/libraries/Microsoft.VisualBasic.Core/src/Microsoft/VisualBasic/CompilerServices/OverloadResolution.vb +++ b/src/libraries/Microsoft.VisualBasic.Core/src/Microsoft/VisualBasic/CompilerServices/OverloadResolution.vb @@ -980,6 +980,7 @@ nextcandidate: Return False End Function + Private Shared Function InferTypeArgumentsFromArgument( ByVal argumentType As Type, ByVal parameterType As Type, @@ -1104,6 +1105,7 @@ RetryInference: End Function + Private Shared Function InferTypeArgumentsFromArgumentDirectly( ByVal argumentType As Type, ByVal parameterType As Type, @@ -1296,6 +1298,7 @@ RetryInference: End Function + Friend Shared Function InferTypeArgumentsFromArgument( ByVal targetProcedure As Method, ByVal argument As Object, @@ -1839,6 +1842,7 @@ skipargument: Return End Sub + Private Shared Function InferTypeArguments( ByVal targetProcedure As Method, ByVal arguments As Object(), diff --git a/src/libraries/Microsoft.VisualBasic.Core/src/Microsoft/VisualBasic/CompilerServices/Symbols.vb b/src/libraries/Microsoft.VisualBasic.Core/src/Microsoft/VisualBasic/CompilerServices/Symbols.vb index 7648af1bb21f7d..2aa78071af6e60 100644 --- a/src/libraries/Microsoft.VisualBasic.Core/src/Microsoft/VisualBasic/CompilerServices/Symbols.vb +++ b/src/libraries/Microsoft.VisualBasic.Core/src/Microsoft/VisualBasic/CompilerServices/Symbols.vb @@ -424,6 +424,8 @@ Namespace Microsoft.VisualBasic.CompilerServices Return False End Function #End If + Friend Shared Function [Implements](ByVal implementor As System.Type, ByVal [interface] As System.Type) As Boolean Debug.Assert(Not IsInterface(implementor), "interfaces can't implement, so why call this?") @@ -439,6 +441,8 @@ Namespace Microsoft.VisualBasic.CompilerServices End Function + Friend Shared Function IsOrInheritsFrom(ByVal derived As System.Type, ByVal base As System.Type) As Boolean Debug.Assert((Not derived.IsByRef) AndAlso (Not derived.IsPointer)) Debug.Assert((Not base.IsByRef) AndAlso (Not base.IsPointer)) @@ -514,7 +518,7 @@ Namespace Microsoft.VisualBasic.CompilerServices Return type.GetGenericArguments End Function - Friend Shared Function GetInterfaceConstraints(ByVal genericParameter As Type) As Type() + Friend Shared Function GetInterfaceConstraints( ByVal genericParameter As Type) As Type() 'Returns the interface constraints for the type parameter. Debug.Assert(IsGenericParameter(genericParameter), "expected type parameter") Return System.Linq.Enumerable.ToArray(genericParameter.GetInterfaces) diff --git a/src/libraries/System.Linq.Expressions/src/System/Dynamic/Utils/TypeUtils.cs b/src/libraries/System.Linq.Expressions/src/System/Dynamic/Utils/TypeUtils.cs index da000c59da6fea..afa81a14932b81 100644 --- a/src/libraries/System.Linq.Expressions/src/System/Dynamic/Utils/TypeUtils.cs +++ b/src/libraries/System.Linq.Expressions/src/System/Dynamic/Utils/TypeUtils.cs @@ -208,7 +208,14 @@ public static bool IsValidInstanceType(MemberInfo member, Type instanceType) // been boxed or not. if (targetType.IsInterface) { - foreach (Type interfaceType in instanceType.GetInterfaces()) + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2070:UnrecognizedReflectionPattern", + Justification = "The targetType must be preserved (since we have an instance of it here)," + + "So if it's an interface that interface will be preserved everywhere" + + "So if it was implemented by the instanceType, it will be kept even after trimming." + + "The fact that GetInterfaces may return fewer interfaces doesn't matter as long" + + "as it returns the one we're looking for.")] + static Type[] GetTypeInterfaces(Type instanceType) => instanceType.GetInterfaces(); + foreach (Type interfaceType in GetTypeInterfaces(instanceType)) { if (AreReferenceAssignable(targetType, interfaceType)) { @@ -799,6 +806,9 @@ private static bool IsImplicitNullableConversion(Type source, Type destination) public static Type? FindGenericType(Type definition, Type? type) { + // For now this helper doesn't support interfaces + Debug.Assert(!definition.IsInterface); + while (type is not null && type != typeof(object)) { if (type.IsConstructedGenericType && AreEquivalent(type.GetGenericTypeDefinition(), definition)) @@ -806,18 +816,6 @@ private static bool IsImplicitNullableConversion(Type source, Type destination) return type; } - if (definition.IsInterface) - { - foreach (Type itype in type.GetInterfaces()) - { - Type? found = FindGenericType(definition, itype); - if (found != null) - { - return found; - } - } - } - type = type.BaseType; } diff --git a/src/libraries/System.Linq.Queryable/src/System/Linq/EnumerableRewriter.cs b/src/libraries/System.Linq.Queryable/src/System/Linq/EnumerableRewriter.cs index 081862b53d8036..ad489f768ec11c 100644 --- a/src/libraries/System.Linq.Queryable/src/System/Linq/EnumerableRewriter.cs +++ b/src/libraries/System.Linq.Queryable/src/System/Linq/EnumerableRewriter.cs @@ -127,18 +127,45 @@ private static Type GetPublicType(Type t) // we cannot use the expression tree in a context which has only execution // permissions. We should endeavour to translate constants into // new constants which have public types. - if (t.IsGenericType && t.GetGenericTypeDefinition().GetInterfaces().Contains(typeof(IGrouping<,>))) + if (t.IsGenericType && ImplementsIGrouping(t)) return typeof(IGrouping<,>).MakeGenericType(t.GetGenericArguments()); if (!t.IsNestedPrivate) return t; - foreach (Type iType in t.GetInterfaces()) - { - if (iType.IsGenericType && iType.GetGenericTypeDefinition() == typeof(IEnumerable<>)) - return iType; - } + if (TryGetImplementedIEnumerable(t, out Type? enumerableOfTType)) + return enumerableOfTType; if (typeof(IEnumerable).IsAssignableFrom(t)) return typeof(IEnumerable); return t; + + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2075:UnrecognizedReflectionPattern", + Justification = "The IGrouping<,> is kept since it's directly referenced here" + + "and so it will also be preserved in all places where it's implemented." + + "The GetInterfaces may return less after trimming but it will include" + + "the IGrouping<,> if it was there before trimming, which is enough for this" + + "method to work.")] + static bool ImplementsIGrouping(Type type) => + type.GetGenericTypeDefinition().GetInterfaces().Contains(typeof(IGrouping<,>)); + + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2070:UnrecognizedReflectionPattern", + Justification = "The IEnumerable<> is kept since it's directly referenced here" + + "and so it will also be preserved in all places where it's implemented." + + "The GetInterfaces may return less after trimming but it will include" + + "the IEnumerable<> if it was there before trimming, which is enough for this" + + "method to work.")] + static bool TryGetImplementedIEnumerable(Type type, [NotNullWhen(true)] out Type? interfaceType) + { + foreach (Type iType in type.GetInterfaces()) + { + if (iType.IsGenericType && iType.GetGenericTypeDefinition() == typeof(IEnumerable<>)) + { + interfaceType = iType; + return true; + } + } + + interfaceType = null; + return false; + } } private Type GetEquivalentType(Type type) @@ -172,26 +199,38 @@ private Type GetEquivalentType(Type type) } if (equiv == null) { - var interfacesWithInfo = pubType.GetInterfaces(); - var singleTypeGenInterfacesWithGetType = interfacesWithInfo - .Where(i => i.IsGenericType && i.GenericTypeArguments.Length == 1) - .Select(i => new { Info = i, GenType = i.GetGenericTypeDefinition() }) - .ToArray(); - Type? typeArg = singleTypeGenInterfacesWithGetType - .Where(i => i.GenType == typeof(IOrderedQueryable<>) || i.GenType == typeof(IOrderedEnumerable<>)) - .Select(i => i.Info.GenericTypeArguments[0]) - .Distinct() - .SingleOrDefault(); - if (typeArg != null) - equiv = typeof(IOrderedEnumerable<>).MakeGenericType(typeArg); - else + equiv = GetEquivalentTypeToEnumerables(pubType); + + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2070:UnrecognizedReflectionPattern", + Justification = "The enumerable interface type (IOrderedQueryable<>, IOrderedEnumerable<>, IQueryable<> and IEnumerable<>) " + + "is kept since it's directly referenced here" + + "and so it will also be preserved in all places where it's implemented." + + "The GetInterfaces may return less after trimming but it will include" + + "the enumerable interface type if it was there before trimming, which is enough for this" + + "method to work.")] + static Type GetEquivalentTypeToEnumerables(Type sourceType) { - typeArg = singleTypeGenInterfacesWithGetType - .Where(i => i.GenType == typeof(IQueryable<>) || i.GenType == typeof(IEnumerable<>)) + var interfacesWithInfo = sourceType.GetInterfaces(); + var singleTypeGenInterfacesWithGetType = interfacesWithInfo + .Where(i => i.IsGenericType && i.GenericTypeArguments.Length == 1) + .Select(i => new { Info = i, GenType = i.GetGenericTypeDefinition() }) + .ToArray(); + Type? typeArg = singleTypeGenInterfacesWithGetType + .Where(i => i.GenType == typeof(IOrderedQueryable<>) || i.GenType == typeof(IOrderedEnumerable<>)) .Select(i => i.Info.GenericTypeArguments[0]) .Distinct() - .Single(); - equiv = typeof(IEnumerable<>).MakeGenericType(typeArg); + .SingleOrDefault(); + if (typeArg != null) + return typeof(IOrderedEnumerable<>).MakeGenericType(typeArg); + else + { + typeArg = singleTypeGenInterfacesWithGetType + .Where(i => i.GenType == typeof(IQueryable<>) || i.GenType == typeof(IEnumerable<>)) + .Select(i => i.Info.GenericTypeArguments[0]) + .Distinct() + .Single(); + return typeof(IEnumerable<>).MakeGenericType(typeArg); + } } } _equivalentTypeCache.Add(type, equiv); diff --git a/src/libraries/System.Linq.Queryable/src/System/Linq/TypeHelper.cs b/src/libraries/System.Linq.Queryable/src/System/Linq/TypeHelper.cs index 64ef0c4201d676..fd12880c912db0 100644 --- a/src/libraries/System.Linq.Queryable/src/System/Linq/TypeHelper.cs +++ b/src/libraries/System.Linq.Queryable/src/System/Linq/TypeHelper.cs @@ -1,10 +1,18 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Diagnostics.CodeAnalysis; + namespace System.Linq { internal static class TypeHelper { + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2070:RequiresUnreferencedCode", + Justification = "GetInterfaces is only called if 'definition' is interface type. " + + "In that case though the interface must be present (otherwise the Type of it could not exist) " + + "which also means that the trimmer kept the interface and thus kept it on all types " + + "which implement it. It doesn't matter if the GetInterfaces call below returns fewer types" + + "as long as it returns the 'definition' as well.")] internal static Type? FindGenericType(Type definition, Type type) { bool? definitionIsInterface = null; diff --git a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/TraceLogging/Statics.cs b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/TraceLogging/Statics.cs index 66e3a0b3729b4f..a92f4434e913d2 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/TraceLogging/Statics.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/TraceLogging/Statics.cs @@ -358,7 +358,11 @@ public static bool HasCustomAttribute( return result; } - public static Type? FindEnumerableElementType(Type type) + public static Type? FindEnumerableElementType( +#if !ES_BUILD_STANDALONE + [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] + Type type) +#endif { Type? elementType = null; diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/SignatureType.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/SignatureType.cs index a4e1b3862e79c8..dcedcdf0853c7d 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/SignatureType.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/SignatureType.cs @@ -79,6 +79,7 @@ public sealed override Type MakeArrayType(int rank) public sealed override Type ReflectedType => throw new NotSupportedException(SR.NotSupported_SignatureType); public sealed override Type BaseType => throw new NotSupportedException(SR.NotSupported_SignatureType); + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public sealed override Type[] GetInterfaces() => throw new NotSupportedException(SR.NotSupported_SignatureType); public sealed override bool IsAssignableFrom([NotNullWhen(true)] Type? c) => throw new NotSupportedException(SR.NotSupported_SignatureType); public sealed override int MetadataToken => throw new NotSupportedException(SR.NotSupported_SignatureType); @@ -165,6 +166,8 @@ public sealed override Type MakeArrayType(int rank) public sealed override object[] GetCustomAttributes(Type attributeType, bool inherit) => throw new NotSupportedException(SR.NotSupported_SignatureType); public sealed override bool IsDefined(Type attributeType, bool inherit) => throw new NotSupportedException(SR.NotSupported_SignatureType); public sealed override IList GetCustomAttributesData() => throw new NotSupportedException(SR.NotSupported_SignatureType); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public sealed override Type GetInterface(string name, bool ignoreCase) => throw new NotSupportedException(SR.NotSupported_SignatureType); [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] @@ -173,7 +176,10 @@ public sealed override Type MakeArrayType(int rank) protected sealed override bool IsCOMObjectImpl() => throw new NotSupportedException(SR.NotSupported_SignatureType); protected sealed override bool IsPrimitiveImpl() => throw new NotSupportedException(SR.NotSupported_SignatureType); public sealed override IEnumerable CustomAttributes => throw new NotSupportedException(SR.NotSupported_SignatureType); + + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public sealed override Type[] FindInterfaces(TypeFilter filter, object? filterCriteria) => throw new NotSupportedException(SR.NotSupported_SignatureType); + public sealed override InterfaceMapping GetInterfaceMap(Type interfaceType) => throw new NotSupportedException(SR.NotSupported_SignatureType); protected sealed override bool IsContextfulImpl() => throw new NotSupportedException(SR.NotSupported_SignatureType); public sealed override bool IsEnum => throw new NotSupportedException(SR.NotSupported_SignatureType); diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/TypeDelegator.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/TypeDelegator.cs index 584206f4d48796..5e46dc60bcbe12 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/TypeDelegator.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/TypeDelegator.cs @@ -85,8 +85,10 @@ public TypeDelegator([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes. [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields)] public override FieldInfo[] GetFields(BindingFlags bindingAttr) => typeImpl.GetFields(bindingAttr); + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type? GetInterface(string name, bool ignoreCase) => typeImpl.GetInterface(name, ignoreCase); + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type[] GetInterfaces() => typeImpl.GetInterfaces(); [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicEvents | DynamicallyAccessedMemberTypes.NonPublicEvents)] diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/TypeInfo.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/TypeInfo.cs index 41591aedfcb675..7164e969db16b5 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/TypeInfo.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/TypeInfo.cs @@ -98,7 +98,11 @@ public virtual IEnumerable DeclaredProperties get => GetProperties(TypeInfo.DeclaredOnlyLookup); } - public virtual IEnumerable ImplementedInterfaces => GetInterfaces(); + public virtual IEnumerable ImplementedInterfaces + { + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] + get => GetInterfaces(); + } // a re-implementation of ISAF from Type, skipping the use of UnderlyingType public virtual bool IsAssignableFrom([NotNullWhen(true)] TypeInfo? typeInfo) diff --git a/src/libraries/System.Private.CoreLib/src/System/Type.Helpers.cs b/src/libraries/System.Private.CoreLib/src/System/Type.Helpers.cs index dea4b7db036300..0e5140fef7f477 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Type.Helpers.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Type.Helpers.cs @@ -114,6 +114,7 @@ public bool IsVisible } } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public virtual Type[] FindInterfaces(TypeFilter filter, object? filterCriteria) { if (filter == null) @@ -368,6 +369,10 @@ public virtual bool IsAssignableFrom([NotNullWhen(true)] Type? c) return false; } + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2085:UnrecognizedReflectionPattern", + Justification = "The GetInterfaces technically requires all interfaces to be preserved" + + "But this method only compares the result against the passed in ifaceType." + + "So if ifaceType exists, then trimming should have kept it implemented on any type.")] internal bool ImplementInterface(Type ifaceType) { Type? t = this; diff --git a/src/libraries/System.Private.CoreLib/src/System/Type.cs b/src/libraries/System.Private.CoreLib/src/System/Type.cs index b04a56281833d3..73b2a060491134 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Type.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Type.cs @@ -463,8 +463,11 @@ protected virtual TypeCode GetTypeCodeImpl() [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] public abstract object? InvokeMember(string name, BindingFlags invokeAttr, Binder? binder, object? target, object?[]? args, ParameterModifier[]? modifiers, CultureInfo? culture, string[]? namedParameters); + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public Type? GetInterface(string name) => GetInterface(name, ignoreCase: false); + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public abstract Type? GetInterface(string name, bool ignoreCase); + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public abstract Type[] GetInterfaces(); public virtual InterfaceMapping GetInterfaceMap(Type interfaceType) => throw new NotSupportedException(SR.NotSupported_SubclassOverride); diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ClassDataContract.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ClassDataContract.cs index 410ca8825098ee..d1d6ce23a85a12 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ClassDataContract.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/ClassDataContract.cs @@ -361,7 +361,7 @@ private static bool IsArraySegment(Type t) /// Safe - does not let caller influence isNonAttributedType calculation; no harm in leaking value /// internal static bool IsNonAttributedTypeValidForSerialization( - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.Interfaces)] Type type) { if (type.IsArray) @@ -1192,7 +1192,7 @@ private XmlQualifiedName GetStableNameAndSetHasDataContract(Type type) /// Safe - does not let caller influence isNonAttributedType calculation; no harm in leaking value /// private void SetIsNonAttributedType( - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.Interfaces)] Type type) { _isNonAttributedType = !type.IsSerializable && !_hasDataContract && IsNonAttributedTypeValidForSerialization(type); diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/CodeGenerator.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/CodeGenerator.cs index c5be96f6005778..1cfc496f6a0d7e 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/CodeGenerator.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/CodeGenerator.cs @@ -53,6 +53,10 @@ internal static bool IsNullableGenericType(Type type) return type.Name == "Nullable`1"; } +#if DEBUG + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2070:UnrecognizedReflectionPattern", + Justification = "Debug only code, we don't ship debug binaries.")] +#endif internal static void AssertHasInterface(Type type, Type iType) { #if DEBUG diff --git a/src/libraries/System.Reflection.TypeExtensions/ref/System.Reflection.TypeExtensions.cs b/src/libraries/System.Reflection.TypeExtensions/ref/System.Reflection.TypeExtensions.cs index 1403155e4808f6..8ee819c904230c 100644 --- a/src/libraries/System.Reflection.TypeExtensions/ref/System.Reflection.TypeExtensions.cs +++ b/src/libraries/System.Reflection.TypeExtensions/ref/System.Reflection.TypeExtensions.cs @@ -61,7 +61,7 @@ public static partial class TypeExtensions public static System.Reflection.FieldInfo[] GetFields([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields)] this System.Type type) { throw null; } public static System.Reflection.FieldInfo[] GetFields([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields)] this System.Type type, System.Reflection.BindingFlags bindingAttr) { throw null; } public static System.Type[] GetGenericArguments(this System.Type type) { throw null; } - public static System.Type[] GetInterfaces(this System.Type type) { throw null; } + public static System.Type[] GetInterfaces([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] this System.Type type) { throw null; } public static System.Reflection.MemberInfo[] GetMember([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicEvents | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicNestedTypes | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)] this System.Type type, string name) { throw null; } public static System.Reflection.MemberInfo[] GetMember([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)] this System.Type type, string name, System.Reflection.BindingFlags bindingAttr) { throw null; } public static System.Reflection.MemberInfo[] GetMembers([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicEvents | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicNestedTypes | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)] this System.Type type) { throw null; } diff --git a/src/libraries/System.Reflection.TypeExtensions/src/System/Reflection/TypeExtensions.cs b/src/libraries/System.Reflection.TypeExtensions/src/System/Reflection/TypeExtensions.cs index be5169d1dc7d34..3e3b6ca2961c39 100644 --- a/src/libraries/System.Reflection.TypeExtensions/src/System/Reflection/TypeExtensions.cs +++ b/src/libraries/System.Reflection.TypeExtensions/src/System/Reflection/TypeExtensions.cs @@ -113,7 +113,8 @@ public static Type[] GetGenericArguments(this Type type) return type.GetGenericArguments(); } - public static Type[] GetInterfaces(this Type type) + public static Type[] GetInterfaces( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] this Type type) { Requires.NotNull(type, nameof(type)); return type.GetInterfaces(); diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Collection/IEnumerableConverterFactoryHelpers.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Collection/IEnumerableConverterFactoryHelpers.cs index 52553806172fbe..c434444f5ab7bd 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Collection/IEnumerableConverterFactoryHelpers.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Collection/IEnumerableConverterFactoryHelpers.cs @@ -70,6 +70,11 @@ internal static class IEnumerableConverterFactoryHelpers return null; } + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2070:UnrecognizedReflectionPattern", + Justification = "The 'interfaceType' must exist and so trimmer kept it. In which case " + + "It also kept it on any type which implements it. The below call to GetInterfaces " + + "may return fewer results when trimmed but it will return the 'interfaceType' " + + "if the type implemented it, even after trimming.")] internal static Type? GetCompatibleGenericInterface(this Type type, Type interfaceType) { Debug.Assert(interfaceType.IsGenericType); diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/DerivedTypes.Mono.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/DerivedTypes.Mono.cs index fe62ba0df66b43..1a859e55d9e429 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/DerivedTypes.Mono.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/DerivedTypes.Mono.cs @@ -228,11 +228,13 @@ public override FieldInfo[] GetFields(BindingFlags bindingAttr) throw new NotSupportedException(SR.NotSupported_NonReflectedType); } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type GetInterface(string name, bool ignoreCase) { throw new NotSupportedException(SR.NotSupported_NonReflectedType); } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type[] GetInterfaces() { throw new NotSupportedException(SR.NotSupported_NonReflectedType); diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.Mono.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.Mono.cs index 125ef1c424ac3d..29b1d71ab4ebdc 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.Mono.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.Mono.cs @@ -290,6 +290,7 @@ public override FieldInfo[] GetFields(BindingFlags bindingAttr) return _tb.GetFields(bindingAttr); } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type? GetInterface(string name, bool ignoreCase) { return _tb.GetInterface(name, ignoreCase); @@ -301,6 +302,7 @@ public override InterfaceMapping GetInterfaceMap(Type interfaceType) return _tb.GetInterfaceMap(interfaceType); } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type[] GetInterfaces() { return _tb.GetInterfaces(); diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/GenericTypeParameterBuilder.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/GenericTypeParameterBuilder.cs index 9b33a0f32d428b..37ce00a7b84557 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/GenericTypeParameterBuilder.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/GenericTypeParameterBuilder.cs @@ -149,11 +149,13 @@ public override FieldInfo[] GetFields(BindingFlags bindingAttr) throw not_supported(); } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type GetInterface(string name, bool ignoreCase) { throw not_supported(); } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type[] GetInterfaces() { throw not_supported(); diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.Mono.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.Mono.cs index 521ab8b11c7dac..7a751bf0074bdb 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.Mono.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.Mono.cs @@ -1083,12 +1083,14 @@ public override FieldInfo[] GetFields(BindingFlags bindingAttr) return created!.GetFields(bindingAttr); } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type? GetInterface(string name, bool ignoreCase) { check_created(); return created!.GetInterface(name, ignoreCase); } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type[] GetInterfaces() { if (is_created) diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilderInstantiation.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilderInstantiation.cs index 951b3715008c24..7e9303b4f83489 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilderInstantiation.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilderInstantiation.cs @@ -164,6 +164,7 @@ public override Type? BaseType get { return generic_type.BaseType; } } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type[] GetInterfaces() { throw new NotSupportedException(); @@ -439,6 +440,7 @@ protected override TypeAttributes GetAttributeFlagsImpl() } //stuff that throws + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type GetInterface(string name, bool ignoreCase) { throw new NotSupportedException(); diff --git a/src/mono/System.Private.CoreLib/src/System/RuntimeType.Mono.cs b/src/mono/System.Private.CoreLib/src/System/RuntimeType.Mono.cs index 87e1ff36fba4dd..06a3bbef207bc5 100644 --- a/src/mono/System.Private.CoreLib/src/System/RuntimeType.Mono.cs +++ b/src/mono/System.Private.CoreLib/src/System/RuntimeType.Mono.cs @@ -961,6 +961,7 @@ public override MemberInfo[] GetMembers(BindingFlags bindingAttr) return match; } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type? GetInterface(string fullname, bool ignoreCase) { if (fullname == null) throw new ArgumentNullException(nameof(fullname)); @@ -2023,6 +2024,7 @@ private RuntimeEventInfo[] GetEvents_internal(string? name, MemberListType listT } } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] [MethodImplAttribute(MethodImplOptions.InternalCall)] public extern override Type[] GetInterfaces(); From b0eda4cf40d9a7c651b3a5a6008589e0a96e9707 Mon Sep 17 00:00:00 2001 From: vitek-karas Date: Fri, 7 May 2021 13:55:49 -0700 Subject: [PATCH 2/8] Fix build --- .../src/System/Diagnostics/Tracing/TraceLogging/Statics.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/TraceLogging/Statics.cs b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/TraceLogging/Statics.cs index a92f4434e913d2..68b350ce5b415e 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/TraceLogging/Statics.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/TraceLogging/Statics.cs @@ -361,8 +361,8 @@ public static bool HasCustomAttribute( public static Type? FindEnumerableElementType( #if !ES_BUILD_STANDALONE [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] - Type type) #endif + Type type) { Type? elementType = null; From 3c62154eba161b3e32051b3e3483013a2b54501d Mon Sep 17 00:00:00 2001 From: vitek-karas Date: Mon, 10 May 2021 04:05:44 -0700 Subject: [PATCH 3/8] Merge with main and fix warnings in OOB packages --- .../src/ILLink/ILLink.Suppressions.xml | 6 ++++ .../src/Microsoft.Extensions.Options.csproj | 1 + .../src/OptionsServiceCollectionExtensions.cs | 12 ++++++- .../src/ILLink/ILLink.Suppressions.xml | 24 +++++++++++++ .../src/ILLink/ILLink.Suppressions.xml | 36 +++++++++++++++++++ 5 files changed, 78 insertions(+), 1 deletion(-) diff --git a/src/libraries/Microsoft.Extensions.Configuration.Binder/src/ILLink/ILLink.Suppressions.xml b/src/libraries/Microsoft.Extensions.Configuration.Binder/src/ILLink/ILLink.Suppressions.xml index 0413d59c98bee5..6009aeac36e38b 100644 --- a/src/libraries/Microsoft.Extensions.Configuration.Binder/src/ILLink/ILLink.Suppressions.xml +++ b/src/libraries/Microsoft.Extensions.Configuration.Binder/src/ILLink/ILLink.Suppressions.xml @@ -43,5 +43,11 @@ member M:Microsoft.Extensions.Configuration.ConfigurationBinder.GetAllProperties(System.Type) + + ILLink + IL2070 + member + M:Microsoft.Extensions.Configuration.ConfigurationBinder.FindOpenGenericInterface(System.Type,System.Type) + \ No newline at end of file diff --git a/src/libraries/Microsoft.Extensions.Options/src/Microsoft.Extensions.Options.csproj b/src/libraries/Microsoft.Extensions.Options/src/Microsoft.Extensions.Options.csproj index 5ccbc14abaf738..04dd8ce5f15001 100644 --- a/src/libraries/Microsoft.Extensions.Options/src/Microsoft.Extensions.Options.csproj +++ b/src/libraries/Microsoft.Extensions.Options/src/Microsoft.Extensions.Options.csproj @@ -10,6 +10,7 @@ + diff --git a/src/libraries/Microsoft.Extensions.Options/src/OptionsServiceCollectionExtensions.cs b/src/libraries/Microsoft.Extensions.Options/src/OptionsServiceCollectionExtensions.cs index cfba9735907444..52322b9e782ae2 100644 --- a/src/libraries/Microsoft.Extensions.Options/src/OptionsServiceCollectionExtensions.cs +++ b/src/libraries/Microsoft.Extensions.Options/src/OptionsServiceCollectionExtensions.cs @@ -146,7 +146,7 @@ public static IServiceCollection PostConfigureAll(this IServiceCollect private static IEnumerable FindConfigurationServices(Type type) { - foreach (Type t in type.GetInterfaces()) + foreach (Type t in GetInterfacesOnType(type)) { if (t.IsGenericType) { @@ -159,6 +159,16 @@ private static IEnumerable FindConfigurationServices(Type type) } } } + + // Extracted the suppression to a local function as trimmer currently doesn't handle suppressions + // on iterator methods correctly. + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2070:UnrecognizedReflectionPattern", + Justification="This method only looks for interfaces referenced in its code. " + + "The trimmer will keep the interface and thus all of its implementations in that case. " + + "The call to GetInterfaces may return less results in trimmed apps, but it will " + + "include the interfaces this method looks for if they should be there.")] + static Type[] GetInterfacesOnType (Type t) + => t.GetInterfaces(); } private static void ThrowNoConfigServices(Type type) => diff --git a/src/libraries/System.Reflection.Context/src/ILLink/ILLink.Suppressions.xml b/src/libraries/System.Reflection.Context/src/ILLink/ILLink.Suppressions.xml index fcc5ffec66966e..4836a8a6b86ab6 100644 --- a/src/libraries/System.Reflection.Context/src/ILLink/ILLink.Suppressions.xml +++ b/src/libraries/System.Reflection.Context/src/ILLink/ILLink.Suppressions.xml @@ -451,5 +451,29 @@ member M:System.Reflection.Context.Delegation.DelegatingType.InvokeMember(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Object,System.Object[],System.Reflection.ParameterModifier[],System.Globalization.CultureInfo,System.String[]) + + ILLink + IL2080 + member + M:System.Reflection.Context.Delegation.DelegatingType.GetInterface(System.String,System.Boolean) + + + ILLink + IL2080 + member + M:System.Reflection.Context.Delegation.DelegatingType.GetInterfaces + + + ILLink + IL2094 + member + M:System.Reflection.Context.Delegation.DelegatingType.GetInterface(System.String,System.Boolean) + + + ILLink + IL2094 + member + M:System.Reflection.Context.Delegation.DelegatingType.GetInterfaces + \ No newline at end of file diff --git a/src/libraries/System.Reflection.MetadataLoadContext/src/ILLink/ILLink.Suppressions.xml b/src/libraries/System.Reflection.MetadataLoadContext/src/ILLink/ILLink.Suppressions.xml index e0d7871104af94..c7a90332ca8977 100644 --- a/src/libraries/System.Reflection.MetadataLoadContext/src/ILLink/ILLink.Suppressions.xml +++ b/src/libraries/System.Reflection.MetadataLoadContext/src/ILLink/ILLink.Suppressions.xml @@ -373,5 +373,41 @@ member M:System.Reflection.Runtime.BindingFlagSupport.PropertyPolicies.GetDeclaredMembers(System.Reflection.TypeInfo) + + ILLink + IL2070 + member + M:System.Reflection.TypeLoading.Assignability.CanCastArrayToInterface(System.Type,System.Type,System.Reflection.TypeLoading.CoreTypes) + + + ILLink + IL2070 + member + M:System.Reflection.TypeLoading.Assignability.CanCastTo(System.Type,System.Type,System.Reflection.TypeLoading.CoreTypes) + + + ILLink + IL2085 + member + M:System.Reflection.TypeLoading.RoType.GetInterface(System.String,System.Boolean) + + + ILLink + IL2094 + member + M:System.Reflection.TypeLoading.RoType.get_ImplementedInterfaces + + + ILLink + IL2094 + member + M:System.Reflection.TypeLoading.RoType.GetInterface(System.String,System.Boolean) + + + ILLink + IL2094 + member + M:System.Reflection.TypeLoading.RoType.GetInterfaces + \ No newline at end of file From 748a107820b3ed8d745d6fb7cabb2ee04bde4d85 Mon Sep 17 00:00:00 2001 From: vitek-karas Date: Mon, 10 May 2021 11:34:04 -0700 Subject: [PATCH 4/8] PR feedback --- .../src/OptionsServiceCollectionExtensions.cs | 2 +- .../src/System/Xml/Serialization/CodeGenerator.cs | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/libraries/Microsoft.Extensions.Options/src/OptionsServiceCollectionExtensions.cs b/src/libraries/Microsoft.Extensions.Options/src/OptionsServiceCollectionExtensions.cs index 52322b9e782ae2..a84cbe19e1fa6f 100644 --- a/src/libraries/Microsoft.Extensions.Options/src/OptionsServiceCollectionExtensions.cs +++ b/src/libraries/Microsoft.Extensions.Options/src/OptionsServiceCollectionExtensions.cs @@ -167,7 +167,7 @@ private static IEnumerable FindConfigurationServices(Type type) "The trimmer will keep the interface and thus all of its implementations in that case. " + "The call to GetInterfaces may return less results in trimmed apps, but it will " + "include the interfaces this method looks for if they should be there.")] - static Type[] GetInterfacesOnType (Type t) + static Type[] GetInterfacesOnType(Type t) => t.GetInterfaces(); } diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/CodeGenerator.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/CodeGenerator.cs index 1cfc496f6a0d7e..ecd33f31633241 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/CodeGenerator.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/CodeGenerator.cs @@ -53,13 +53,11 @@ internal static bool IsNullableGenericType(Type type) return type.Name == "Nullable`1"; } -#if DEBUG + [Conditional("DEBUG")] [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2070:UnrecognizedReflectionPattern", Justification = "Debug only code, we don't ship debug binaries.")] -#endif internal static void AssertHasInterface(Type type, Type iType) { -#if DEBUG Debug.Assert(iType.IsInterface); foreach (Type iFace in type.GetInterfaces()) { @@ -67,7 +65,6 @@ internal static void AssertHasInterface(Type type, Type iType) return; } Debug.Fail("Interface not found"); -#endif } internal void BeginMethod(Type returnType, string methodName, Type[] argTypes, string[] argNames, MethodAttributes methodAttributes) From 702bed00842a5c45e90c6fcc45d6fc804e3635f4 Mon Sep 17 00:00:00 2001 From: vitek-karas Date: Tue, 11 May 2021 02:32:35 -0700 Subject: [PATCH 5/8] Fix ref assemblies --- .../System.Reflection.Emit/ref/System.Reflection.Emit.cs | 6 ++++++ src/libraries/System.Runtime/ref/System.Runtime.cs | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/src/libraries/System.Reflection.Emit/ref/System.Reflection.Emit.cs b/src/libraries/System.Reflection.Emit/ref/System.Reflection.Emit.cs index 3cd9b07c839f3b..a8833188df8fb2 100644 --- a/src/libraries/System.Reflection.Emit/ref/System.Reflection.Emit.cs +++ b/src/libraries/System.Reflection.Emit/ref/System.Reflection.Emit.cs @@ -127,8 +127,10 @@ internal EnumBuilder() { } public override System.Reflection.FieldInfo? GetField(string name, System.Reflection.BindingFlags bindingAttr) { throw null; } [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields)] public override System.Reflection.FieldInfo[] GetFields(System.Reflection.BindingFlags bindingAttr) { throw null; } + [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] public override System.Type? GetInterface(string name, bool ignoreCase) { throw null; } public override System.Reflection.InterfaceMapping GetInterfaceMap(System.Type interfaceType) { throw null; } + [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] public override System.Type[] GetInterfaces() { throw null; } [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicEvents | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicNestedTypes | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicProperties | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicEvents | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicNestedTypes | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)] public override System.Reflection.MemberInfo[] GetMember(string name, System.Reflection.MemberTypes type, System.Reflection.BindingFlags bindingAttr) { throw null; } @@ -244,8 +246,10 @@ internal GenericTypeParameterBuilder() { } public override System.Type[] GetGenericArguments() { throw null; } public override System.Type GetGenericTypeDefinition() { throw null; } public override int GetHashCode() { throw null; } + [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] public override System.Type GetInterface(string name, bool ignoreCase) { throw null; } public override System.Reflection.InterfaceMapping GetInterfaceMap(System.Type interfaceType) { throw null; } + [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] public override System.Type[] GetInterfaces() { throw null; } [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicEvents | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicNestedTypes | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicProperties | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicEvents | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicNestedTypes | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)] public override System.Reflection.MemberInfo[] GetMember(string name, System.Reflection.MemberTypes type, System.Reflection.BindingFlags bindingAttr) { throw null; } @@ -517,8 +521,10 @@ public void DefineMethodOverride(System.Reflection.MethodInfo methodInfoBody, Sy public override System.Reflection.FieldInfo[] GetFields(System.Reflection.BindingFlags bindingAttr) { throw null; } public override System.Type[] GetGenericArguments() { throw null; } public override System.Type GetGenericTypeDefinition() { throw null; } + [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] public override System.Type? GetInterface(string name, bool ignoreCase) { throw null; } public override System.Reflection.InterfaceMapping GetInterfaceMap(System.Type interfaceType) { throw null; } + [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] public override System.Type[] GetInterfaces() { throw null; } [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicEvents | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicNestedTypes | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicProperties | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicEvents | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicNestedTypes | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)] public override System.Reflection.MemberInfo[] GetMember(string name, System.Reflection.MemberTypes type, System.Reflection.BindingFlags bindingAttr) { throw null; } diff --git a/src/libraries/System.Runtime/ref/System.Runtime.cs b/src/libraries/System.Runtime/ref/System.Runtime.cs index f9317e3ead8779..f7efc93a171e79 100644 --- a/src/libraries/System.Runtime/ref/System.Runtime.cs +++ b/src/libraries/System.Runtime/ref/System.Runtime.cs @@ -4435,9 +4435,12 @@ protected Type() { } public virtual System.Type[] GetGenericParameterConstraints() { throw null; } public virtual System.Type GetGenericTypeDefinition() { throw null; } public override int GetHashCode() { throw null; } + [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] public System.Type? GetInterface(string name) { throw null; } + [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] public abstract System.Type? GetInterface(string name, bool ignoreCase); public virtual System.Reflection.InterfaceMapping GetInterfaceMap(System.Type interfaceType) { throw null; } + [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] public abstract System.Type[] GetInterfaces(); [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicEvents | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicNestedTypes | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)] public System.Reflection.MemberInfo[] GetMember(string name) { throw null; } @@ -9028,8 +9031,10 @@ public TypeDelegator([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers public override System.Reflection.FieldInfo? GetField(string name, System.Reflection.BindingFlags bindingAttr) { throw null; } [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields)] public override System.Reflection.FieldInfo[] GetFields(System.Reflection.BindingFlags bindingAttr) { throw null; } + [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] public override System.Type? GetInterface(string name, bool ignoreCase) { throw null; } public override System.Reflection.InterfaceMapping GetInterfaceMap(System.Type interfaceType) { throw null; } + [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] public override System.Type[] GetInterfaces() { throw null; } [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicEvents | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicNestedTypes | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicProperties | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicEvents | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicNestedTypes | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)] public override System.Reflection.MemberInfo[] GetMember(string name, System.Reflection.MemberTypes type, System.Reflection.BindingFlags bindingAttr) { throw null; } From 379f848ff08d1fbb2467096a0aa1e68a95d1ab81 Mon Sep 17 00:00:00 2001 From: vitek-karas Date: Tue, 11 May 2021 11:59:18 -0700 Subject: [PATCH 6/8] Fix ref assemblies --- src/libraries/System.Runtime/ref/System.Runtime.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libraries/System.Runtime/ref/System.Runtime.cs b/src/libraries/System.Runtime/ref/System.Runtime.cs index f7efc93a171e79..6d5f6e6848bebb 100644 --- a/src/libraries/System.Runtime/ref/System.Runtime.cs +++ b/src/libraries/System.Runtime/ref/System.Runtime.cs @@ -4389,6 +4389,7 @@ protected Type() { } public abstract System.Type UnderlyingSystemType { get; } public override bool Equals(object? o) { throw null; } public virtual bool Equals(System.Type? o) { throw null; } + [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] public virtual System.Type[] FindInterfaces(System.Reflection.TypeFilter filter, object? filterCriteria) { throw null; } [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)] public virtual System.Reflection.MemberInfo[] FindMembers(System.Reflection.MemberTypes memberType, System.Reflection.BindingFlags bindingAttr, System.Reflection.MemberFilter? filter, object? filterCriteria) { throw null; } @@ -9076,7 +9077,7 @@ protected TypeInfo() { } public virtual System.Collections.Generic.IEnumerable DeclaredNestedTypes { [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicNestedTypes | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicNestedTypes)] get { throw null; } } public virtual System.Collections.Generic.IEnumerable DeclaredProperties { [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicProperties | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)] get { throw null; } } public virtual System.Type[] GenericTypeParameters { get { throw null; } } - public virtual System.Collections.Generic.IEnumerable ImplementedInterfaces { get { throw null; } } + public virtual System.Collections.Generic.IEnumerable ImplementedInterfaces { [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] get { throw null; } } public virtual System.Type AsType() { throw null; } [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicEvents | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicEvents)] public virtual System.Reflection.EventInfo? GetDeclaredEvent(string name) { throw null; } From 1b7bf614bdd7c04093a1c24844f1635ebb00ee58 Mon Sep 17 00:00:00 2001 From: vitek-karas Date: Tue, 11 May 2021 14:32:12 -0700 Subject: [PATCH 7/8] Annotate return value of GetInterface with Interfaces. The Interfaces annotation is transitive (by definition), so once it applies to a Type it also applies to all the interfaces implemented by that type. --- .../src/System/Reflection/Emit/EnumBuilder.cs | 1 + .../System/Reflection/Emit/GenericTypeParameterBuilder.cs | 3 +++ .../src/System/Reflection/Emit/SymbolType.cs | 3 +++ .../src/System/Reflection/Emit/TypeBuilder.cs | 1 + .../src/System/Reflection/Emit/TypeBuilderInstantiation.cs | 3 +++ .../src/System/RuntimeType.CoreCLR.cs | 1 + .../src/System/Reflection/SignatureType.cs | 3 +++ .../src/System/Reflection/TypeDelegator.cs | 1 + src/libraries/System.Private.CoreLib/src/System/Type.cs | 2 ++ .../src/ILLink/ILLink.Suppressions.xml | 6 ++++++ .../System.Reflection.Emit/ref/System.Reflection.Emit.cs | 3 +++ .../src/ILLink/ILLink.Suppressions.xml | 6 ++++++ src/libraries/System.Runtime/ref/System.Runtime.cs | 3 +++ .../src/System/Reflection/Emit/DerivedTypes.Mono.cs | 1 + .../src/System/Reflection/Emit/EnumBuilder.Mono.cs | 1 + .../System/Reflection/Emit/GenericTypeParameterBuilder.cs | 3 +++ .../src/System/Reflection/Emit/TypeBuilder.Mono.cs | 1 + .../src/System/Reflection/Emit/TypeBuilderInstantiation.cs | 1 + .../System.Private.CoreLib/src/System/RuntimeType.Mono.cs | 1 + 19 files changed, 44 insertions(+) diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.cs index 6ab2e1c193e1b8..e71e2054cac2f2 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.cs @@ -138,6 +138,7 @@ public override FieldInfo[] GetFields(BindingFlags bindingAttr) } [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] + [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type? GetInterface(string name, bool ignoreCase) { return m_typeBuilder.GetInterface(name, ignoreCase); diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/GenericTypeParameterBuilder.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/GenericTypeParameterBuilder.cs index 0b47f1559b72e0..a83387ea163146 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/GenericTypeParameterBuilder.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/GenericTypeParameterBuilder.cs @@ -116,6 +116,9 @@ public override Type MakeArrayType(int rank) public override FieldInfo[] GetFields(BindingFlags bindingAttr) { throw new NotSupportedException(); } [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] + [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2063:UnrecognizedReflectionPattern", + Justification = "Linker doesn't recognize always throwing method. https://github.com/mono/linker/issues/2025")] public override Type GetInterface(string name, bool ignoreCase) { throw new NotSupportedException(); } [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/SymbolType.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/SymbolType.cs index 3e157cf2041046..472865d3fb444b 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/SymbolType.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/SymbolType.cs @@ -398,6 +398,9 @@ public override FieldInfo[] GetFields(BindingFlags bindingAttr) } [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] + [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2063:UnrecognizedReflectionPattern", + Justification = "Linker doesn't recognize always throwing method. https://github.com/mono/linker/issues/2025")] public override Type GetInterface(string name, bool ignoreCase) { throw new NotSupportedException(SR.NotSupported_NonReflectedType); diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.cs index 18098c8eae2fda..e5e8c23fd7d209 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.cs @@ -838,6 +838,7 @@ public override FieldInfo[] GetFields(BindingFlags bindingAttr) } [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] + [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type? GetInterface(string name, bool ignoreCase) { if (!IsCreated()) diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilderInstantiation.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilderInstantiation.cs index 86120cd501cdc7..6550da7d2abbcc 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilderInstantiation.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilderInstantiation.cs @@ -179,6 +179,9 @@ public override Type? BaseType public override FieldInfo[] GetFields(BindingFlags bindingAttr) { throw new NotSupportedException(); } [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] + [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2063:UnrecognizedReflectionPattern", + Justification = "Linker doesn't recognize always throwing method. https://github.com/mono/linker/issues/2025")] public override Type GetInterface(string name, bool ignoreCase) { throw new NotSupportedException(); } [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] diff --git a/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs index 480a7cc6ef6e6a..986a3b8e3c35cd 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs @@ -2917,6 +2917,7 @@ public override InterfaceMapping GetInterfaceMap(Type ifaceType) } [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] + [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type? GetInterface(string fullname, bool ignoreCase) { if (fullname is null) throw new ArgumentNullException(nameof(fullname)); diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/SignatureType.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/SignatureType.cs index dcedcdf0853c7d..fd28838ffb33b5 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/SignatureType.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/SignatureType.cs @@ -168,6 +168,9 @@ public sealed override Type MakeArrayType(int rank) public sealed override IList GetCustomAttributesData() => throw new NotSupportedException(SR.NotSupported_SignatureType); [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] + [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2063:UnrecognizedReflectionPattern", + Justification = "Linker doesn't recognize always throwing method. https://github.com/mono/linker/issues/2025")] public sealed override Type GetInterface(string name, bool ignoreCase) => throw new NotSupportedException(SR.NotSupported_SignatureType); [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/TypeDelegator.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/TypeDelegator.cs index 5e46dc60bcbe12..085d282c573b14 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/TypeDelegator.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/TypeDelegator.cs @@ -86,6 +86,7 @@ public TypeDelegator([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes. public override FieldInfo[] GetFields(BindingFlags bindingAttr) => typeImpl.GetFields(bindingAttr); [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] + [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type? GetInterface(string name, bool ignoreCase) => typeImpl.GetInterface(name, ignoreCase); [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] diff --git a/src/libraries/System.Private.CoreLib/src/System/Type.cs b/src/libraries/System.Private.CoreLib/src/System/Type.cs index 73b2a060491134..a8741da5cf5d65 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Type.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Type.cs @@ -464,8 +464,10 @@ protected virtual TypeCode GetTypeCodeImpl() public abstract object? InvokeMember(string name, BindingFlags invokeAttr, Binder? binder, object? target, object?[]? args, ParameterModifier[]? modifiers, CultureInfo? culture, string[]? namedParameters); [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] + [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public Type? GetInterface(string name) => GetInterface(name, ignoreCase: false); [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] + [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public abstract Type? GetInterface(string name, bool ignoreCase); [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public abstract Type[] GetInterfaces(); diff --git a/src/libraries/System.Reflection.Context/src/ILLink/ILLink.Suppressions.xml b/src/libraries/System.Reflection.Context/src/ILLink/ILLink.Suppressions.xml index 4836a8a6b86ab6..4369bfb7d0cb34 100644 --- a/src/libraries/System.Reflection.Context/src/ILLink/ILLink.Suppressions.xml +++ b/src/libraries/System.Reflection.Context/src/ILLink/ILLink.Suppressions.xml @@ -475,5 +475,11 @@ member M:System.Reflection.Context.Delegation.DelegatingType.GetInterfaces + + ILLink + IL2093 + member + M:System.Reflection.Context.Delegation.DelegatingType.GetInterface(System.String,System.Boolean) + \ No newline at end of file diff --git a/src/libraries/System.Reflection.Emit/ref/System.Reflection.Emit.cs b/src/libraries/System.Reflection.Emit/ref/System.Reflection.Emit.cs index a8833188df8fb2..4ac8fdb6d6a153 100644 --- a/src/libraries/System.Reflection.Emit/ref/System.Reflection.Emit.cs +++ b/src/libraries/System.Reflection.Emit/ref/System.Reflection.Emit.cs @@ -128,6 +128,7 @@ internal EnumBuilder() { } [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields)] public override System.Reflection.FieldInfo[] GetFields(System.Reflection.BindingFlags bindingAttr) { throw null; } [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] + [return: System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] public override System.Type? GetInterface(string name, bool ignoreCase) { throw null; } public override System.Reflection.InterfaceMapping GetInterfaceMap(System.Type interfaceType) { throw null; } [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] @@ -247,6 +248,7 @@ internal GenericTypeParameterBuilder() { } public override System.Type GetGenericTypeDefinition() { throw null; } public override int GetHashCode() { throw null; } [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] + [return: System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] public override System.Type GetInterface(string name, bool ignoreCase) { throw null; } public override System.Reflection.InterfaceMapping GetInterfaceMap(System.Type interfaceType) { throw null; } [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] @@ -522,6 +524,7 @@ public void DefineMethodOverride(System.Reflection.MethodInfo methodInfoBody, Sy public override System.Type[] GetGenericArguments() { throw null; } public override System.Type GetGenericTypeDefinition() { throw null; } [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] + [return: System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] public override System.Type? GetInterface(string name, bool ignoreCase) { throw null; } public override System.Reflection.InterfaceMapping GetInterfaceMap(System.Type interfaceType) { throw null; } [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] diff --git a/src/libraries/System.Reflection.MetadataLoadContext/src/ILLink/ILLink.Suppressions.xml b/src/libraries/System.Reflection.MetadataLoadContext/src/ILLink/ILLink.Suppressions.xml index c7a90332ca8977..0c9c40e40f8073 100644 --- a/src/libraries/System.Reflection.MetadataLoadContext/src/ILLink/ILLink.Suppressions.xml +++ b/src/libraries/System.Reflection.MetadataLoadContext/src/ILLink/ILLink.Suppressions.xml @@ -409,5 +409,11 @@ member M:System.Reflection.TypeLoading.RoType.GetInterfaces + + ILLink + IL2093 + member + M:System.Reflection.TypeLoading.RoType.GetInterface(System.String,System.Boolean) + \ No newline at end of file diff --git a/src/libraries/System.Runtime/ref/System.Runtime.cs b/src/libraries/System.Runtime/ref/System.Runtime.cs index 6d5f6e6848bebb..44df19c51dffe7 100644 --- a/src/libraries/System.Runtime/ref/System.Runtime.cs +++ b/src/libraries/System.Runtime/ref/System.Runtime.cs @@ -4437,8 +4437,10 @@ protected Type() { } public virtual System.Type GetGenericTypeDefinition() { throw null; } public override int GetHashCode() { throw null; } [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] + [return: System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] public System.Type? GetInterface(string name) { throw null; } [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] + [return: System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] public abstract System.Type? GetInterface(string name, bool ignoreCase); public virtual System.Reflection.InterfaceMapping GetInterfaceMap(System.Type interfaceType) { throw null; } [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] @@ -9033,6 +9035,7 @@ public TypeDelegator([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields)] public override System.Reflection.FieldInfo[] GetFields(System.Reflection.BindingFlags bindingAttr) { throw null; } [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] + [return: System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] public override System.Type? GetInterface(string name, bool ignoreCase) { throw null; } public override System.Reflection.InterfaceMapping GetInterfaceMap(System.Type interfaceType) { throw null; } [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)] diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/DerivedTypes.Mono.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/DerivedTypes.Mono.cs index 1a859e55d9e429..4abd1c2e284456 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/DerivedTypes.Mono.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/DerivedTypes.Mono.cs @@ -229,6 +229,7 @@ public override FieldInfo[] GetFields(BindingFlags bindingAttr) } [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] + [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type GetInterface(string name, bool ignoreCase) { throw new NotSupportedException(SR.NotSupported_NonReflectedType); diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.Mono.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.Mono.cs index 29b1d71ab4ebdc..36b84b0b6281d5 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.Mono.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.Mono.cs @@ -291,6 +291,7 @@ public override FieldInfo[] GetFields(BindingFlags bindingAttr) } [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] + [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type? GetInterface(string name, bool ignoreCase) { return _tb.GetInterface(name, ignoreCase); diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/GenericTypeParameterBuilder.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/GenericTypeParameterBuilder.cs index 37ce00a7b84557..fb63a6d488e37d 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/GenericTypeParameterBuilder.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/GenericTypeParameterBuilder.cs @@ -150,6 +150,9 @@ public override FieldInfo[] GetFields(BindingFlags bindingAttr) } [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] + [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2063:UnrecognizedReflectionPattern", + Justification = "Linker doesn't recognize always throwing method. https://github.com/mono/linker/issues/2025")] public override Type GetInterface(string name, bool ignoreCase) { throw not_supported(); diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.Mono.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.Mono.cs index 7a751bf0074bdb..aceb54c6beaeb0 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.Mono.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.Mono.cs @@ -1084,6 +1084,7 @@ public override FieldInfo[] GetFields(BindingFlags bindingAttr) } [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] + [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type? GetInterface(string name, bool ignoreCase) { check_created(); diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilderInstantiation.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilderInstantiation.cs index 7e9303b4f83489..25bcd9d3152526 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilderInstantiation.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilderInstantiation.cs @@ -441,6 +441,7 @@ protected override TypeAttributes GetAttributeFlagsImpl() //stuff that throws [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] + [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type GetInterface(string name, bool ignoreCase) { throw new NotSupportedException(); diff --git a/src/mono/System.Private.CoreLib/src/System/RuntimeType.Mono.cs b/src/mono/System.Private.CoreLib/src/System/RuntimeType.Mono.cs index 06a3bbef207bc5..0af3ecbe35b909 100644 --- a/src/mono/System.Private.CoreLib/src/System/RuntimeType.Mono.cs +++ b/src/mono/System.Private.CoreLib/src/System/RuntimeType.Mono.cs @@ -962,6 +962,7 @@ public override MemberInfo[] GetMembers(BindingFlags bindingAttr) } [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] + [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] public override Type? GetInterface(string fullname, bool ignoreCase) { if (fullname == null) throw new ArgumentNullException(nameof(fullname)); From 90c6fdf2ab2fdf3bb6134bd7fca23cd8751c2343 Mon Sep 17 00:00:00 2001 From: vitek-karas Date: Wed, 12 May 2021 01:03:30 -0700 Subject: [PATCH 8/8] Fix build issues on Linux --- .../src/System/Reflection/Emit/DerivedTypes.Mono.cs | 2 ++ .../src/System/Reflection/Emit/TypeBuilderInstantiation.cs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/DerivedTypes.Mono.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/DerivedTypes.Mono.cs index 4abd1c2e284456..ca04f9244f19fe 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/DerivedTypes.Mono.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/DerivedTypes.Mono.cs @@ -230,6 +230,8 @@ public override FieldInfo[] GetFields(BindingFlags bindingAttr) [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2063:UnrecognizedReflectionPattern", + Justification = "Linker doesn't recognize always throwing method. https://github.com/mono/linker/issues/2025")] public override Type GetInterface(string name, bool ignoreCase) { throw new NotSupportedException(SR.NotSupported_NonReflectedType); diff --git a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilderInstantiation.cs b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilderInstantiation.cs index 25bcd9d3152526..88a493f96410b7 100644 --- a/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilderInstantiation.cs +++ b/src/mono/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilderInstantiation.cs @@ -442,6 +442,8 @@ protected override TypeAttributes GetAttributeFlagsImpl() //stuff that throws [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2063:UnrecognizedReflectionPattern", + Justification = "Linker doesn't recognize always throwing method. https://github.com/mono/linker/issues/2025")] public override Type GetInterface(string name, bool ignoreCase) { throw new NotSupportedException();