diff options
author | Jackson Schuster <36744439+jtschuster@users.noreply.github.com> | 2021-12-15 22:53:12 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-15 22:53:12 +0300 |
commit | 9e3a9538cae1bc6995733983e4734d0253b01fc8 (patch) | |
tree | 000b34a63f074705c816468d22819ed474e21f43 | |
parent | 426918d44f6bb3b14cb545cbe2ed20d86a031661 (diff) | |
parent | 48bafdcfa874556bb87f87e833a95f53bd3816da (diff) |
Merge pull request #2440 from jtschuster/emit2109InAnalyzer
Fix Issue 2416: RUC Analyzer doesn't emit IL2109
-rw-r--r-- | src/ILLink.RoslynAnalyzer/RequiresAnalyzerBase.cs | 5 | ||||
-rw-r--r-- | src/ILLink.RoslynAnalyzer/RequiresUnreferencedCodeAnalyzer.cs | 26 | ||||
-rw-r--r-- | src/ILLink.Shared/DiagnosticId.cs | 1 | ||||
-rw-r--r-- | src/ILLink.Shared/SharedStrings.resx | 2 | ||||
-rw-r--r-- | src/linker/Linker.Steps/MarkStep.cs | 2 | ||||
-rw-r--r-- | src/linker/Linker/MemberReferenceExtensions.cs | 3 | ||||
-rw-r--r-- | src/linker/Linker/MessageContainer.cs | 2 | ||||
-rw-r--r-- | test/Mono.Linker.Tests.Cases/RequiresCapability/RequiresCapability.cs | 10 |
8 files changed, 40 insertions, 11 deletions
diff --git a/src/ILLink.RoslynAnalyzer/RequiresAnalyzerBase.cs b/src/ILLink.RoslynAnalyzer/RequiresAnalyzerBase.cs index ed825cd20..d52bc04bd 100644 --- a/src/ILLink.RoslynAnalyzer/RequiresAnalyzerBase.cs +++ b/src/ILLink.RoslynAnalyzer/RequiresAnalyzerBase.cs @@ -29,6 +29,7 @@ namespace ILLink.RoslynAnalyzer private protected virtual ImmutableArray<(Action<OperationAnalysisContext> Action, OperationKind[] OperationKind)> ExtraOperationActions { get; } = ImmutableArray<(Action<OperationAnalysisContext> Action, OperationKind[] OperationKind)>.Empty; private protected virtual ImmutableArray<(Action<SyntaxNodeAnalysisContext> Action, SyntaxKind[] SyntaxKind)> ExtraSyntaxNodeActions { get; } = ImmutableArray<(Action<SyntaxNodeAnalysisContext> Action, SyntaxKind[] SyntaxKind)>.Empty; + private protected virtual ImmutableArray<(Action<SymbolAnalysisContext> Action, SymbolKind[] SymbolKind)> ExtraSymbolActions { get; } = ImmutableArray<(Action<SymbolAnalysisContext> Action, SymbolKind[] SymbolKind)>.Empty; public override void Initialize (AnalysisContext context) { @@ -197,6 +198,9 @@ namespace ILLink.RoslynAnalyzer foreach (var extraSyntaxNodeAction in ExtraSyntaxNodeActions) context.RegisterSyntaxNodeAction (extraSyntaxNodeAction.Action, extraSyntaxNodeAction.SyntaxKind); + foreach (var extraSymbolAction in ExtraSymbolActions) + context.RegisterSymbolAction (extraSymbolAction.Action, extraSymbolAction.SymbolKind); + void CheckAttributeInstantiation ( SymbolAnalysisContext symbolAnalysisContext, ISymbol symbol) @@ -262,7 +266,6 @@ namespace ILLink.RoslynAnalyzer ReportMismatchInAttributesDiagnostic (symbolAnalysisContext, implementation, member, isInterface: true); } } - } }); } diff --git a/src/ILLink.RoslynAnalyzer/RequiresUnreferencedCodeAnalyzer.cs b/src/ILLink.RoslynAnalyzer/RequiresUnreferencedCodeAnalyzer.cs index c1469c9a5..361800084 100644 --- a/src/ILLink.RoslynAnalyzer/RequiresUnreferencedCodeAnalyzer.cs +++ b/src/ILLink.RoslynAnalyzer/RequiresUnreferencedCodeAnalyzer.cs @@ -23,6 +23,8 @@ namespace ILLink.RoslynAnalyzer static readonly DiagnosticDescriptor s_makeGenericTypeRule = DiagnosticDescriptors.GetDiagnosticDescriptor (DiagnosticId.MakeGenericType); static readonly DiagnosticDescriptor s_makeGenericMethodRule = DiagnosticDescriptors.GetDiagnosticDescriptor (DiagnosticId.MakeGenericMethod); + static readonly DiagnosticDescriptor s_typeDerivesFromRucClassRule = DiagnosticDescriptors.GetDiagnosticDescriptor (DiagnosticId.RequiresOnBaseClass); + static readonly Action<OperationAnalysisContext> s_dynamicTypeInvocation = operationContext => { if (FindContainingSymbol (operationContext, DiagnosticTargets.All) is ISymbol containingSymbol && containingSymbol.HasAttribute (RequiresUnreferencedCodeAttribute)) @@ -32,8 +34,26 @@ namespace ILLink.RoslynAnalyzer operationContext.Operation.Syntax.GetLocation ())); }; + private Action<SymbolAnalysisContext> typeDerivesFromRucBase { + get { + return symbolAnalysisContext => { + if (symbolAnalysisContext.Symbol is INamedTypeSymbol typeSymbol && !typeSymbol.HasAttribute (RequiresUnreferencedCodeAttribute) + && typeSymbol.BaseType is INamedTypeSymbol baseType + && baseType.TryGetAttribute (RequiresUnreferencedCodeAttribute, out var requiresUnreferencedCodeAttribute)) { + var diag = Diagnostic.Create (s_typeDerivesFromRucClassRule, + typeSymbol.Locations[0], + typeSymbol, + baseType.GetDisplayName (), + GetMessageFromAttribute (requiresUnreferencedCodeAttribute), + GetUrlFromAttribute (requiresUnreferencedCodeAttribute)); + symbolAnalysisContext.ReportDiagnostic (diag); + } + }; + } + } + public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => - ImmutableArray.Create (s_dynamicTypeInvocationRule, s_makeGenericMethodRule, s_makeGenericTypeRule, s_requiresUnreferencedCodeRule, s_requiresUnreferencedCodeAttributeMismatch); + ImmutableArray.Create (s_dynamicTypeInvocationRule, s_makeGenericMethodRule, s_makeGenericTypeRule, s_requiresUnreferencedCodeRule, s_requiresUnreferencedCodeAttributeMismatch, s_typeDerivesFromRucClassRule); private protected override string RequiresAttributeName => RequiresUnreferencedCodeAttribute; @@ -76,6 +96,10 @@ namespace ILLink.RoslynAnalyzer return false; } + private protected override ImmutableArray<(Action<SymbolAnalysisContext> Action, SymbolKind[] SymbolKind)> ExtraSymbolActions => + ImmutableArray.Create<(Action<SymbolAnalysisContext> Action, SymbolKind[] SymbolKind)> ((typeDerivesFromRucBase, new SymbolKind[] { SymbolKind.NamedType })); + + private protected override ImmutableArray<(Action<OperationAnalysisContext> Action, OperationKind[] OperationKind)> ExtraOperationActions => ImmutableArray.Create ((s_dynamicTypeInvocation, new OperationKind[] { OperationKind.DynamicInvocation })); diff --git a/src/ILLink.Shared/DiagnosticId.cs b/src/ILLink.Shared/DiagnosticId.cs index 8fe4fc2fe..43f6394ac 100644 --- a/src/ILLink.Shared/DiagnosticId.cs +++ b/src/ILLink.Shared/DiagnosticId.cs @@ -8,6 +8,7 @@ CorrectnessOfCOMCannotBeGuaranteed = 2050, MakeGenericType = 2055, MakeGenericMethod = 2060, + RequiresOnBaseClass = 2109, RequiresUnreferencedCodeOnStaticConstructor = 2116, // Single-file diagnostic ids. diff --git a/src/ILLink.Shared/SharedStrings.resx b/src/ILLink.Shared/SharedStrings.resx index 36ce24594..6f5d57a28 100644 --- a/src/ILLink.Shared/SharedStrings.resx +++ b/src/ILLink.Shared/SharedStrings.resx @@ -150,7 +150,7 @@ <data name="RequiresAssemblyFilesAttributeMismatchMessage" xml:space="preserve"> <value>{0}. 'RequiresAssemblyFilesAttribute' annotations must match across all interface implementations or overrides.</value> </data> - <data name="RequiresAssemblyFilesAttributeMismatchTitle" xml:space="preserve"> + <data name="RequiresAssemblyFilesAttributeMismatchTitle" xml:space="preserve"> <value>'RequiresAssemblyFilesAttribute' annotations must match across all interface implementations or overrides.</value> </data> <data name="BaseRequiresMismatchMessage" xml:space="preserve"> diff --git a/src/linker/Linker.Steps/MarkStep.cs b/src/linker/Linker.Steps/MarkStep.cs index 524c9195e..8f5b43414 100644 --- a/src/linker/Linker.Steps/MarkStep.cs +++ b/src/linker/Linker.Steps/MarkStep.cs @@ -1900,7 +1900,7 @@ namespace Mono.Linker.Steps string formatString = SharedStrings.RequiresOnBaseClassMessage; string arg1 = MessageFormat.FormatRequiresAttributeMessageArg (effectiveRequiresUnreferencedCode.Message); string arg2 = MessageFormat.FormatRequiresAttributeUrlArg (effectiveRequiresUnreferencedCode.Url); - string message = string.Format (formatString, type, type.BaseType.GetDisplayName (), arg1, arg2); + string message = string.Format (formatString, type.GetDisplayName (), type.BaseType.GetDisplayName (), arg1, arg2); Context.LogWarning (message, 2109, currentOrigin, MessageSubCategory.TrimAnalysis); } diff --git a/src/linker/Linker/MemberReferenceExtensions.cs b/src/linker/Linker/MemberReferenceExtensions.cs index b24364aaa..14278fdef 100644 --- a/src/linker/Linker/MemberReferenceExtensions.cs +++ b/src/linker/Linker/MemberReferenceExtensions.cs @@ -1,5 +1,4 @@ -using System; -using System.Diagnostics; +using System.Diagnostics; using System.Text; using Mono.Cecil; diff --git a/src/linker/Linker/MessageContainer.cs b/src/linker/Linker/MessageContainer.cs index 89d51ff97..1e8b999aa 100644 --- a/src/linker/Linker/MessageContainer.cs +++ b/src/linker/Linker/MessageContainer.cs @@ -256,6 +256,8 @@ namespace Mono.Linker if (Origin?.Provider != null) { if (Origin?.Provider is MethodDefinition method) sb.Append (method.GetDisplayName ()); + else if (Origin?.Provider is TypeDefinition type) + sb.Append (type.GetDisplayName ()); else if (Origin?.Provider is IMemberDefinition member) sb.Append (member.FullName); else if (Origin?.Provider is AssemblyDefinition assembly) diff --git a/test/Mono.Linker.Tests.Cases/RequiresCapability/RequiresCapability.cs b/test/Mono.Linker.Tests.Cases/RequiresCapability/RequiresCapability.cs index cafe09aba..482ff2de1 100644 --- a/test/Mono.Linker.Tests.Cases/RequiresCapability/RequiresCapability.cs +++ b/test/Mono.Linker.Tests.Cases/RequiresCapability/RequiresCapability.cs @@ -1349,7 +1349,7 @@ namespace Mono.Linker.Tests.Cases.RequiresCapability public static void MethodWithRequires () { } } - [ExpectedWarning ("IL2109", "RequiresOnClass/DerivedWithoutRequires", "RequiresOnClass.ClassWithRequires", "--ClassWithRequires--", ProducedBy = ProducedBy.Trimmer)] + [ExpectedWarning ("IL2109", "RequiresOnClass.DerivedWithoutRequires", "RequiresOnClass.ClassWithRequires", "--ClassWithRequires--")] private class DerivedWithoutRequires : ClassWithRequires { public static void StaticMethodInInheritedClass () { } @@ -1521,7 +1521,7 @@ namespace Mono.Linker.Tests.Cases.RequiresCapability // A nested class is not considered a static method nor constructor therefore RequiresUnreferencedCode doesnt apply // and this warning is not suppressed - [ExpectedWarning ("IL2109", "RequiresOnClass/DerivedWithRequires2/DerivedNestedClass", "--ClassWithRequires--", ProducedBy = ProducedBy.Trimmer)] + [ExpectedWarning ("IL2109", "RequiresOnClass.DerivedWithRequires2.DerivedNestedClass", "--ClassWithRequires--")] public class DerivedNestedClass : ClassWithRequires { public static void NestedStaticMethod () { } @@ -1747,7 +1747,7 @@ namespace Mono.Linker.Tests.Cases.RequiresCapability public BaseWithRequires () { } } - [ExpectedWarning ("IL2109", "ReflectionAccessOnCtor/DerivedWithoutRequires", "ReflectionAccessOnCtor.BaseWithRequires", ProducedBy = ProducedBy.Trimmer)] + [ExpectedWarning ("IL2109", "ReflectionAccessOnCtor.DerivedWithoutRequires", "ReflectionAccessOnCtor.BaseWithRequires")] class DerivedWithoutRequires : BaseWithRequires { [ExpectedWarning ("IL2026", "--BaseWithRequires--", ProducedBy = ProducedBy.Trimmer)] // The body has direct call to the base.ctor() @@ -1821,7 +1821,7 @@ namespace Mono.Linker.Tests.Cases.RequiresCapability public int InstanceField; } - [ExpectedWarning ("IL2109", "ReflectionAccessOnField/DerivedWithoutRequires", "ReflectionAccessOnField.WithRequires", ProducedBy = ProducedBy.Trimmer)] + [ExpectedWarning ("IL2109", "ReflectionAccessOnField.DerivedWithoutRequires", "ReflectionAccessOnField.WithRequires")] class DerivedWithoutRequires : WithRequires { public static int DerivedStaticField; @@ -1945,7 +1945,7 @@ namespace Mono.Linker.Tests.Cases.RequiresCapability public int InstnaceProperty { get; set; } } - [ExpectedWarning ("IL2109", "ReflectionAccessOnProperties/DerivedWithoutRequires", "ReflectionAccessOnProperties.WithRequires", ProducedBy = ProducedBy.Trimmer)] + [ExpectedWarning ("IL2109", "ReflectionAccessOnProperties.DerivedWithoutRequires", "ReflectionAccessOnProperties.WithRequires")] class DerivedWithoutRequires : WithRequires { public static int DerivedStaticProperty { get; set; } |