Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/linker.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJackson Schuster <36744439+jtschuster@users.noreply.github.com>2021-12-15 22:53:12 +0300
committerGitHub <noreply@github.com>2021-12-15 22:53:12 +0300
commit9e3a9538cae1bc6995733983e4734d0253b01fc8 (patch)
tree000b34a63f074705c816468d22819ed474e21f43
parent426918d44f6bb3b14cb545cbe2ed20d86a031661 (diff)
parent48bafdcfa874556bb87f87e833a95f53bd3816da (diff)
Merge pull request #2440 from jtschuster/emit2109InAnalyzer
Fix Issue 2416: RUC Analyzer doesn't emit IL2109
-rw-r--r--src/ILLink.RoslynAnalyzer/RequiresAnalyzerBase.cs5
-rw-r--r--src/ILLink.RoslynAnalyzer/RequiresUnreferencedCodeAnalyzer.cs26
-rw-r--r--src/ILLink.Shared/DiagnosticId.cs1
-rw-r--r--src/ILLink.Shared/SharedStrings.resx2
-rw-r--r--src/linker/Linker.Steps/MarkStep.cs2
-rw-r--r--src/linker/Linker/MemberReferenceExtensions.cs3
-rw-r--r--src/linker/Linker/MessageContainer.cs2
-rw-r--r--test/Mono.Linker.Tests.Cases/RequiresCapability/RequiresCapability.cs10
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; }