private static void SaveInvocationData(ControlFlowElementData data, IVariableDeclaration variable, byte position, string name, int offset, IPsiSourceFile sourceFile) { data[variable] = VariableDisposeStatus.DependsOnInvocation; var invokedExpression = new InvokedExpressionData(name, offset, position, sourceFile); data.InvokedExpressions.Add(variable, invokedExpression); }
private static IInvocationExpression GetExpressionByInvokedExpressionData( InvokedExpressionData invokedExpressionData) { var sourceFile = invokedExpressionData.PsiSourceFile; if (sourceFile == null) return null; return InvokedExpressionData.GetNodeByOffset<IInvocationExpression>(sourceFile, invokedExpressionData.Offset); }
private void ProcessSimpleInvocation([NotNull] IInvocationExpression invocationExpression, ControlFlowElementData data, [CanBeNull] IVariableDeclaration qualifierDisposableVariableDeclaration, bool isInvocationOnDisposableThis) { var positions = new Dictionary<IVariableDeclaration, byte>(); var thisPositions = new List<byte>(); CalculatePositionOfDisposableVariables(invocationExpression, data, thisPositions, positions); if (!positions.Any() && !thisPositions.Any() && qualifierDisposableVariableDeclaration == null && !isInvocationOnDisposableThis) return; var referenceExpression = invocationExpression.InvokedExpression as IReferenceExpression; if (referenceExpression == null) return; var nameIdentifier = referenceExpression.NameIdentifier; if (nameIdentifier == null) return; var name = nameIdentifier.Name; var offset = InvokedExpressionData.GetOffsetByNode(invocationExpression); var sourceFile = invocationExpression.GetSourceFile(); foreach (var position in positions) SaveInvocationData(data, position.Key, position.Value, name, offset, sourceFile); //this в качестве аргумента if (thisPositions.Any()) data.ThisStatus = VariableDisposeStatus.DependsOnInvocation; foreach (var position in thisPositions) { var invokedExpression = new InvokedExpressionData(name, offset, position, sourceFile); data.ThisInvokedExpressions.Add(invokedExpression); } //обработка qualifierVariableDeclaration, в том числе this if (qualifierDisposableVariableDeclaration != null) SaveInvocationData(data, qualifierDisposableVariableDeclaration, 0, name, offset, sourceFile); else if (isInvocationOnDisposableThis) { data.ThisStatus = VariableDisposeStatus.DependsOnInvocation; var invokedExpression = new InvokedExpressionData(name, offset, 0, sourceFile); data.ThisInvokedExpressions.Add(invokedExpression); } }