예제 #1
0
        public void SimpleInvocation(string sourceText, int locationStart)
        {
            var tree        = CSharpSyntaxTree.ParseText(sourceText);
            var mscorlib    = MetadataReference.CreateFromFile(typeof(object).Assembly.Location);
            var compilation = CSharpCompilation.Create("Compilation", new[] { tree }, new[] { mscorlib });

            var classDeclaration = tree.GetRoot().DescendantNodesAndSelf().OfType <ClassDeclarationSyntax>().First();
            var semanticModel    = compilation.GetSemanticModel(tree);
            var namedSymbol      = semanticModel.GetDeclaredSymbol(classDeclaration);

            var expectedLocation = Location.Create(classDeclaration?.SyntaxTree, TextSpan.FromBounds(locationStart, locationStart + 9));
            var diagnostic       = _diagnosticFormatter.CreateDiagnostics(_rule, namedSymbol)
                                   .Single();

            Assert.AreEqual(expectedLocation, diagnostic.Location);
            Assert.AreEqual("ClassName", diagnostic.GetMessage());
        }
        /// <inheritdoc />
        public override void Initialize(AnalysisContext context)
        {
            context.EnableConcurrentExecution();
            context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);

            context.RegisterSymbolAction(symbolAnalysisContext =>
            {
                var namedTypeSymbol = symbolAnalysisContext.Symbol as INamedTypeSymbol;
                if (namedTypeSymbol == null || namedTypeSymbol.IsAbstract)
                {
                    return;
                }

                var baseTypeSymbol = namedTypeSymbol.BaseType;
                if (baseTypeSymbol == null || !baseTypeSymbol.ToString().Equals("System.Web.UI.Page"))
                {
                    return;
                }

                var diagnostics = DiagnosticFormatter.CreateDiagnostics(Rule, namedTypeSymbol);
                symbolAnalysisContext.ReportDiagnostics(diagnostics);
            }, SymbolKind.NamedType);
        }
예제 #3
0
        private static void Analyze(SymbolAnalysisContext symbolAnalysisContext)
        {
            var namedTypeSymbol = (INamedTypeSymbol)symbolAnalysisContext.Symbol;

            if (namedTypeSymbol == null ||
                namedTypeSymbol.IsAbstract ||
                namedTypeSymbol.IsNested())
            {
                return;
            }

            // Symbol is defined in multiple locations if it is a partial class -- all locations need to be checked
            var symbolFilePaths    = namedTypeSymbol.Locations.Select(location => location?.SourceTree?.FilePath).ToArray();
            var isInWebPartsFolder = symbolFilePaths.Any(SolutionFolders.FileIsInWebPartsFolder);

            if (!isInWebPartsFolder)
            {
                return;
            }

            var isUiWebPart          = symbolFilePaths.Any(SolutionFolders.IsUIWebPart);
            var allowedBaseTypeNames = isUiWebPart ? UiWebPartBases : WebPartBases;
            var ruleToBeUsed         = isUiWebPart ? UiWebPartRule : WebPartRule;

            var extendsOnlyObject = namedTypeSymbol.ExtendsOnlyObject();
            var inheritsFromOneOfRequiredTypes = InheritsFromOneOfRequiredTypes(allowedBaseTypeNames, namedTypeSymbol);

            if (extendsOnlyObject || inheritsFromOneOfRequiredTypes)
            {
                return;
            }

            var diagnostics = DiagnosticFormatter.CreateDiagnostics(ruleToBeUsed, namedTypeSymbol);

            symbolAnalysisContext.ReportDiagnostics(diagnostics);
        }