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); }
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); }