Esempio n. 1
0
        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));
        }
Esempio n. 3
0
        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));
 }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
        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));
        }