public override object VisitAssignmentExpression(AssignmentExpression assignmentExpression, object data)
            {
//				Console.WriteLine ("AssignmentExpression");
                IntegrateTemporaryVariableVisitorOptions options = (IntegrateTemporaryVariableVisitorOptions)data;

//				Console.WriteLine (assignmentExpression.ToString ());
                if (IsExpressionToReplace(assignmentExpression.Left, (IntegrateTemporaryVariableVisitorOptions)data))
                {
//					Console.WriteLine ("Assignment Left");
                    throw new IntegrateTemporaryVariableAssignmentException();
                }
                else
                {
//					Console.WriteLine ("Assignment not to replace");
                    assignmentExpression.Left.AcceptVisitor(this, data);
                }
                if (IsExpressionToReplace(assignmentExpression.Right, (IntegrateTemporaryVariableVisitorOptions)data))
                {
                    options.Changes.Add(ReplaceExpression(assignmentExpression.Right, options.Initializer, options));
                    return(null);
                }
                else
                {
                    return(assignmentExpression.Right.AcceptVisitor(this, data));
                }
            }
            public override object VisitInvocationExpression(InvocationExpression e, object data)
            {
                IntegrateTemporaryVariableVisitorOptions options = (IntegrateTemporaryVariableVisitorOptions)data;

                if (IsExpressionToReplace(e.TargetObject, options))
                {
                    if (IsUnary(options.Initializer))
                    {
                        options.Changes.Add(ReplaceExpression(e.TargetObject, options.Initializer, options));
                    }
                    else
                    {
                        options.Changes.Add(ReplaceExpression(e.TargetObject, new ParenthesizedExpression(options.Initializer), options));
                    }
                }
                else
                {
                    e.TargetObject.AcceptVisitor(this, data);
                }

                foreach (Expression o in e.Arguments)
                {
                    o.AcceptVisitor(this, data);
                }
                return(null);
            }
Exemple #3
0
            public override object VisitConditionalExpression(ConditionalExpression expression, object data)
            {
                Console.WriteLine("ConditionalExpression");
                IntegrateTemporaryVariableVisitorOptions options = (IntegrateTemporaryVariableVisitorOptions)data;

                if (IsExpressionToReplace(expression.Condition, (IntegrateTemporaryVariableVisitorOptions)data))
                {
                    if (IsUnary(options.Initializer))
                    {
                        options.Changes.Add(ReplaceExpression(expression.Condition, options.Initializer, options));
                    }
                    else
                    {
                        options.Changes.Add(ReplaceExpression(expression.Condition, new ParenthesizedExpression(options.Initializer), options));
                    }
                }
                else
                {
                    expression.Condition.AcceptVisitor(this, data);
                }
                if (IsExpressionToReplace(expression.TrueExpression, (IntegrateTemporaryVariableVisitorOptions)data))
                {
                    if (!(options.Initializer is AssignmentExpression || options.Initializer is ConditionalExpression))
                    {
                        options.Changes.Add(ReplaceExpression(expression.TrueExpression, options.Initializer, options));
                    }
                    else
                    {
                        options.Changes.Add(ReplaceExpression(expression.TrueExpression, new ParenthesizedExpression(options.Initializer), options));
                    }
                }
                else
                {
                    expression.TrueExpression.AcceptVisitor(this, data);
                }
                if (IsExpressionToReplace(expression.FalseExpression, (IntegrateTemporaryVariableVisitorOptions)data))
                {
                    if (!(options.Initializer is AssignmentExpression || options.Initializer is ConditionalExpression))
                    {
                        options.Changes.Add(ReplaceExpression(expression.FalseExpression, options.Initializer, options));
                    }
                    else
                    {
                        options.Changes.Add(ReplaceExpression(expression.FalseExpression, new ParenthesizedExpression(options.Initializer), options));
                    }
                    return(null);
                }
                else
                {
                    return(expression.FalseExpression.AcceptVisitor(this, data));
                }
            }
            // ExpressionStatement, LockStatement can not be the parent of an IdentifierExpression

            public override object VisitAddressOfExpression(AddressOfExpression expression, object data)
            {
//				Console.WriteLine ("AddressOfExpression");
                IntegrateTemporaryVariableVisitorOptions options = (IntegrateTemporaryVariableVisitorOptions)data;

                if (IsExpressionToReplace(expression.Expression, options))
                {
                    // in this Case the integration is not valid
                    throw new IntegrateTemporaryVariableAddressOfException();
                }
                else
                {
                    return(base.VisitAddressOfExpression(expression, data));
                }
            }
