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