private void Analyze(SymbolAnalysisContext context) { if (context.IsGenerated()) { return; } var type = (INamedTypeSymbol)context.Symbol; if (type.TypeKind != TypeKind.Class) { return; } if (!IsAttribute(type)) { return; } if (type.IsAbstract || type.IsSealed) { return; } context.ReportDiagnostic(Diagnostic.Create(Rule, type.Locations[0], type.Name)); }
private static void Analyze(SymbolAnalysisContext context) { if (context.IsGenerated()) return; var symbol = (INamedTypeSymbol)context.Symbol; if (symbol.TypeKind != TypeKind.Class) return; if (!symbol.Interfaces.Any(i => i.SpecialType == SpecialType.System_IDisposable)) return; if (symbol.IsSealed && !ContainsUserDefinedFinalizer(symbol)) return; if (!ContainsNonPrivateConstructors(symbol)) return; var disposeMethod = FindDisposeMethod(symbol); if (disposeMethod == null) return; var syntaxTree = disposeMethod.DeclaringSyntaxReferences[0]?.GetSyntax(); var statements = ((MethodDeclarationSyntax)syntaxTree)?.Body?.Statements.OfType<ExpressionStatementSyntax>(); if (statements != null) { foreach (var statement in statements) { var invocation = statement.Expression as InvocationExpressionSyntax; var method = invocation?.Expression as MemberAccessExpressionSyntax; var identifierSyntax = method?.Expression as IdentifierNameSyntax; if (identifierSyntax != null && identifierSyntax.Identifier.ToString() == "GC" && method.Name.ToString() == "SuppressFinalize") return; } } context.ReportDiagnostic(Diagnostic.Create(Rule, disposeMethod.Locations[0], symbol.Name)); }
private void AnalyzeField(SymbolAnalysisContext context) { if (context.IsGenerated()) { return; } var fieldSymbol = (IFieldSymbol)context.Symbol; if (!fieldSymbol.Type.AllInterfaces.Any(i => i.ToString() == "System.IDisposable") && fieldSymbol.Type.ToString() != "System.IDisposable") { return; } var fieldSyntaxRef = fieldSymbol.DeclaringSyntaxReferences.FirstOrDefault(); var variableDeclarator = fieldSyntaxRef.GetSyntax() as VariableDeclaratorSyntax; if (variableDeclarator == null) { return; } if (ContainingTypeImplementsIDisposableAndCallsItOnTheField(context, fieldSymbol, fieldSymbol.ContainingType)) { return; } if (variableDeclarator.Initializer?.Value is InvocationExpressionSyntax) { context.ReportDiagnostic(Diagnostic.Create(RuleForReturned, variableDeclarator.GetLocation(), fieldSymbol.Name)); } else if (variableDeclarator.Initializer?.Value is ObjectCreationExpressionSyntax) { context.ReportDiagnostic(Diagnostic.Create(RuleForCreated, variableDeclarator.GetLocation(), fieldSymbol.Name)); } }
private static void Analyze(SymbolAnalysisContext context) { if (context.IsGenerated()) return; var type = (INamedTypeSymbol)context.Symbol; if (type.TypeKind != TypeKind.Class) return; if (!IsAttribute(type)) return; if (type.IsAbstract || type.IsSealed) return; context.ReportDiagnostic(Diagnostic.Create(Rule, type.Locations[0], type.Name)); }
private static void Analyze(SymbolAnalysisContext context) { if (context.IsGenerated()) { return; } var symbol = (INamedTypeSymbol)context.Symbol; if (symbol.TypeKind != TypeKind.Class) { return; } if (!symbol.Interfaces.Any(i => i.SpecialType == SpecialType.System_IDisposable)) { return; } if (symbol.IsSealed && !ContainsUserDefinedFinalizer(symbol)) { return; } if (!ContainsNonPrivateConstructors(symbol)) { return; } var disposeMethod = FindDisposeMethod(symbol); if (disposeMethod == null) { return; } var syntaxTree = disposeMethod.DeclaringSyntaxReferences[0]?.GetSyntax(); var statements = ((MethodDeclarationSyntax)syntaxTree)?.Body?.Statements.OfType <ExpressionStatementSyntax>(); if (statements != null) { foreach (var statement in statements) { var invocation = statement.Expression as InvocationExpressionSyntax; var method = invocation?.Expression as MemberAccessExpressionSyntax; var identifierSyntax = method?.Expression as IdentifierNameSyntax; if (identifierSyntax != null && identifierSyntax.Identifier.ToString() == "GC" && method.Name.ToString() == "SuppressFinalize") { return; } } } context.ReportDiagnostic(Diagnostic.Create(Rule, disposeMethod.Locations[0], symbol.Name)); }
private static void AnalyzeField(SymbolAnalysisContext context) { if (context.IsGenerated()) return; var fieldSymbol = (IFieldSymbol)context.Symbol; if (!fieldSymbol.Type.AllInterfaces.Any(i => i.ToString() == "System.IDisposable") && fieldSymbol.Type.ToString() != "System.IDisposable") return; var fieldSyntaxRef = fieldSymbol.DeclaringSyntaxReferences.FirstOrDefault(); var variableDeclarator = fieldSyntaxRef.GetSyntax() as VariableDeclaratorSyntax; if (variableDeclarator == null) return; if (ContainingTypeImplementsIDisposableAndCallsItOnTheField(context, fieldSymbol, fieldSymbol.ContainingType)) return; var props = new Dictionary<string, string> { { "variableIdentifier", variableDeclarator.Identifier.ValueText } }.ToImmutableDictionary(); if (variableDeclarator.Initializer?.Value is InvocationExpressionSyntax) context.ReportDiagnostic(Diagnostic.Create(RuleForReturned, variableDeclarator.GetLocation(), props, fieldSymbol.Name)); else if (variableDeclarator.Initializer?.Value is ObjectCreationExpressionSyntax) context.ReportDiagnostic(Diagnostic.Create(RuleForCreated, variableDeclarator.GetLocation(), props, fieldSymbol.Name)); }
private static void AnalyzeSymbol(SymbolAnalysisContext context) { if (context.IsGenerated()) { return; } var namedTypeSymbol = (IPropertySymbol)context.Symbol; var properties = GetPropsWithOnlyGettersAndReadonlyBackingField(namedTypeSymbol, context); if (properties == null) { return; } var diagnostic = Diagnostic.Create(Rule, properties.Locations[0], properties.Name); context.ReportDiagnostic(diagnostic); }
private async void AnalyzeAsync(SymbolAnalysisContext context) { if (context.IsGenerated()) { return; } var symbol = (INamedTypeSymbol)context.Symbol; if (symbol.TypeKind != TypeKind.Class && symbol.TypeKind != TypeKind.Struct) { return; } if (!symbol.Interfaces.Any(i => i.SpecialType == SpecialType.System_IDisposable)) { return; } var disposeMethod = FindDisposeMethod(symbol); if (disposeMethod == null) { return; } var syntaxTree = await disposeMethod.DeclaringSyntaxReferences[0]?.GetSyntaxAsync(context.CancellationToken); var statements = ((MethodDeclarationSyntax)syntaxTree)?.Body?.Statements.OfType <ExpressionStatementSyntax>(); if (statements != null) { foreach (var statement in statements) { var invocation = statement.Expression as InvocationExpressionSyntax; var method = invocation?.Expression as MemberAccessExpressionSyntax; if (method != null && ((IdentifierNameSyntax)method.Expression).Identifier.ToString() == "GC" && method.Name.ToString() == "SuppressFinalize") { return; } } } context.ReportDiagnostic(Diagnostic.Create(Rule, disposeMethod.Locations[0], symbol.Name)); }