Exemple #5
0
            public override object VisitLocalVariableDeclaration(LocalVariableDeclaration localVariableDeclaration, object data)
            {
                //				Console.WriteLine ("LocalVariableDeclaration: " + localVariableDeclaration.StartLocation.ToString () + " - " + localVariableDeclaration.EndLocation.ToString ());
                localVariableDeclaration.TypeReference.AcceptVisitor(this, data);
                foreach (VariableDeclaration o in localVariableDeclaration.Variables)
                {
                    if (o.Name == ((IntegrateTemporaryVariableVisitorOptions)data).GetName())
                    {
                        IntegrateTemporaryVariableVisitorOptions options = (IntegrateTemporaryVariableVisitorOptions)data;
                        options.Initializer = localVariableDeclaration.GetVariableDeclaration(((LocalVariable)options.Options.SelectedItem).Name).Initializer;
                        if (localVariableDeclaration.Variables.Count == 1)
                        {
                            TextReplaceChange change = new TextReplaceChange();
                            change.Description = string.Format(GettextCatalog.GetString("Deleting local variable declaration {0}"), options.GetName());
                            change.FileName    = options.Options.Document.FileName;

                            change.Offset = options.Options.Document.TextEditor.GetPositionFromLineColumn(localVariableDeclaration.StartLocation.Line + ((LocalVariable)options.Options.SelectedItem).DeclaringMember.BodyRegion.Start.Line, localVariableDeclaration.StartLocation.Column);
                            int end = options.Options.Document.TextEditor.GetPositionFromLineColumn(localVariableDeclaration.EndLocation.Line + ((LocalVariable)options.Options.SelectedItem).DeclaringMember.BodyRegion.Start.Line, localVariableDeclaration.EndLocation.Column);

                            change.RemovedChars = end - change.Offset;
                            change.InsertedText = "";
                            ((IntegrateTemporaryVariableVisitorOptions)data).Changes.Add(change);
                        }
                        else
                        {
                            TextReplaceChange change = new TextReplaceChange();
                            change.Description = string.Format(GettextCatalog.GetString("Deleting local variable declaration {0}"), options.GetName());
                            change.FileName    = options.Options.Document.FileName;

                            change.Offset = options.Options.Document.TextEditor.GetPositionFromLineColumn(localVariableDeclaration.StartLocation.Line + ((LocalVariable)options.Options.SelectedItem).DeclaringMember.BodyRegion.Start.Line, localVariableDeclaration.StartLocation.Column);
                            int end = options.Options.Document.TextEditor.GetPositionFromLineColumn(localVariableDeclaration.EndLocation.Line + ((LocalVariable)options.Options.SelectedItem).DeclaringMember.BodyRegion.Start.Line, localVariableDeclaration.EndLocation.Column);

                            change.RemovedChars = end - change.Offset;
                            localVariableDeclaration.Variables.Remove(localVariableDeclaration.GetVariableDeclaration(options.GetName()));
                            INRefactoryASTProvider provider = options.Options.GetASTProvider();
                            change.InsertedText = options.Options.GetWhitespaces(change.Offset) + provider.OutputNode(options.Options.Dom, localVariableDeclaration);
                            ((IntegrateTemporaryVariableVisitorOptions)data).Changes.Add(change);
                        }
                    }
                    else
                    {
                        o.AcceptVisitor(this, data);
                    }
                }
                return(null);
            }
            Change ReplaceExpression(Expression toReplace, Expression replaceWith, IntegrateTemporaryVariableVisitorOptions options)
            {
//				Console.WriteLine ("Replace");
                TextReplaceChange change = new TextReplaceChange();

                change.Description = string.Format(GettextCatalog.GetString("Substitute variable {0} with the Initializeexpression"), options.GetName());
                change.FileName    = options.Options.Document.FileName;

                change.Offset       = options.Options.Document.Editor.Document.LocationToOffset(toReplace.StartLocation.Line + ((LocalVariable)options.Options.SelectedItem).DeclaringMember.BodyRegion.Start.Line, toReplace.StartLocation.Column);
                change.RemovedChars = options.GetName().Length;

                INRefactoryASTProvider provider = options.Options.GetASTProvider();

                change.InsertedText = provider.OutputNode(options.Options.Dom, replaceWith);

//				Console.WriteLine ("Replace done");
                return(change);
            }
            public override object VisitMemberReferenceExpression(MemberReferenceExpression e, object data)
            {
                IntegrateTemporaryVariableVisitorOptions options = (IntegrateTemporaryVariableVisitorOptions)data;

                if (IsExpressionToReplace(e.TargetObject, options))
                {
                    if (IsUnary(options.Initializer))
                    {
                        options.Changes.Add(ReplaceExpression(e.TargetObject, options.Initializer, options));
                    }
                    else
                    {
                        options.Changes.Add(ReplaceExpression(e.TargetObject, new ParenthesizedExpression(options.Initializer), options));
                    }
                    return(null);
                }
                else
                {
                    return(e.TargetObject.AcceptVisitor(this, data));
                }
            }
            public override object VisitUnaryOperatorExpression(UnaryOperatorExpression expression, object data)
            {
                Console.WriteLine("UnaryOperatorExpression");
                IntegrateTemporaryVariableVisitorOptions options = (IntegrateTemporaryVariableVisitorOptions)data;

                if (IsExpressionToReplace(expression.Expression, options))
                {
                    if (IsUnary(options.Initializer))
                    {
                        options.Changes.Add(ReplaceExpression(expression.Expression, options.Initializer, options));
                    }
                    else
                    {
                        options.Changes.Add(ReplaceExpression(expression.Expression, new ParenthesizedExpression(options.Initializer), options));
                    }
                    return(null);
                }
                else
                {
                    return(base.VisitUnaryOperatorExpression(expression, data));
                }
            }
            public override object VisitTypeOfIsExpression(TypeOfIsExpression stmt, object data)
            {
                Console.WriteLine("TypeOfIsExpression");
                IntegrateTemporaryVariableVisitorOptions options = (IntegrateTemporaryVariableVisitorOptions)data;

                if (IsExpressionToReplace(stmt.Expression, options))
                {
                    if (IsUnary(options.Initializer) || (options.Initializer is BinaryOperatorExpression && IsShiftOrHigher(((BinaryOperatorExpression)options.Initializer).Op)))
                    {
                        options.Changes.Add(ReplaceExpression(stmt.Expression, options.Initializer, options));
                    }
                    else
                    {
                        options.Changes.Add(ReplaceExpression(stmt.Expression, new ParenthesizedExpression(options.Initializer), options));
                    }
                    return(null);
                }
                else
                {
                    return(base.VisitTypeOfIsExpression(stmt, data));
                }
            }
