diff options
author | Mateo Torres-Ruiz <mateoatr@users.noreply.github.com> | 2021-08-03 19:02:56 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-03 19:02:56 +0300 |
commit | 4de1a3d6d2334bae347c35e1921ce4ee85db4447 (patch) | |
tree | ebe34b98830af22ecf300b173949f7b054907054 /test/ILLink.RoslynAnalyzer.Tests | |
parent | ae18468b8712503aee67911228dd921601bd423a (diff) |
Add `dynamic` analyzer (#2150)
* Use DiagnosticId
* Update test/ILLink.RoslynAnalyzer.Tests/RequiresUnreferencedCodeAnalyzerTests.cs
Co-authored-by: Andy Gocke <angocke@microsoft.com>
* Lint
Co-authored-by: Andy Gocke <angocke@microsoft.com>
Diffstat (limited to 'test/ILLink.RoslynAnalyzer.Tests')
-rw-r--r-- | test/ILLink.RoslynAnalyzer.Tests/RequiresUnreferencedCodeAnalyzerTests.cs | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/test/ILLink.RoslynAnalyzer.Tests/RequiresUnreferencedCodeAnalyzerTests.cs b/test/ILLink.RoslynAnalyzer.Tests/RequiresUnreferencedCodeAnalyzerTests.cs index 4f26b6bb1..987406d37 100644 --- a/test/ILLink.RoslynAnalyzer.Tests/RequiresUnreferencedCodeAnalyzerTests.cs +++ b/test/ILLink.RoslynAnalyzer.Tests/RequiresUnreferencedCodeAnalyzerTests.cs @@ -19,6 +19,8 @@ namespace ILLink.RoslynAnalyzer.Tests { public class RequiresUnreferencedCodeAnalyzerTests { + static readonly DiagnosticDescriptor dynamicInvocationDiagnosticDescriptor = DiagnosticDescriptors.GetDiagnosticDescriptor (DiagnosticId.RequiresUnreferencedCode, new DiagnosticString ("DynamicTypeInvocation")); + static Task VerifyRequiresUnreferencedCodeAnalyzer (string source, params DiagnosticResult[] expected) => VerifyRequiresUnreferencedCodeAnalyzer (source, null, expected); @@ -862,5 +864,61 @@ class AnotherImplementation : IRAF // (13,3): warning IL2046: Member 'Implementation.StringProperty.get' with 'RequiresUnreferencedCodeAttribute' implements interface member 'IRAF.StringProperty.get' without 'RequiresUnreferencedCodeAttribute'. Attributes must match across all interface implementations or overrides. VerifyCS.Diagnostic (DiagnosticId.RequiresUnreferencedCodeAttributeMismatch).WithSpan (13, 3, 13, 6).WithArguments ("Member 'Implementation.StringProperty.get' with 'RequiresUnreferencedCodeAttribute' implements interface member 'IRAF.StringProperty.get' without 'RequiresUnreferencedCodeAttribute'")); } + + [Fact] + public Task InvocationOnDynamicType () + { + var source = @" +using System; +class C +{ + static void M0 () + { + dynamic dynamicField = ""Some string""; + Console.WriteLine (dynamicField); + } + + static void M1 () + { + MethodWithDynamicArgDoNothing (0); + MethodWithDynamicArgDoNothing (""Some string""); + MethodWithDynamicArg(-1); + } + + static void MethodWithDynamicArgDoNothing (dynamic arg) + { + } + + static void MethodWithDynamicArg (dynamic arg) + { + arg.MethodWithDynamicArg (arg); + } +}"; + + return VerifyRequiresUnreferencedCodeAnalyzer (source, + // (8,3): warning IL2026: Invoking members on dynamic types is not trimming safe. Types or member might have been removed by the trimmer. + VerifyCS.Diagnostic (dynamicInvocationDiagnosticDescriptor).WithSpan (8, 3, 8, 35), + // (24,3): warning IL2026: Invoking members on dynamic types is not trimming safe. Types or member might have been removed by the trimmer. + VerifyCS.Diagnostic (dynamicInvocationDiagnosticDescriptor).WithSpan (24, 3, 24, 33)); + } + + [Fact] + public Task InvocationOnDynamicTypeInMethodWithRUCDoesNotWarnTwoTimes () + { + var source = @" +using System; +using System.Diagnostics.CodeAnalysis; +class C +{ + [RequiresUnreferencedCode (""We should only see the warning related to this annotation, and none about the dynamic type."")] + static void M0 () + { + dynamic dynamicField = ""Some string""; + Console.WriteLine (dynamicField); + } +}"; + + return VerifyRequiresUnreferencedCodeAnalyzer (source); + } } } |