private static void CheckIfObjectCreationTracksNode(CustomAnalysisContext context, ObjectCreationExpressionSyntax objectCreation)
        {
            var t = context.SemanticModel.GetReturnTypeOf(objectCreation);

            if (t == null)
            {
                return;           //return type could not be determined
            }
            if (Detector.IsTrackedType(t, objectCreation, context.SemanticModel))
            {
                return;
            }

            context.ReportNotDisposedAnonymousObject();
        }
Esempio n. 2
0
        private void AnalyseNodeInArgumentList(SyntaxNodeAnalysisContext context,
                                               SyntaxNode node, DisposableSource source)
        {
            var objectCreation = node.Parent.Parent.Parent as ObjectCreationExpressionSyntax;
            var t = context.SemanticModel.GetReturnTypeOf(objectCreation);

            if (t == null)
            {
                return;           //return type could not be determind
            }
            if (Detector.IsTrackedType(t, objectCreation, context.SemanticModel))
            {
                return;
            }

            var rule = GetRule(DiagnosticId, CurrentSeverity);

            context.ReportNotDisposedAnonymousObject(rule, source);
        }
        private static void AnalyseNodeWithinLocalDeclaration(SyntaxNodeAnalysisContext context,
                                                              SyntaxNode node, string identifier)
        {
            SyntaxNode parentScope;//lamda or ctor or method

            if (!node.TryFindParentScope(out parentScope))
            {
                return;
            }

            var usings = parentScope.DescendantNodes <UsingStatementSyntax>()
                         .SelectMany(@using => @using.DescendantNodes <IdentifierNameSyntax>())
                         .Where(id => identifier != null && (string)id.Identifier.Value == identifier)
                         .ToArray();

            if (usings.Any())
            {
                if (usings.Any(id => id.Parent is UsingStatementSyntax)) //using(mem))
                {
                    return;
                }
                var isTracked = usings
                                .Select(id => id.Parent?.Parent?.Parent)
                                .Where(parent => parent is ObjectCreationExpressionSyntax)
                                .Any(ocs =>
                {
                    var sym   = context.SemanticModel.GetSymbolInfo(ocs);
                    var type2 = (sym.Symbol as IMethodSymbol)?.ReceiverType as INamedTypeSymbol;

                    return(Detector.IsTrackedType(type2, ocs as ObjectCreationExpressionSyntax, context.SemanticModel));
                });
                if (isTracked)
                {
                    return;
                }

                context.ReportNotDisposedLocalDeclaration();
                return;
            }
            var invokationExpression = parentScope.DescendantNodes <InvocationExpressionSyntax>().ToArray();

            if (invokationExpression.Any(ies => identifier != null && ies.IsCallToDispose(identifier)))
            {
                return;
            }
            foreach (var ies in invokationExpression)
            {
                if (identifier != null && ies.IsCallToDispose(identifier))
                {
                    return;
                }
            }

            if (parentScope.DescendantNodes <ObjectCreationExpressionSyntax>().Any(oce => {
                return(oce.ArgumentList.Arguments.Any(arg => {
                    var expression = arg.Expression as IdentifierNameSyntax;
                    var isPartOfObjectcreation = expression?.Identifier.Text == identifier;
                    if (!isPartOfObjectcreation)
                    {
                        return false;
                    }

                    //check if is tracking instance
                    var sym = context.SemanticModel.GetSymbolInfo(oce);
                    var type2 = (sym.Symbol as IMethodSymbol)?.ReceiverType as INamedTypeSymbol;

                    return Detector.IsTrackedType(type2, oce, context.SemanticModel);
                }));
            }))
            {
                return;
            }

            context.ReportNotDisposedLocalDeclaration();
        }