public override CSharpPostfixExpressionContext FixExpression(CSharpPostfixExpressionContext context)
        {
            var psiServices     = Reference.GetPsiServices();
            var expressionRange = ExecutionContext.GetDocumentRange(context.Expression);
            var referenceRange  = ExecutionContext.GetDocumentRange(Reference);

            var textWithReference = expressionRange.SetEndTo(referenceRange.TextRange.EndOffset).GetText();

            var indexOfReferenceDot = textWithReference.LastIndexOf('.');

            if (indexOfReferenceDot <= 0)
            {
                return(context);
            }

            var realReferenceRange = referenceRange.SetStartTo(expressionRange.TextRange.StartOffset + indexOfReferenceDot);

            var transactionManager = psiServices.Transactions.DocumentTransactionManager;
            var document           = expressionRange.Document;

            // todo: make sure this is not in undo stack!
            using (transactionManager.CreateTransactionCookie(DefaultAction.Commit, FixCommandName))
            {
                document.ReplaceText(realReferenceRange.TextRange, ")");
                document.InsertText(expressionRange.TextRange.StartOffset, "unchecked(");
            }

            //using (psiServices.Solution.CreateTransactionCookie(DefaultAction.Commit, FixCommandName, NullProgressIndicator.Instance))
            //{
            //
            //}

            psiServices.Files.CommitAllDocuments();

            var uncheckedExpression = TextControlToPsi.GetElement <IUncheckedExpression>(psiServices.Solution, document, expressionRange.TextRange.StartOffset + 1);

            if (uncheckedExpression == null)
            {
                return(context);
            }

            var operand = uncheckedExpression.Operand;

            psiServices.Transactions.Execute(FixCommandName, () =>
            {
                LowLevelModificationUtil.DeleteChild(operand);
                LowLevelModificationUtil.ReplaceChildRange(uncheckedExpression, uncheckedExpression, operand);
            });

            Assertion.Assert(operand.IsPhysical(), "operand.IsPhysical()");

            return(new CSharpPostfixExpressionContext(this, operand));
        }
Esempio n. 2
0
        public override CSharpPostfixExpressionContext FixExpression(CSharpPostfixExpressionContext context)
        {
            var expression = context.Expression;

            if (expression.Contains(Reference)) // x is T.bar => x is T
            {
                var psiServices = expression.GetPsiServices();
                psiServices.Transactions.Execute(FixCommandName, () =>
                {
                    var referenceName = (IReferenceName)Reference;
                    var qualifier     = referenceName.Qualifier;

                    LowLevelModificationUtil.DeleteChild(qualifier); // remove first
                    LowLevelModificationUtil.ReplaceChildRange(referenceName, referenceName, qualifier);
                });
            }

            return(context);
        }
        public override CSharpPostfixExpressionContext FixExpression(CSharpPostfixExpressionContext context)
        {
            var referenceExpression = (IReferenceExpression)Reference;

            var expression = context.Expression;

            if (expression.Parent == referenceExpression) // foo.bar => foo
            {
                var psiServices = expression.GetPsiServices();

                psiServices.Transactions.Execute(FixCommandName, () =>
                {
                    LowLevelModificationUtil.DeleteChild(expression);
                    LowLevelModificationUtil.ReplaceChildRange(referenceExpression, referenceExpression, expression);
                });

                Assertion.Assert(expression.IsPhysical(), "expression.IsPhysical()");
                return(new CSharpPostfixExpressionContext(this, expression));
            }

            if (expression.Contains(referenceExpression)) // boo > foo.bar => boo > foo
            {
                var qualifier   = referenceExpression.QualifierExpression;
                var psiServices = expression.GetPsiServices();

                psiServices.Transactions.Execute(FixCommandName, () =>
                {
                    LowLevelModificationUtil.DeleteChild(qualifier);
                    LowLevelModificationUtil.ReplaceChildRange(referenceExpression, referenceExpression, qualifier);
                });

                Assertion.AssertNotNull(qualifier, "qualifier != null");
                Assertion.Assert(qualifier.IsPhysical(), "qualifier.IsPhysical()");
            }

            return(context);
        }
        private IList <CSharpPostfixExpressionContext> BuildExpressions(
            [NotNull] ITreeNode reference, [CanBeNull] out CSharpPostfixExpressionContext typeContext)
        {
            // build expression contexts
            var expressionContexts  = new List <CSharpPostfixExpressionContext>();
            var endOffset           = ToDocumentRange(reference).TextRange.EndOffset;
            var previousStartOffset = -1;

            for (ITreeNode node = myInnerExpression; node != null; node = node.Parent)
            {
                if (node is ICSharpStatement)
                {
                    break;
                }

                var expression = node as ICSharpExpression;
                if (expression == null || expression == reference)
                {
                    continue;
                }

                var expressionRange = ExecutionContext.GetDocumentRange(expression);
                if (!expressionRange.IsValid())
                {
                    break; // stop when out of generated
                }
                if (expressionRange.TextRange.EndOffset > endOffset)
                {
                    break; // stop when 'a.var + b'
                }
                if (expressionRange.TextRange.StartOffset == previousStartOffset)
                {
                    break; // track start offset is changes when we are going up
                }
                previousStartOffset = expressionRange.TextRange.StartOffset;

                // skip relational expressions like this: 'List<int.{here}>'
                if (CSharpPostfixUtis.IsRelationalExpressionWithTypeOperand(expression))
                {
                    continue;
                }

                var expressionContext = new CSharpPostfixExpressionContext(this, expression);
                if (expressionContext.ReferencedElement is ITypeElement)
                {
                    // skip types that are parts of 'List<T.>'-like expressions
                    if (!CSharpPostfixUtis.CanTypeBecameExpression(myInnerExpression))
                    {
                        continue;
                    }
                    if (myTypeExpression != null)
                    {
                        break;                       // should never happens
                    }
                    typeContext = expressionContext; // yeah, time to stop
                    return(EmptyList <CSharpPostfixExpressionContext> .InstanceList);
                }

                expressionContexts.Add(expressionContext);

                if (expressionContext.CanBeStatement)
                {
                    break;
                }
            }

            typeContext = null;
            return(expressionContexts.AsReadOnly());
        }
 public virtual CSharpPostfixExpressionContext FixExpression([NotNull] CSharpPostfixExpressionContext context)
 {
     return(context);
 }