File: SymbolIsBannedAnalyzerTests.cs
Web Access
Project: src\src\RoslynAnalyzers\Microsoft.CodeAnalysis.BannedApiAnalyzers\UnitTests\Microsoft.CodeAnalysis.BannedApiAnalyzers.UnitTests.csproj (Microsoft.CodeAnalysis.BannedApiAnalyzers.UnitTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Testing;
using Test.Utilities;
using Xunit;
 
using VerifyCS = Test.Utilities.CSharpCodeFixVerifier<
    Microsoft.CodeAnalysis.CSharp.BannedApiAnalyzers.CSharpSymbolIsBannedAnalyzer,
    Microsoft.CodeAnalysis.Testing.EmptyCodeFixProvider>;
 
using VerifyVB = Test.Utilities.VisualBasicCodeFixVerifier<
    Microsoft.CodeAnalysis.VisualBasic.BannedApiAnalyzers.BasicSymbolIsBannedAnalyzer,
    Microsoft.CodeAnalysis.Testing.EmptyCodeFixProvider>;
 
namespace Microsoft.CodeAnalysis.BannedApiAnalyzers.UnitTests
{
    // For specification of document comment IDs see https://learn.microsoft.com/dotnet/csharp/language-reference/language-specification/documentation-comments#processing-the-documentation-file
 
    public class SymbolIsBannedAnalyzerTests
    {
        private const string BannedSymbolsFileName = "BannedSymbols.txt";
 
        private static DiagnosticResult GetCSharpResultAt(int markupKey, DiagnosticDescriptor descriptor, string bannedMemberName, string message)
            => VerifyCS.Diagnostic(descriptor)
                .WithLocation(markupKey)
                .WithArguments(bannedMemberName, message);
 
        private static DiagnosticResult GetBasicResultAt(int markupKey, DiagnosticDescriptor descriptor, string bannedMemberName, string message)
            => VerifyVB.Diagnostic(descriptor)
                .WithLocation(markupKey)
                .WithArguments(bannedMemberName, message);
 
        private static async Task VerifyBasicAnalyzerAsync(string source, string bannedApiText, params DiagnosticResult[] expected)
        {
            var test = new VerifyVB.Test
            {
                TestState =
                {
                    Sources = { source },
                    AdditionalFiles = { (BannedSymbolsFileName, bannedApiText) },
                },
            };
 
            test.ExpectedDiagnostics.AddRange(expected);
            await test.RunAsync();
        }
 
        private static async Task VerifyCSharpAnalyzerAsync(string source, string bannedApiText, params DiagnosticResult[] expected)
        {
            var test = new VerifyCS.Test
            {
                TestState =
                {
                    Sources = { source },
                    AdditionalFiles = { (BannedSymbolsFileName, bannedApiText) },
                },
            };
 
            test.ExpectedDiagnostics.AddRange(expected);
            await test.RunAsync();
        }
 
        #region Diagnostic tests
 
        [Fact]
        public async Task NoDiagnosticForNoBannedTextAsync()
        {
            await VerifyCS.VerifyAnalyzerAsync("class C { }");
            await VerifyVB.VerifyAnalyzerAsync(@"Class C
End Class");
        }
 
        [Fact]
        public async Task NoDiagnosticReportedForEmptyBannedTextAsync()
        {
            var source = @"";
 
            var bannedText = @"";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText);
        }
 
        [Fact]
        public async Task NoDiagnosticReportedForMultilineBlankBannedTextAsync()
        {
            var source = @"
 
 
";
 
            var bannedText = @"";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText);
        }
 
        [Fact]
        public async Task NoDiagnosticReportedForMultilineMessageOnlyBannedTextAsync()
        {
            var source = @"";
            var bannedText = @"
;first
  ;second
;third // comment";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText);
        }
 
        [Fact]
        public async Task DiagnosticReportedForDuplicateBannedApiLinesAsync()
        {
            var source = @"";
            var bannedText = @"
{|#0:T:System.Console|}
{|#1:T:System.Console|}";
 
            var expected = new DiagnosticResult(SymbolIsBannedAnalyzer.DuplicateBannedSymbolRule)
                .WithLocation(1)
                .WithLocation(0)
                .WithArguments("System.Console");
            await VerifyCSharpAnalyzerAsync(source, bannedText, expected);
        }
 
        [Fact]
        public async Task DiagnosticReportedForDuplicateBannedApiLinesWithDifferentIdsAsync()
        {
            // The colon in the documentation ID is optional.
            // Verify that it doesn't cause exceptions when building look ups.
 
            var source = @"";
            var bannedText = @"
{|#0:T:System.Console;Message 1|}
{|#1:TSystem.Console;Message 2|}";
 
            var expected = new DiagnosticResult(SymbolIsBannedAnalyzer.DuplicateBannedSymbolRule)
                .WithLocation(1)
                .WithLocation(0)
                .WithArguments("System.Console");
            await VerifyCSharpAnalyzerAsync(source, bannedText, expected);
        }
 
        [Fact]
        public async Task DiagnosticReportedForDuplicateBannedApiLinesInDifferentFiles()
        {
            var test = new VerifyCS.Test
            {
                TestState =
                {
                    Sources = { @"" },
                    AdditionalFiles =
                    {
                        ("BannedSymbols.txt", @"{|#0:T:System.Console|}") ,
                        ("BannedSymbols.Other.txt", @"{|#1:T:System.Console|}")
                    },
                },
                ExpectedDiagnostics =
                {
                    new DiagnosticResult(SymbolIsBannedAnalyzer.DuplicateBannedSymbolRule)
                        .WithLocation(0)
                        .WithLocation(1)
                        .WithArguments("System.Console")
                }
            };
 
            await test.RunAsync();
        }
 
        #region Comments in BannedSymbols.txt tests
 
        [Fact]
        public async Task DiagnosticReportedForDuplicateBannedApiLinesWithCommentsAsync()
        {
            var source = @"";
            var bannedText = @"
{|#0:T:System.Console|} " + '\t' + @" //comment here with whitespace before it
{|#1:T:System.Console|}//should not affect the reported duplicate";
 
            var expected = new DiagnosticResult(SymbolIsBannedAnalyzer.DuplicateBannedSymbolRule)
                .WithLocation(1)
                .WithLocation(0)
                .WithArguments("System.Console");
            await VerifyCSharpAnalyzerAsync(source, bannedText, expected);
        }
 
        [Fact]
        public async Task DiagnosticReportedForDuplicateBannedApiLinesWithCommentsInDifferentFiles()
        {
            var test = new VerifyCS.Test
            {
                TestState =
                {
                    Sources = { @"" },
                    AdditionalFiles =
                    {
                        ("BannedSymbols.txt", @"{|#0:T:System.Console|} //ignore this") ,
                        ("BannedSymbols.Other.txt", @"{|#1:T:System.Console|} //comment will not affect result")
                    },
                },
                ExpectedDiagnostics =
                {
                    new DiagnosticResult(SymbolIsBannedAnalyzer.DuplicateBannedSymbolRule)
                        .WithLocation(0)
                        .WithLocation(1)
                        .WithArguments("System.Console")
                }
            };
 
            await test.RunAsync();
        }
 
        [Fact]
        public async Task NoDiagnosticReportedForCommentLine()
        {
            var source = @"";
            var bannedText = @"// this comment line will be ignored";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText);
            await VerifyBasicAnalyzerAsync(source, bannedText);
        }
 
        [Fact]
        public async Task NoDiagnosticReportedForCommentedOutBannedApiLineAsync()
        {
            var bannedText = @"//T:N.Banned";
 
            var csharpSource = @"
namespace N
{
    class Banned { }
    class C
    {
        void M()
        {
            var c = new Banned();
        }
    }
}";
 
            await VerifyCSharpAnalyzerAsync(csharpSource, bannedText);
 
            var visualBasicSource = @"
Namespace N
    Class Banned : End Class
    Class C
        Sub M()
            Dim c As New Banned()
        End Sub
    End Class
End Namespace";
 
            await VerifyBasicAnalyzerAsync(visualBasicSource, bannedText);
        }
 
        [Fact]
        public async Task NoDiagnosticReportedForCommentLineThatBeginsWithWhitespaceAsync()
        {
            var bannedText = @"  // comment here";
 
            var csharpSource = @"
namespace N
{
    class Banned { }
    class C
    {
        void M()
        {
            var c = new Banned();
        }
    }
}";
 
            await VerifyCSharpAnalyzerAsync(csharpSource, bannedText);
 
            var visualBasicSource = @"
Namespace N
    Class Banned : End Class
    Class C
        Sub M()
            Dim c As New Banned()
        End Sub
    End Class
End Namespace";
 
            await VerifyBasicAnalyzerAsync(visualBasicSource, bannedText);
        }
 
        [Fact]
        public async Task NoDiagnosticReportedForCommentedOutDuplicateBannedApiLinesAsync()
        {
            var source = @"";
            var bannedText = @"
//T:System.Console
//T:System.Console";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText);
            await VerifyBasicAnalyzerAsync(source, bannedText);
        }
 
        [Fact]
        public async Task DiagnosticReportedForBannedApiLineWithCommentAtTheEndAsync()
        {
            var bannedText = @"T:N.Banned//comment here";
 
            var csharpSource = @"
namespace N
{
    class Banned { }
    class C
    {
        void M()
        {
            var c = {|#0:new Banned()|};
        }
    }
}";
 
            await VerifyCSharpAnalyzerAsync(csharpSource, bannedText, GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Banned", ""));
 
            var visualBasicSource = @"
Namespace N
    Class Banned : End Class
    Class C
        Sub M()
            Dim c As {|#0:New Banned()|}
        End Sub
    End Class
End Namespace";
 
            await VerifyBasicAnalyzerAsync(visualBasicSource, bannedText, GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Banned", ""));
        }
 
        [Fact]
        public async Task DiagnosticReportedForInterfaceImplementationAsync()
        {
            var bannedText = "T:N.IBanned//comment here";
 
            var csharpSource = @"
namespace N
{
    interface IBanned { }
    class C : {|#0:IBanned|}
    {
    }
}";
 
            await VerifyCSharpAnalyzerAsync(csharpSource, bannedText, GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "IBanned", ""));
 
            var visualBasicSource = @"
Namespace N
    Interface IBanned : End Interface
    Class C
        Implements {|#0:IBanned|}
    End Class
End Namespace";
 
            await VerifyBasicAnalyzerAsync(visualBasicSource, bannedText, GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "IBanned", ""));
 
        }
 
        [Fact]
        public async Task DiagnosticReportedForClassInheritanceAsync()
        {
            var bannedText = "T:N.Banned//comment here";
 
            var csharpSource = @"
namespace N
{
    class Banned { }
    class C : {|#0:Banned|}
    {
    }
}";
 
            await VerifyCSharpAnalyzerAsync(csharpSource, bannedText, GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Banned", ""));
 
            var visualBasicSource = @"
Namespace N
    Class Banned : End Class
    Class C
        Inherits {|#0:Banned|}
    End Class
End Namespace";
 
            await VerifyBasicAnalyzerAsync(visualBasicSource, bannedText, GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Banned", ""));
 
        }
 
        [Fact]
        public async Task DiagnosticReportedForBannedApiLineWithWhitespaceThenCommentAtTheEndAsync()
        {
            var bannedText = "T:N.Banned \t //comment here";
 
            var csharpSource = @"
namespace N
{
    class Banned { }
    class C
    {
        void M()
        {
            var c = {|#0:new Banned()|};
        }
    }
}";
 
            await VerifyCSharpAnalyzerAsync(csharpSource, bannedText, GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Banned", ""));
 
            var visualBasicSource = @"
Namespace N
    Class Banned : End Class
    Class C
        Sub M()
            Dim c As {|#0:New Banned()|}
        End Sub
    End Class
End Namespace";
 
            await VerifyBasicAnalyzerAsync(visualBasicSource, bannedText, GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Banned", ""));
        }
 
        [Fact]
        public async Task DiagnosticReportedForBannedApiLineWithMessageThenWhitespaceFollowedByCommentAtTheEndMustNotIncludeWhitespaceInMessageAsync()
        {
            var bannedText = "T:N.Banned;message \t //comment here";
 
            var csharpSource = @"
namespace N
{
    class Banned { }
    class C
    {
        void M()
        {
            var c = {|#0:new Banned()|};
        }
    }
}";
 
            await VerifyCSharpAnalyzerAsync(csharpSource, bannedText, GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Banned", ": message"));
 
            var visualBasicSource = @"
Namespace N
    Class Banned : End Class
    Class C
        Sub M()
            Dim c As {|#0:New Banned()|}
        End Sub
    End Class
End Namespace";
 
            await VerifyBasicAnalyzerAsync(visualBasicSource, bannedText, GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Banned", ": message"));
        }
 
        #endregion Comments in BannedSymbols.txt tests
 
        [Fact]
        public async Task CSharp_BannedApiFile_MessageIncludedInDiagnosticAsync()
        {
            var source = @"
namespace N
{
    class Banned { }
    class C
    {
        void M()
        {
            var c = {|#0:new Banned()|};
        }
    }
}";
 
            var bannedText = @"T:N.Banned;Use NonBanned instead";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText, GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Banned", ": Use NonBanned instead"));
        }
 
        [Fact]
        public async Task CSharp_BannedApiFile_WhiteSpaceAsync()
        {
            var source = @"
namespace N
{
    class Banned { }
    class C
    {
        void M()
        {
            var c = {|#0:new Banned()|};
        }
    }
}";
 
            var bannedText = @"
  T:N.Banned  ";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText, GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Banned", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedApiFile_WhiteSpaceWithMessageAsync()
        {
            var source = @"
namespace N
{
    class Banned { }
    class C
    {
        void M()
        {
            var c = {|#0:new Banned()|};
        }
    }
}";
 
            var bannedText = @"T:N.Banned ; Use NonBanned instead ";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText, GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Banned", ": Use NonBanned instead"));
        }
 
        [Fact]
        public async Task CSharp_BannedApiFile_EmptyMessageAsync()
        {
            var source = @"
namespace N
{
    class Banned { }
    class C
    {
        void M()
        {
            var c = {|#0:new Banned()|};
        }
    }
}";
 
            var bannedText = @"T:N.Banned;";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText, GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Banned", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedApi_MultipleFiles()
        {
            var source = @"
namespace N
{
    class BannedA { }
    class BannedB { }
    class NotBanned { }
    class C
    {
        void M()
        {
            var a = {|#0:new BannedA()|};
            var b = {|#1:new BannedB()|};
            var c = new NotBanned();
        }
    }
}";
 
            var test = new VerifyCS.Test
            {
                TestState =
                {
                    Sources = { source },
                    AdditionalFiles =
                    {
                        ("BannedSymbols.txt", @"T:N.BannedA") ,
                        ("BannedSymbols.Other.txt", @"T:N.BannedB"),
                        ("OtherFile.txt", @"T:N.NotBanned")
                    },
                },
                ExpectedDiagnostics =
                {
                    GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "BannedA", ""),
                    GetCSharpResultAt(1, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "BannedB", "")
                }
            };
 
            await test.RunAsync();
        }
 
        [Fact]
        public async Task CSharp_BannedType_ConstructorAsync()
        {
            var source = @"
namespace N
{
    class Banned { }
    class C
    {
        void M()
        {
            var c = {|#0:new Banned()|};
        }
    }
}";
 
            var bannedText = @"
T:N.Banned";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText, GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Banned", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedNamespace_ConstructorAsync()
        {
            var source = @"
namespace N
{
    class C
    {
        void M()
        {
            var c = {|#0:new N.C()|};
        }
    }
}
";
 
            var bannedText = @"
N:N";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText, GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "N", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedNamespace_Parent_ConstructorAsync()
        {
            var source = @"
namespace N.NN
{
    class C
    {
        void M()
        {
            var a = {|#0:new N.NN.C()|};
        }
    }
}
";
 
            var bannedText = @"
N:N";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText, GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "N", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedNamespace_MethodGroupAsync()
        {
            var source = @"
namespace N
{
    delegate void D();
    class C
    {
        void M()
        {
            D d = {|#0:M|};
        }
    }
}
";
 
            var bannedText = @"
N:N";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText, GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "N", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedNamespace_PropertyAsync()
        {
            var source = @"
namespace N
{
    class C
    {
        public int P { get; set; }
        void M()
        {
            {|#0:P|} = {|#1:P|};
        }
    }
}
";
 
            var bannedText = @"
N:N";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText,
                GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "N", ""),
                GetCSharpResultAt(1, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "N", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedNamespace_MethodAsync()
        {
            var source = @"
namespace N
{
    interface I
    {
        void M();
    }
}
 
class C
{
    void M()
    {
        N.I i = null;
        {|#0:i.M()|};
    }
}";
            var bannedText = @"N:N";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText, GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "N", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedNamespace_TypeOfArgument()
        {
            var source = @"
namespace N
{
    class Banned {  }
}
class C
{
    void M()
    {
        var type = {|#0:typeof(N.Banned)|};
    }
}
";
            var bannedText = @"N:N";
            await VerifyCSharpAnalyzerAsync(source, bannedText, GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "N", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedNamespace_Constituent()
        {
            var source = @"
class C
{
    void M()
    {
        var thread = {|#0:new System.Threading.Thread((System.Threading.ThreadStart)null)|};
    }
}
";
            var bannedText = @"N:System.Threading";
            await VerifyCSharpAnalyzerAsync(source, bannedText, GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "System.Threading", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedGenericType_ConstructorAsync()
        {
            var source = @"
class C
{
    void M()
    {
        var c = {|#0:new System.Collections.Generic.List<string>()|};
    }
}";
 
            var bannedText = @"
T:System.Collections.Generic.List`1";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText, GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "List<T>", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedType_AsTypeArgumentAsync()
        {
            var source = @"
struct C {}
 
class G<T>
{
    class N<U>
    { }
 
    unsafe void M()
    {
        var b = {|#0:new G<C>()|};
        var c = {|#1:new G<C>.N<int>()|};
        var d = {|#2:new G<int>.N<C>()|};
        var e = {|#3:new G<G<int>.N<C>>.N<int>()|};
        var f = {|#4:new G<G<C>.N<int>>.N<int>()|};
        var g = {|#5:new C[42]|};
        var h = {|#6:new G<C[]>()|};
        fixed (C* i = {|#7:&g[0]|}) { }
    }
}";
 
            var bannedText = @"
T:C";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText,
                GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""),
                GetCSharpResultAt(1, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""),
                GetCSharpResultAt(2, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""),
                GetCSharpResultAt(3, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""),
                GetCSharpResultAt(4, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""),
                GetCSharpResultAt(5, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""),
                GetCSharpResultAt(6, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""),
                GetCSharpResultAt(7, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedNestedType_ConstructorAsync()
        {
            var source = @"
class C
{
    class Nested { }
    void M()
    {
        var n = {|#0:new Nested()|};
    }
}";
 
            var bannedText = @"
T:C.Nested";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText, GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C.Nested", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedType_MethodOnNestedTypeAsync()
        {
            var source = @"
class C
{
    public static class Nested
    {
        public static void M() { }
    }
}
 
class D
{
    void M2()
    {
        {|#0:C.Nested.M()|};
    }
}";
            var bannedText = @"
T:C";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText, GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedInterface_MethodAsync()
        {
            var source = @"
interface I
{
    void M();
}
 
class C
{
    void M()
    {
        I i = null;
        {|#0:i.M()|};
    }
}";
            var bannedText = @"T:I";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText, GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "I", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedClass_OperatorsAsync()
        {
            var source = @"
class C
{
    public static implicit operator C(int i) => {|#0:new C()|};
    public static explicit operator C(float f) => {|#1:new C()|};
    public static C operator +(C c, int i) => c;
    public static C operator ++(C c) => c;
    public static C operator -(C c) => c;
 
    void M()
    {
        C c = {|#2:0|};        // implicit conversion.
        c = {|#3:(C)1.0f|};    // Explicit conversion.
        c = {|#4:c + 1|};      // Binary operator.
        {|#5:c++|};            // Increment or decrement.
        c = {|#6:-c|};         // Unary operator.
    }
}";
            var bannedText = @"T:C";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText,
                GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""),
                GetCSharpResultAt(1, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""),
                GetCSharpResultAt(2, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""),
                GetCSharpResultAt(3, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""),
                GetCSharpResultAt(4, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""),
                GetCSharpResultAt(5, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""),
                GetCSharpResultAt(6, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedClass_PropertyAsync()
        {
            var source = @"
class C
{
    public int P { get; set; }
    void M()
    {
        {|#0:P|} = {|#1:P|};
    }
}";
            var bannedText = @"T:C";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText,
                GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""),
                GetCSharpResultAt(1, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedClass_FieldAsync()
        {
            var source = @"
class C
{
    public int F;
    void M()
    {
        {|#0:F|} = {|#1:F|};
    }
}";
            var bannedText = @"T:C";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText,
                GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""),
                GetCSharpResultAt(1, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedClass_EventAsync()
        {
            var source = @"
using System;
 
class C
{
    public event EventHandler E;
    void M()
    {
        {|#0:E|} += null;
        {|#1:E|} -= null;
        {|#2:E|}(null, EventArgs.Empty);
    }
}";
            var bannedText = @"T:C";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText,
                GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""),
                GetCSharpResultAt(1, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""),
                GetCSharpResultAt(2, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedClass_MethodGroupAsync()
        {
            var source = @"
delegate void D();
class C
{
    void M()
    {
        D d = {|#0:M|};
    }
}
";
            var bannedText = @"T:C";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText,
                GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedClass_DocumentationReferenceAsync()
        {
            var source = @"
class C { }
 
/// <summary><see cref=""{|#0:C|}"" /></summary>
class D { }
";
            var bannedText = @"T:C";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText,
                GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedAttribute_UsageOnTypeAsync()
        {
            var source = @"
using System;
 
[AttributeUsage(AttributeTargets.All, Inherited = true)]
class BannedAttribute : Attribute { }
 
[{|#0:Banned|}]
class C { }
class D : C { }
";
            var bannedText = @"T:BannedAttribute";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText,
                GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "BannedAttribute", ""),
                GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "BannedAttribute", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedAttribute_UsageOnMemberAsync()
        {
            var source = @"
using System;
 
[AttributeUsage(AttributeTargets.All, Inherited = true)]
class BannedAttribute : Attribute { }
 
class C 
{
    [{|#0:Banned|}]
    public int SomeProperty { get; }
}
";
            var bannedText = @"T:BannedAttribute";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText,
                GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "BannedAttribute", ""),
                GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "BannedAttribute", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedAttribute_UsageOnAssemblyAsync()
        {
            var source = @"
using System;
 
[assembly: {|#0:BannedAttribute|}]
 
[AttributeUsage(AttributeTargets.All, Inherited = true)]
class BannedAttribute : Attribute { }
";
 
            var bannedText = @"T:BannedAttribute";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText,
                GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "BannedAttribute", ""),
                GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "BannedAttribute", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedAttribute_UsageOnModuleAsync()
        {
            var source = @"
using System;
 
[module: {|#0:BannedAttribute|}]
 
[AttributeUsage(AttributeTargets.All, Inherited = true)]
class BannedAttribute : Attribute { }
";
 
            var bannedText = @"T:BannedAttribute";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText,
                GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "BannedAttribute", ""),
                GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "BannedAttribute", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedConstructorAsync()
        {
            var source = @"
namespace N
{
    class Banned
    {
        public Banned() {}
        public Banned(int i) {}
    }
    class C
    {
        void M()
        {
            var c = {|#0:new Banned()|};
            var d = {|#1:new Banned(1)|};
        }
    }
}";
 
            var bannedText1 = @"M:N.Banned.#ctor";
            var bannedText2 = @"M:N.Banned.#ctor(System.Int32)";
 
            await VerifyCSharpAnalyzerAsync(
                source,
                bannedText1,
                GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Banned.Banned()", ""));
 
            await VerifyCSharpAnalyzerAsync(
                source,
                bannedText2,
                GetCSharpResultAt(1, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Banned.Banned(int)", ""));
        }
 
        [Fact]
        public async Task Csharp_BannedConstructor_AttributeAsync()
        {
            var source = @"
using System;
 
[AttributeUsage(AttributeTargets.All, Inherited = true)]
class BannedAttribute : Attribute
{
    public BannedAttribute() {}
    public BannedAttribute(int banned) {}
    public BannedAttribute(string notBanned) {}
}
 
class C
{
    [{|#0:Banned|}]
    public int SomeProperty { get; }
 
    [{|#1:Banned(1)|}]
    public void SomeMethod() {}
 
    [Banned("""")]
    class D {}
}
";
            var bannedText1 = @"M:BannedAttribute.#ctor";
            var bannedText2 = @"M:BannedAttribute.#ctor(System.Int32)";
 
            await VerifyCSharpAnalyzerAsync(
                source,
                bannedText1,
                GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "BannedAttribute.BannedAttribute()", ""),
                GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "BannedAttribute.BannedAttribute()", ""));
 
            await VerifyCSharpAnalyzerAsync(
                source,
                bannedText2,
                GetCSharpResultAt(1, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "BannedAttribute.BannedAttribute(int)", ""),
                GetCSharpResultAt(1, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "BannedAttribute.BannedAttribute(int)", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedMethodAsync()
        {
            var source = @"
namespace N
{
    class C
    {
        public void Banned() {}
        public void Banned(int i) {}
        public void Banned<T>(T t) {}
 
        void M()
        {
            {|#0:Banned()|};
            {|#1:Banned(1)|};
            {|#2:Banned<string>("""")|};
        }
    }
 
    class D<T>
    {
        public void Banned() {}
        public void Banned(int i) {}
        public void Banned<U>(U u) {}
 
        void M()
        {
            {|#3:Banned()|};
            {|#4:Banned(1)|};
            {|#5:Banned<string>("""")|};
        }
    }
}";
 
            var bannedText1 = @"M:N.C.Banned";
            var bannedText2 = @"M:N.C.Banned(System.Int32)";
            var bannedText3 = @"M:N.C.Banned``1(``0)";
            var bannedText4 = @"M:N.D`1.Banned()";
            var bannedText5 = @"M:N.D`1.Banned(System.Int32)";
            var bannedText6 = @"M:N.D`1.Banned``1(``0)";
 
            await VerifyCSharpAnalyzerAsync(
                source,
                bannedText1,
                GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C.Banned()", ""));
 
            await VerifyCSharpAnalyzerAsync(
                source,
                bannedText2,
                GetCSharpResultAt(1, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C.Banned(int)", ""));
 
            await VerifyCSharpAnalyzerAsync(
                source,
                bannedText3,
                GetCSharpResultAt(2, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C.Banned<T>(T)", ""));
 
            await VerifyCSharpAnalyzerAsync(
                source,
                bannedText4,
                GetCSharpResultAt(3, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "D<T>.Banned()", ""));
 
            await VerifyCSharpAnalyzerAsync(
                source,
                bannedText5,
                GetCSharpResultAt(4, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "D<T>.Banned(int)", ""));
 
            await VerifyCSharpAnalyzerAsync(
                source,
                bannedText6,
                GetCSharpResultAt(5, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "D<T>.Banned<U>(U)", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedPropertyAsync()
        {
            var source = @"
namespace N
{
    class C
    {
        public int Banned { get; set; }
 
        void M()
        {
            {|#0:Banned|} = {|#1:Banned|};
        }
    }
}";
 
            var bannedText = @"P:N.C.Banned";
 
            await VerifyCSharpAnalyzerAsync(
                source,
                bannedText,
                GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C.Banned", ""),
                GetCSharpResultAt(1, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C.Banned", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedFieldAsync()
        {
            var source = @"
namespace N
{
    class C
    {
        public int Banned;
 
        void M()
        {
            {|#0:Banned|} = {|#1:Banned|};
        }
    }
}";
 
            var bannedText = @"F:N.C.Banned";
 
            await VerifyCSharpAnalyzerAsync(
                source,
                bannedText,
                GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C.Banned", ""),
                GetCSharpResultAt(1, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C.Banned", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedEventAsync()
        {
            var source = @"
namespace N
{
    class C
    {
        public event System.Action Banned;
 
        void M()
        {
            {|#0:Banned|} += null;
            {|#1:Banned|} -= null;
            {|#2:Banned|}();
        }
    }
}";
 
            var bannedText = @"E:N.C.Banned";
 
            await VerifyCSharpAnalyzerAsync(
                source,
                bannedText,
                GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C.Banned", ""),
                GetCSharpResultAt(1, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C.Banned", ""),
                GetCSharpResultAt(2, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C.Banned", ""));
        }
 
        [Fact]
        public async Task CSharp_BannedMethodGroupAsync()
        {
            var source = @"
namespace N
{
    class C
    {
        public void Banned() {}
 
        void M()
        {
            System.Action b = {|#0:Banned|};
        }
    }
}";
            var bannedText = @"M:N.C.Banned";
 
            await VerifyCSharpAnalyzerAsync(
                source,
                bannedText,
                GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C.Banned()", ""));
        }
 
        [Fact]
        public async Task CSharp_NoDiagnosticClass_TypeOfArgument()
        {
            var source = @"
class Banned {  }
class C
{
    void M()
    {
        var type = {|#0:typeof(C)|};
    }
}
";
            var bannedText = @"T:Banned";
            await VerifyCSharpAnalyzerAsync(source, bannedText);
        }
 
        [Fact]
        public async Task CSharp_BannedClass_TypeOfArgument()
        {
            var source = @"
class Banned {  }
class C
{
    void M()
    {
        var type = {|#0:typeof(Banned)|};
    }
}
";
            var bannedText = @"T:Banned";
            await VerifyCSharpAnalyzerAsync(source, bannedText, GetCSharpResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Banned", ""));
        }
 
        [Fact, WorkItem(3295, "https://github.com/dotnet/roslyn-analyzers/issues/3295")]
        public async Task CSharp_BannedAbstractVirtualMemberAlsoBansOverrides_RootLevelIsBannedAsync()
        {
            var source = @"
using System;
 
namespace N
{
    public abstract class C1
    {
        public abstract void Method1();
        public abstract int Property1 { get; set; }
        public abstract event Action Event1;
 
        public virtual void Method2() {}
        public virtual int Property2 { get; set; }
        public virtual event Action Event2;
    }
 
    public class C2 : C1
    {
        public override void Method1() {}
        public override int Property1 { get; set; }
        public override event Action Event1;
 
        public override void Method2()
        {
            {|RS0030:base.Method2()|};
        }
 
        public override int Property2 { get; set; }
        public override event Action Event2;
 
        void M1()
        {
            {|RS0030:Method1()|};
            if ({|RS0030:Property1|} == 42 && {|RS0030:Event1|} != null) {}
 
            {|RS0030:Method2()|};
            if ({|RS0030:Property2|} == 42 && {|RS0030:Event2|} != null) {}
        }
    }
 
    public class C3 : C2
    {
        public override void Method1()
        {
            {|RS0030:base.Method1()|};
        }
 
        public override int Property1 { get; set; }
        public override event Action Event1;
 
        public override void Method2()
        {
            {|RS0030:base.Method2()|};
        }
 
        public override int Property2 { get; set; }
        public override event Action Event2;
 
        void M2()
        {
            {|RS0030:Method1()|};
            if ({|RS0030:Property1|} == 42 && {|RS0030:Event1|} != null) {}
 
            {|RS0030:Method2()|};
            if ({|RS0030:Property2|} == 42 && {|RS0030:Event2|} != null) {}
        }
    }
}";
 
            var bannedText = @"M:N.C1.Method1
P:N.C1.Property1
E:N.C1.Event1
M:N.C1.Method2
P:N.C1.Property2
E:N.C1.Event2";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText);
        }
 
        [Fact, WorkItem(3295, "https://github.com/dotnet/roslyn-analyzers/issues/3295")]
        public async Task CSharp_BannedAbstractVirtualMemberBansCorrectOverrides_MiddleLevelIsBannedAsync()
        {
            var source = @"
using System;
 
namespace N
{
    public abstract class C1
    {
        public abstract void Method1();
        public abstract int Property1 { get; set; }
        public abstract event Action Event1;
 
        public virtual void Method2() {}
        public virtual int Property2 { get; set; }
        public virtual event Action Event2;
    }
 
    public class C2 : C1
    {
        public override void Method1() {}
        public override int Property1 { get; set; }
        public override event Action Event1;
 
        public override void Method2()
        {
            base.Method2();
        }
 
        public override int Property2 { get; set; }
        public override event Action Event2;
 
        void M1()
        {
            {|RS0030:Method1()|};
            if ({|RS0030:Property1|} == 42 && {|RS0030:Event1|} != null) {}
 
            {|RS0030:Method2()|};
            if ({|RS0030:Property2|} == 42 && {|RS0030:Event2|} != null) {}
        }
    }
 
    public class C3 : C2
    {
        public override void Method1()
        {
            {|RS0030:base.Method1()|};
        }
 
        public override int Property1 { get; set; }
        public override event Action Event1;
 
        public override void Method2()
        {
            {|RS0030:base.Method2()|};
        }
 
        public override int Property2 { get; set; }
        public override event Action Event2;
 
        void M2()
        {
            {|RS0030:Method1()|};
            if ({|RS0030:Property1|} == 42 && {|RS0030:Event1|} != null) {}
 
            {|RS0030:Method2()|};
            if ({|RS0030:Property2|} == 42 && {|RS0030:Event2|} != null) {}
        }
    }
}";
 
            var bannedText = @"M:N.C2.Method1
P:N.C2.Property1
E:N.C2.Event1
M:N.C2.Method2
P:N.C2.Property2
E:N.C2.Event2";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText);
        }
 
        [Fact, WorkItem(3295, "https://github.com/dotnet/roslyn-analyzers/issues/3295")]
        public async Task CSharp_BannedAbstractVirtualMemberBansCorrectOverrides_LeafLevelIsBannedAsync()
        {
            var source = @"
using System;
 
namespace N
{
    public abstract class C1
    {
        public abstract void Method1();
        public abstract int Property1 { get; set; }
        public abstract event Action Event1;
 
        public virtual void Method2() {}
        public virtual int Property2 { get; set; }
        public virtual event Action Event2;
    }
 
    public class C2 : C1
    {
        public override void Method1() {}
        public override int Property1 { get; set; }
        public override event Action Event1;
 
        public override void Method2()
        {
            base.Method2();
        }
 
        public override int Property2 { get; set; }
        public override event Action Event2;
 
        void M1()
        {
            Method1();
            if (Property1 == 42 && Event1 != null) {}
 
            Method2();
            if (Property2 == 42 && Event2 != null) {}
        }
    }
 
    public class C3 : C2
    {
        public override void Method1()
        {
            base.Method1();
        }
 
        public override int Property1 { get; set; }
        public override event Action Event1;
 
        public override void Method2()
        {
            base.Method2();
        }
 
        public override int Property2 { get; set; }
        public override event Action Event2;
 
        void M2()
        {
            {|RS0030:Method1()|};
            if ({|RS0030:Property1|} == 42 && {|RS0030:Event1|} != null) {}
 
            {|RS0030:Method2()|};
            if ({|RS0030:Property2|} == 42 && {|RS0030:Event2|} != null) {}
        }
    }
}";
 
            var bannedText = @"M:N.C3.Method1
P:N.C3.Property1
E:N.C3.Event1
M:N.C3.Method2
P:N.C3.Property2
E:N.C3.Event2";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText);
        }
 
        [Fact]
        public async Task CSharp_InvalidOverrideDefinitionAsync()
        {
            var source = @"
using System;
 
namespace N
{
    public class C1
    {
        public void Method1() {}
    }
 
    public class C2 : C1
    {
        public override void {|CS0506:Method1|}() {}
 
        void M1()
        {
            Method1();
        }
    }
}";
 
            var bannedText = @"M:N.C1.Method1";
 
            await VerifyCSharpAnalyzerAsync(source, bannedText);
        }
 
        [Fact]
        public async Task VisualBasic_BannedApi_MultipleFiles()
        {
            var source = @"
Namespace N
    Class BannedA : End Class
    Class BannedB : End Class
    Class NotBanned : End Class
    Class C
        Sub M()
            Dim a As {|#0:New BannedA()|}
            Dim b As {|#1:New BannedB()|}
            Dim c As New NotBanned()
        End Sub
    End Class
End Namespace";
 
            var test = new VerifyVB.Test
            {
                TestState =
                {
                    Sources = { source },
                    AdditionalFiles =
                    {
                        ("BannedSymbols.txt", @"T:N.BannedA") ,
                        ("BannedSymbols.Other.txt", @"T:N.BannedB"),
                        ("OtherFile.txt", @"T:N.NotBanned")
                    },
                },
                ExpectedDiagnostics =
                {
                    GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "BannedA", ""),
                    GetBasicResultAt(1, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "BannedB", "")
                }
            };
 
            await test.RunAsync();
        }
 
        [Fact]
        public async Task VisualBasic_BannedType_ConstructorAsync()
        {
            var source = @"
Namespace N
    Class Banned : End Class
    Class C
        Sub M()
            Dim c As {|#0:New Banned()|}
        End Sub
    End Class
End Namespace";
 
            var bannedText = @"T:N.Banned";
 
            await VerifyBasicAnalyzerAsync(source, bannedText, GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Banned", ""));
        }
 
        [Fact]
        public async Task VisualBasic_BannedGenericType_ConstructorAsync()
        {
            var source = @"
Class C
    Sub M()
        Dim c = {|#0:New System.Collections.Generic.List(Of String)()|}
    End Sub
End Class";
 
            var bannedText = @"
T:System.Collections.Generic.List`1";
 
            await VerifyBasicAnalyzerAsync(source, bannedText, GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "List(Of T)", ""));
        }
 
        [Fact]
        public async Task VisualBasic_BannedNestedType_ConstructorAsync()
        {
            var source = @"
Class C
    Class Nested : End Class
    Sub M()
        Dim n As {|#0:New Nested()|}
    End Sub
End Class";
 
            var bannedText = @"
T:C.Nested";
 
            await VerifyBasicAnalyzerAsync(source, bannedText, GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C.Nested", ""));
        }
 
        [Fact]
        public async Task VisualBasic_BannedType_MethodOnNestedTypeAsync()
        {
            var source = @"
Class C
    Public Class Nested
        Public Shared Sub M() : End Sub
    End Class
End Class
 
Class D
    Sub M2()
        {|#0:C.Nested.M()|}
    End Sub
End Class
";
            var bannedText = @"
T:C";
 
            await VerifyBasicAnalyzerAsync(source, bannedText, GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""));
        }
 
        [Fact]
        public async Task VisualBasic_BannedInterface_MethodAsync()
        {
            var source = @"
Interface I
    Sub M()
End Interface
 
Class C
    Sub M()
        Dim i As I = Nothing
        {|#0:i.M()|}
    End Sub
End Class";
            var bannedText = @"T:I";
 
            await VerifyBasicAnalyzerAsync(source, bannedText, GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "I", ""));
        }
 
        [Fact]
        public async Task VisualBasic_BannedClass_PropertyAsync()
        {
            var source = @"
Class C
    Public Property P As Integer
    Sub M()
        {|#0:P|} = {|#1:P|}
    End Sub
End Class";
            var bannedText = @"T:C";
 
            await VerifyBasicAnalyzerAsync(source, bannedText,
                GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""),
                GetBasicResultAt(1, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""));
        }
 
        [Fact]
        public async Task VisualBasic_BannedClass_FieldAsync()
        {
            var source = @"
Class C
    Public F As Integer
    Sub M()
        {|#0:F|} = {|#1:F|}
    End Sub
End Class";
            var bannedText = @"T:C";
 
            await VerifyBasicAnalyzerAsync(source, bannedText,
                GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""),
                GetBasicResultAt(1, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""));
        }
 
        [Fact]
        public async Task VisualBasic_BannedClass_EventAsync()
        {
            var source = @"
Imports System
 
Class C
    public Event E As EventHandler
    Sub M()
        AddHandler {|#0:E|}, Nothing
        RemoveHandler {|#1:E|}, Nothing
        RaiseEvent {|#2:E|}(Me, EventArgs.Empty)
    End Sub
End Class";
            var bannedText = @"T:C";
 
            await VerifyBasicAnalyzerAsync(source, bannedText,
                GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""),
                GetBasicResultAt(1, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""),
                GetBasicResultAt(2, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""));
        }
 
        [Fact]
        public async Task VisualBasic_BannedClass_MethodGroupAsync()
        {
            var source = @"
Delegate Sub D()
Class C
    Sub M()
        Dim d as D = {|#0:AddressOf M|}
    End Sub
End Class";
            var bannedText = @"T:C";
 
            await VerifyBasicAnalyzerAsync(source, bannedText,
                GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""));
        }
 
        [Fact]
        public async Task VisualBasic_BannedAttribute_UsageOnTypeAsync()
        {
            var source = @"
Imports System
 
<AttributeUsage(AttributeTargets.All, Inherited:=true)>
Class BannedAttribute
    Inherits Attribute
End Class
 
<{|#0:Banned|}>
Class C
End Class
Class D
    Inherits C
End Class
";
            var bannedText = @"T:BannedAttribute";
 
            await VerifyBasicAnalyzerAsync(source, bannedText,
                GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "BannedAttribute", ""),
                GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "BannedAttribute", ""));
        }
 
        [Fact]
        public async Task VisualBasic_BannedAttribute_UsageOnMemberAsync()
        {
            var source = @"
Imports System
 
<AttributeUsage(System.AttributeTargets.All, Inherited:=True)>
Class BannedAttribute
    Inherits System.Attribute
End Class
 
Class C
    <{|#0:Banned|}>
    Public ReadOnly Property SomeProperty As Integer
End Class
";
            var bannedText = @"T:BannedAttribute";
 
            await VerifyBasicAnalyzerAsync(source, bannedText,
                GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "BannedAttribute", ""),
                GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "BannedAttribute", ""));
        }
 
        [Fact]
        public async Task VisualBasic_BannedAttribute_UsageOnAssemblyAsync()
        {
            var source = @"
Imports System
 
<{|#0:Assembly:BannedAttribute|}>
 
<AttributeUsage(AttributeTargets.All, Inherited:=True)>
Class BannedAttribute
    Inherits Attribute
End Class
";
 
            var bannedText = @"T:BannedAttribute";
 
            await VerifyBasicAnalyzerAsync(source, bannedText,
                GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "BannedAttribute", ""),
                GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "BannedAttribute", ""));
        }
 
        [Fact]
        public async Task VisualBasic_BannedAttribute_UsageOnModuleAsync()
        {
            var source = @"
Imports System
 
<{|#0:Module:BannedAttribute|}>
 
<AttributeUsage(AttributeTargets.All, Inherited:=True)>
Class BannedAttribute
    Inherits Attribute
End Class
";
 
            var bannedText = @"T:BannedAttribute";
 
            await VerifyBasicAnalyzerAsync(source, bannedText,
                GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "BannedAttribute", ""),
                GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "BannedAttribute", ""));
        }
 
        [Fact]
        public async Task VisualBasic_BannedConstructorAsync()
        {
            var source = @"
Namespace N
    Class Banned
        Sub New : End Sub
        Sub New(ByVal I As Integer) : End Sub
    End Class
    Class C
        Sub M()
            Dim c As {|#0:New Banned()|}
            Dim d As {|#1:New Banned(1)|}
        End Sub
    End Class
End Namespace";
 
            var bannedText1 = @"M:N.Banned.#ctor";
            var bannedText2 = @"M:N.Banned.#ctor(System.Int32)";
 
            await VerifyBasicAnalyzerAsync(
                source,
                bannedText1,
                GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Public Sub New()", ""));
 
            await VerifyBasicAnalyzerAsync(
                source,
                bannedText2,
                GetBasicResultAt(1, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Public Sub New(I As Integer)", ""));
        }
 
        [Fact]
        public async Task VisualBasic_BannedConstructor_AttributeAsync()
        {
            var source = @"
Imports System
 
<AttributeUsage(System.AttributeTargets.All, Inherited:=True)>
Class BannedAttribute
    Inherits System.Attribute
 
    Sub New : End Sub
    Sub New(ByVal Banned As Integer) : End Sub
    Sub New(ByVal NotBanned As String) : End Sub
End Class
 
Class C
    <{|#0:Banned|}>
    Public ReadOnly Property SomeProperty As Integer
 
    <{|#1:Banned(1)|}>
    Public Sub SomeMethod : End Sub
 
    <Banned("""")>
    Class D : End Class
End Class
";
            var bannedText1 = @"M:BannedAttribute.#ctor";
            var bannedText2 = @"M:BannedAttribute.#ctor(System.Int32)";
 
            await VerifyBasicAnalyzerAsync(
                source,
                bannedText1,
                GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Public Sub New()", ""),
                GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Public Sub New()", ""));
 
            await VerifyBasicAnalyzerAsync(
                source,
                bannedText2,
                GetBasicResultAt(1, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Public Sub New(Banned As Integer)", ""),
                GetBasicResultAt(1, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Public Sub New(Banned As Integer)", ""));
        }
 
        [Fact]
        public async Task VisualBasic_BannedMethodAsync()
        {
            var source = @"
Namespace N
    Class C
        Sub Banned : End Sub
        Sub Banned(ByVal I As Integer) : End Sub
        Sub M()
            {|#0:Me.Banned()|}
            {|#1:Me.Banned(1)|}
        End Sub
    End Class
End Namespace";
 
            var bannedText1 = @"M:N.C.Banned";
            var bannedText2 = @"M:N.C.Banned(System.Int32)";
 
            await VerifyBasicAnalyzerAsync(
                source,
                bannedText1,
                GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Public Sub Banned()", ""));
 
            await VerifyBasicAnalyzerAsync(
                source,
                bannedText2,
                GetBasicResultAt(1, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Public Sub Banned(I As Integer)", ""));
        }
 
        [Fact]
        public async Task VisualBasic_BannedPropertyAsync()
        {
            var source = @"
Namespace N
    Class C
        Public Property Banned As Integer
        Sub M()
            {|#0:Banned|} = {|#1:Banned|}
        End Sub
    End Class
End Namespace";
 
            var bannedText = @"P:N.C.Banned";
 
            await VerifyBasicAnalyzerAsync(
                source,
                bannedText,
                GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Public Property Banned As Integer", ""),
                GetBasicResultAt(1, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Public Property Banned As Integer", ""));
        }
 
        [Fact]
        public async Task VisualBasic_BannedFieldAsync()
        {
            var source = @"
Namespace N
    Class C
        Public Banned As Integer
        Sub M()
            {|#0:Banned|} = {|#1:Banned|}
        End Sub
    End Class
End Namespace";
 
            var bannedText = @"F:N.C.Banned";
 
            await VerifyBasicAnalyzerAsync(
                source,
                bannedText,
                GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Public Banned As Integer", ""),
                GetBasicResultAt(1, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Public Banned As Integer", ""));
        }
 
        [Fact]
        public async Task VisualBasic_BannedEventAsync()
        {
            var source = @"
Namespace N
    Class C
        Public Event Banned As System.Action
        Sub M()
            AddHandler {|#0:Banned|}, Nothing
            RemoveHandler {|#1:Banned|}, Nothing
            RaiseEvent {|#2:Banned|}()
        End Sub
    End Class
End Namespace";
 
            var bannedText = @"E:N.C.Banned";
 
            await VerifyBasicAnalyzerAsync(
                source,
                bannedText,
                GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Public Event Banned As Action", ""),
                GetBasicResultAt(1, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Public Event Banned As Action", ""),
                GetBasicResultAt(2, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Public Event Banned As Action", ""));
        }
 
        [Fact]
        public async Task VisualBasic_BannedMethodGroupAsync()
        {
            var source = @"
Namespace N
    Class C
        Public Sub Banned() : End Sub
        Sub M()
            Dim b As System.Action = {|#0:AddressOf Banned|}
        End Sub
    End Class
End Namespace";
 
            var bannedText = @"M:N.C.Banned";
 
            await VerifyBasicAnalyzerAsync(
                source,
                bannedText,
                GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "Public Sub Banned()", ""));
        }
 
        [Fact]
        public async Task VisualBasic_BannedClass_DocumentationReferenceAsync()
        {
            var source = @"
Class C : End Class
 
''' <summary><see cref=""{|#0:C|}"" /></summary>
Class D : End Class
";
            var bannedText = @"T:C";
 
            await VerifyBasicAnalyzerAsync(source, bannedText,
                GetBasicResultAt(0, SymbolIsBannedAnalyzer.SymbolIsBannedRule, "C", ""));
        }
 
        [Fact, WorkItem(3295, "https://github.com/dotnet/roslyn-analyzers/issues/3295")]
        public async Task VisualBasic_BannedAbstractVirtualMemberAlsoBansOverrides_RootLevelIsBannedAsync()
        {
            var source = @"
Imports System
 
Namespace N
    Public MustInherit Class C1
        Public MustOverride Sub Method1()
        Public MustOverride Property Property1 As Integer
 
        Public Overridable Sub Method2()
        End Sub
 
        Public Overridable Property Property2 As Integer
    End Class
 
    Public Class C2
        Inherits C1
 
        Public Overrides Sub Method1()
        End Sub
 
        Public Overrides Property Property1 As Integer
 
        Public Overrides Sub Method2()
            {|RS0030:MyBase.Method2()|}
        End Sub
 
        Public Overrides Property Property2 As Integer
 
        Private Sub M1()
            {|RS0030:Method1()|}
 
            If {|RS0030:Property1|} = 42 Then
            End If
 
            {|RS0030:Method2()|}
 
            If {|RS0030:Property2|} = 42 Then
            End If
        End Sub
    End Class
 
    Public Class C3
        Inherits C2
 
        Public Overrides Sub Method1()
            {|RS0030:MyBase.Method1()|}
        End Sub
 
        Public Overrides Property Property1 As Integer
 
        Public Overrides Sub Method2()
            {|RS0030:MyBase.Method2()|}
        End Sub
 
        Public Overrides Property Property2 As Integer
 
        Private Sub M2()
            {|RS0030:Method1()|}
 
            If {|RS0030:Property1|} = 42 Then
            End If
 
            {|RS0030:Method2()|}
 
            If {|RS0030:Property2|} = 42 Then
            End If
        End Sub
    End Class
End Namespace
";
 
            var bannedText = @"M:N.C1.Method1
P:N.C1.Property1
E:N.C1.Event1
M:N.C1.Method2
P:N.C1.Property2
E:N.C1.Event2";
 
            await VerifyBasicAnalyzerAsync(source, bannedText);
        }
 
        [Fact, WorkItem(3295, "https://github.com/dotnet/roslyn-analyzers/issues/3295")]
        public async Task VisualBasic_BannedAbstractVirtualMemberAlsoBansOverrides_MiddleLevelIsBannedAsync()
        {
            var source = @"
Imports System
 
Namespace N
    Public MustInherit Class C1
        Public MustOverride Sub Method1()
        Public MustOverride Property Property1 As Integer
 
        Public Overridable Sub Method2()
        End Sub
 
        Public Overridable Property Property2 As Integer
    End Class
 
    Public Class C2
        Inherits C1
 
        Public Overrides Sub Method1()
        End Sub
 
        Public Overrides Property Property1 As Integer
 
        Public Overrides Sub Method2()
            MyBase.Method2()
        End Sub
 
        Public Overrides Property Property2 As Integer
 
        Private Sub M1()
            {|RS0030:Method1()|}
 
            If {|RS0030:Property1|} = 42 Then
            End If
 
            {|RS0030:Method2()|}
 
            If {|RS0030:Property2|} = 42 Then
            End If
        End Sub
    End Class
 
    Public Class C3
        Inherits C2
 
        Public Overrides Sub Method1()
            {|RS0030:MyBase.Method1()|}
        End Sub
 
        Public Overrides Property Property1 As Integer
 
        Public Overrides Sub Method2()
            {|RS0030:MyBase.Method2()|}
        End Sub
 
        Public Overrides Property Property2 As Integer
 
        Private Sub M2()
            {|RS0030:Method1()|}
 
            If {|RS0030:Property1|} = 42 Then
            End If
 
            {|RS0030:Method2()|}
 
            If {|RS0030:Property2|} = 42 Then
            End If
        End Sub
    End Class
End Namespace
";
 
            var bannedText = @"M:N.C2.Method1
P:N.C2.Property1
E:N.C2.Event1
M:N.C2.Method2
P:N.C2.Property2
E:N.C2.Event2";
 
            await VerifyBasicAnalyzerAsync(source, bannedText);
        }
 
        [Fact, WorkItem(3295, "https://github.com/dotnet/roslyn-analyzers/issues/3295")]
        public async Task VisualBasic_BannedAbstractVirtualMemberAlsoBansOverrides_LeafLevelIsBannedAsync()
        {
            var source = @"
Imports System
 
Namespace N
    Public MustInherit Class C1
        Public MustOverride Sub Method1()
        Public MustOverride Property Property1 As Integer
 
        Public Overridable Sub Method2()
        End Sub
 
        Public Overridable Property Property2 As Integer
    End Class
 
    Public Class C2
        Inherits C1
 
        Public Overrides Sub Method1()
        End Sub
 
        Public Overrides Property Property1 As Integer
 
        Public Overrides Sub Method2()
            MyBase.Method2()
        End Sub
 
        Public Overrides Property Property2 As Integer
 
        Private Sub M1()
            Method1()
 
            If Property1 = 42 Then
            End If
 
            Method2()
 
            If Property2 = 42 Then
            End If
        End Sub
    End Class
 
    Public Class C3
        Inherits C2
 
        Public Overrides Sub Method1()
            MyBase.Method1()
        End Sub
 
        Public Overrides Property Property1 As Integer
 
        Public Overrides Sub Method2()
            MyBase.Method2()
        End Sub
 
        Public Overrides Property Property2 As Integer
 
        Private Sub M2()
            {|RS0030:Method1()|}
 
            If {|RS0030:Property1|} = 42 Then
            End If
 
            {|RS0030:Method2()|}
 
            If {|RS0030:Property2|} = 42 Then
            End If
        End Sub
    End Class
End Namespace
";
 
            var bannedText = @"M:N.C3.Method1
P:N.C3.Property1
E:N.C3.Event1
M:N.C3.Method2
P:N.C3.Property2
E:N.C3.Event2";
 
            await VerifyBasicAnalyzerAsync(source, bannedText);
        }
 
        #endregion
    }
}