예제 #1
0
 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);
 }
예제 #2
0
 private static IInvocationExpression GetExpressionByInvokedExpressionData(
     InvokedExpressionData invokedExpressionData)
 {
     var sourceFile = invokedExpressionData.PsiSourceFile;
     if (sourceFile == null)
         return null;
     return InvokedExpressionData.GetNodeByOffset<IInvocationExpression>(sourceFile, invokedExpressionData.Offset);
 }
예제 #3
0
        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);
            }
        }