Exemple #10
0
            public override object VisitBinaryOperatorExpression(BinaryOperatorExpression expression, object data)              // there are too much Parenthisiz
            {
                Console.WriteLine("BinaryOperatorExpression");
                IntegrateTemporaryVariableVisitorOptions options = (IntegrateTemporaryVariableVisitorOptions)data;

                if (IsExpressionToReplace(expression.Left, (IntegrateTemporaryVariableVisitorOptions)data))
                {
                    if (IsUnary(options.Initializer))
                    {
                        options.Changes.Add(ReplaceExpression(expression.Left, options.Initializer, options));
                    }
                    else
                    {
                        options.Changes.Add(ReplaceExpression(expression.Left, new ParenthesizedExpression(options.Initializer), options));
                    }
                }
                else
                {
                    expression.Left.AcceptVisitor(this, data);
                }
                Console.WriteLine("LeftSide done");
                if (IsExpressionToReplace(expression.Right, (IntegrateTemporaryVariableVisitorOptions)data))
                {
                    if (IsUnary(options.Initializer))
                    {
                        options.Changes.Add(ReplaceExpression(expression.Right, options.Initializer, options));
                    }
                    else
                    {
                        options.Changes.Add(ReplaceExpression(expression.Right, new ParenthesizedExpression(options.Initializer), options));
                    }
                    return(null);
                }
                else
                {
                    return(expression.Right.AcceptVisitor(this, data));
                }
            }
			Change ReplaceExpression (Expression toReplace, Expression replaceWith, IntegrateTemporaryVariableVisitorOptions options)
			{
//				Console.WriteLine ("Replace");
				TextReplaceChange change = new TextReplaceChange ();
				change.Description = string.Format (GettextCatalog.GetString ("Substitute variable {0} with the Initializeexpression"), options.GetName ());
				change.FileName = options.Options.Document.FileName;

				change.Offset = options.Options.Document.Editor.Document.LocationToOffset (toReplace.StartLocation.Line + ((LocalVariable)options.Options.SelectedItem).DeclaringMember.BodyRegion.Start.Line, toReplace.StartLocation.Column);
				change.RemovedChars = options.GetName ().Length;

				INRefactoryASTProvider provider = options.Options.GetASTProvider ();
				change.InsertedText = provider.OutputNode (options.Options.Dom, replaceWith);

//				Console.WriteLine ("Replace done");
				return change;
			}
			bool IsExpressionToReplace (Expression e, IntegrateTemporaryVariableVisitorOptions o)
			{
//				Console.WriteLine ("Checking Replace: " + e.ToString() + " - " + o.GetName());
				return (e is IdentifierExpression) && (((IdentifierExpression)e).Identifier == o.GetName ());
			}
            public override object VisitIdentifierExpression(IdentifierExpression e, object data)
            {
                IntegrateTemporaryVariableVisitorOptions options = (IntegrateTemporaryVariableVisitorOptions)data;

                if (!(e.Identifier == options.GetName()))
                {
                    return(data);
                }
                // if sometimes Paranthesis are needed, there is an own Visitor for the Parent
                // here are all Cases left, where no Parent Visitor ist written
                // somtimes because the Syntax ist not clear (add them if you know the Syntax)
                // or because no Paranthesis are needet (because different Chars are used to separate the expression)
                // or because the integration is not valid in this case
                if (e.Parent is CaseLabel)
                {
                    throw new IntegrateTemporaryVariableNotImplementedException();
                }
                else if (e.Parent is AddHandlerStatement)
                {
                    throw new IntegrateTemporaryVariableNotImplementedException();
                }
                else if (e.Parent is RemoveHandlerStatement)
                {
                    throw new IntegrateTemporaryVariableNotImplementedException();
                }
                else if (e.Parent is CatchClause)
                {
                    throw new IntegrateTemporaryVariableNotImplementedException();
                }
                else if (e.Parent is DirectionExpression)
                {
                    if (((DirectionExpression)e.Parent).FieldDirection == FieldDirection.Out || ((DirectionExpression)e.Parent).FieldDirection == FieldDirection.Ref)
                    {
                        throw new IntegrateTemporaryVariableDirectionException();
                    }
                }
                else if (e.Parent is DoLoopStatement)
                {
                    throw new IntegrateTemporaryVariableNotImplementedException();
                }
                else if (e.Parent is EraseStatement)
                {
                    throw new IntegrateTemporaryVariableNotImplementedException();
                }
                else if (e.Parent is ErrorStatement)
                {
                    // VB
                    throw new IntegrateTemporaryVariableNotImplementedException();
                }
                else if (e.Parent is EventDeclaration)
                {
                    throw new IntegrateTemporaryVariableNotImplementedException();
                }
                else if (e.Parent is ExpressionRangeVariable)
                {
                    throw new IntegrateTemporaryVariableNotImplementedException();
                }
                else if (e.Parent is ForNextStatement)
                {
                    throw new IntegrateTemporaryVariableNotImplementedException();
                }
                else if (e.Parent is LambdaExpression)
                {
                    throw new IntegrateTemporaryVariableNotImplementedException();
                }
                else if (e.Parent is PointerReferenceExpression)
                {
                    throw new IntegrateTemporaryVariableNotImplementedException();
                }
                else if (e.Parent is QueryExpressionFromOrJoinClause)
                {
                    throw new IntegrateTemporaryVariableNotImplementedException();
                }
                else if (e.Parent is QueryExpressionGroupClause)
                {
                    throw new IntegrateTemporaryVariableNotImplementedException();
                }
                else if (e.Parent is QueryExpressionJoinClause)
                {
                    throw new IntegrateTemporaryVariableNotImplementedException();
                }
                else if (e.Parent is QueryExpressionJoinConditionVB)
                {
                    throw new IntegrateTemporaryVariableNotImplementedException();
                }
                else if (e.Parent is QueryExpressionLetClause)
                {
                    throw new IntegrateTemporaryVariableNotImplementedException();
                }
                else if (e.Parent is QueryExpressionOrdering)
                {
                    throw new IntegrateTemporaryVariableNotImplementedException();
                }
                else if (e.Parent is QueryExpressionPartitionVBClause)
                {
                    throw new IntegrateTemporaryVariableNotImplementedException();
                }
                else if (e.Parent is QueryExpressionSelectClause)
                {
                    throw new IntegrateTemporaryVariableNotImplementedException();
                }
                else if (e.Parent is QueryExpressionWhereClause)
                {
                    throw new IntegrateTemporaryVariableNotImplementedException();
                }
                else if (e.Parent is RaiseEventStatement)
                {
                    throw new IntegrateTemporaryVariableNotImplementedException();
                }
                else if (e.Parent is StackAllocExpression)
                {
                    throw new IntegrateTemporaryVariableNotImplementedException();
                }
                // ConstructorInitializer, WithStatement, ParameterDeclarationExpression, CollectionInitializerExpression, ParenthesizedExpression,
                // ElseIfSection, IfElseStatement, ForeachStatement, ForStatement, Indexes of the IndexerExpression, Arguments of the InvocationExpression,
                // NamedArgumentExpression, ObjectCreateExpression, VariableDeclaration (if the Initializer is the IdentifierExpression, this is handled here)
                // ThrowStatement, SwitchStatement, ReturnStatement, GotoCaseStatement, CheckedExpression, UncheckedExpression
                options.Changes.Add(ReplaceExpression(e, options.Initializer, options));
                return(data);
            }
            public override object VisitLocalVariableDeclaration(LocalVariableDeclaration localVariableDeclaration, object data)
            {
                //				Console.WriteLine ("LocalVariableDeclaration: " + localVariableDeclaration.StartLocation.ToString () + " - " + localVariableDeclaration.EndLocation.ToString ());
                localVariableDeclaration.TypeReference.AcceptVisitor(this, data);
                foreach (VariableDeclaration o in localVariableDeclaration.Variables)
                {
                    if (o.Name == ((IntegrateTemporaryVariableVisitorOptions)data).GetName())
                    {
                        IntegrateTemporaryVariableVisitorOptions options = (IntegrateTemporaryVariableVisitorOptions)data;
                        options.Initializer = localVariableDeclaration.GetVariableDeclaration(((LocalVariable)options.Options.SelectedItem).Name).Initializer;
                        if (localVariableDeclaration.Variables.Count == 1)
                        {
                            TextReplaceChange change = new TextReplaceChange();
                            change.Description = string.Format(GettextCatalog.GetString("Deleting local variable declaration {0}"), options.GetName());
                            change.FileName    = options.Options.Document.FileName;
                            int lineNumber = localVariableDeclaration.StartLocation.Line + ((LocalVariable)options.Options.SelectedItem).DeclaringMember.BodyRegion.Start.Line;
                            change.Offset = options.Options.Document.Editor.Document.LocationToOffset(lineNumber, localVariableDeclaration.StartLocation.Column);
                            int end = options.Options.Document.Editor.Document.LocationToOffset(localVariableDeclaration.EndLocation.Line + ((LocalVariable)options.Options.SelectedItem).DeclaringMember.BodyRegion.Start.Line, localVariableDeclaration.EndLocation.Column);
                            change.RemovedChars = end - change.Offset;
                            // check if whole line can be removed.
                            var line = options.Options.Document.Editor.GetLine(lineNumber);
                            if (line.GetIndentation(options.Options.Document.Editor.Document).Length == localVariableDeclaration.StartLocation.Column - 1)
                            {
                                bool isEmpty = true;
                                for (int i = end; i < line.EndOffset; i++)
                                {
                                    if (!char.IsWhiteSpace(options.Options.Document.Editor.GetCharAt(i)))
                                    {
                                        isEmpty = false;
                                        break;
                                    }
                                }
                                if (isEmpty)
                                {
                                    change.Offset       = line.Offset;
                                    change.RemovedChars = line.Length;
                                }
                            }
                            change.InsertedText = "";
                            ((IntegrateTemporaryVariableVisitorOptions)data).Changes.Add(change);
                        }
                        else
                        {
                            TextReplaceChange change = new TextReplaceChange();
                            change.Description = string.Format(GettextCatalog.GetString("Deleting local variable declaration {0}"), options.GetName());
                            change.FileName    = options.Options.Document.FileName;

                            change.Offset = options.Options.Document.Editor.Document.LocationToOffset(localVariableDeclaration.StartLocation.Line + ((LocalVariable)options.Options.SelectedItem).DeclaringMember.BodyRegion.Start.Line, localVariableDeclaration.StartLocation.Column);
                            int end = options.Options.Document.Editor.Document.LocationToOffset(localVariableDeclaration.EndLocation.Line + ((LocalVariable)options.Options.SelectedItem).DeclaringMember.BodyRegion.Start.Line, localVariableDeclaration.EndLocation.Column);

                            change.RemovedChars = end - change.Offset;
                            localVariableDeclaration.Variables.Remove(localVariableDeclaration.GetVariableDeclaration(options.GetName()));
                            INRefactoryASTProvider provider = options.Options.GetASTProvider();
                            change.InsertedText = options.Options.GetWhitespaces(change.Offset) + provider.OutputNode(options.Options.Dom, localVariableDeclaration);
                            ((IntegrateTemporaryVariableVisitorOptions)data).Changes.Add(change);
                        }
                    }
                    else
                    {
                        o.AcceptVisitor(this, data);
                    }
                }
                return(null);
            }
            bool IsExpressionToReplace(Expression e, IntegrateTemporaryVariableVisitorOptions o)
            {
//				Console.WriteLine ("Checking Replace: " + e.ToString() + " - " + o.GetName());
                return((e is IdentifierExpression) && (((IdentifierExpression)e).Identifier == o.GetName()));
            }