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