Browse Source

Fix ArgumentException in StatementsToInitializerConverter.

newNRvisualizers
Daniel Grunwald 13 years ago
parent
commit
7c7a2ad588
  1. 6
      ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToInitializer/ConvertToInitializerAction.cs
  2. 13
      ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToInitializer/StatementsToInitializerConverter.cs
  3. 23
      ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertToInitializer/ConvertToInitializerTests.cs

6
ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToInitializer/ConvertToInitializerAction.cs

@ -60,7 +60,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -60,7 +60,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
IList<AstNode> statements = GetNodes(context.GetNode<Statement>());
var converter = new StatementsToInitializerConverter(context);
var newInitializer = converter.ConvertToInitializer(initializer, ref statements);
if (statements.Count == 0)
if (newInitializer == null || statements.Count == 0)
return null;
return MakeAction(context, initializer, newInitializer, statements);
}
@ -68,7 +68,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -68,7 +68,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
CodeAction HandleExpressionStatement(RefactoringContext context, ExpressionStatement expressionStatement)
{
var expression = expressionStatement.Expression as AssignmentExpression;
if (expression == null)
if (expression == null || expression.Operator != AssignmentOperatorType.Assign)
return null;
if (!(expression.Right is ObjectCreateExpression))
return null;
@ -78,7 +78,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -78,7 +78,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
IList<AstNode> statements = GetNodes(context.GetNode<Statement>());
var converter = new StatementsToInitializerConverter(context);
var newExpression = converter.ConvertToInitializer(expression, ref statements);
if (statements.Count == 0)
if (newExpression == null || statements.Count == 0)
return null;
return MakeAction(context, expression, newExpression, statements);
}

13
ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertToInitializer/StatementsToInitializerConverter.cs

@ -47,14 +47,15 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -47,14 +47,15 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
this.context = context;
}
void Initialize(AstNode targetNode)
bool Initialize(AstNode targetNode)
{
var target = context.Resolve(targetNode);
var targetInitializerPath = AccessPath.FromResolveResult(target);
if (targetInitializerPath == null)
throw new ArgumentException(string.Format("Could not create the main initializer path from resolve result ({0})", target));
return false;
mainAccessPath = targetInitializerPath;
return true;
}
public VariableInitializer ConvertToInitializer(VariableInitializer variableInitializer, ref IList<AstNode> statements)
@ -64,7 +65,8 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -64,7 +65,8 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
if (statements == null)
throw new ArgumentNullException("statements");
Initialize(variableInitializer);
if (!Initialize(variableInitializer))
return null;
accessPaths [mainAccessPath] = variableInitializer.Initializer.Clone();
Convert(statements);
@ -81,7 +83,8 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -81,7 +83,8 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
if (!(assignmentExpression.Right is ObjectCreateExpression))
throw new ArgumentException("assignmentExpression.Right must be an ObjectCreateExpression", "assignmentExpression");
Initialize(assignmentExpression.Left);
if (!Initialize(assignmentExpression.Left))
return null;
accessPaths [mainAccessPath] = assignmentExpression.Right.Clone();
Convert(statements);
@ -178,7 +181,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -178,7 +181,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
bool TryHandleAssignmentExpression(ExpressionStatement expressionStatement)
{
var assignmentExpression = expressionStatement.Expression as AssignmentExpression;
if (assignmentExpression == null)
if (assignmentExpression == null || assignmentExpression.Operator != AssignmentOperatorType.Assign)
return false;
var resolveResult = context.Resolve(assignmentExpression.Right);
if (HasDependency(assignmentExpression.Right) && !CanReplaceDependent(resolveResult))

23
ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertToInitializer/ConvertToInitializerTests.cs

@ -35,7 +35,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeActions @@ -35,7 +35,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeActions
{
// TODO: Remove this when the formatter handles object and collection initializers
// This tests the expected code vs the actual code based on their ASTs instead of the text they produce.
public new void Test<T>(string input, string output, int action = 0, bool expectErrors = false)
public new void Test<T>(string input, string output, int action = 0, bool expectErrors = false)
where T : ICodeActionProvider, new ()
{
string result = RunContextAction(new T(), HomogenizeEol(input), action, expectErrors);
@ -678,6 +678,27 @@ class TestClass @@ -678,6 +678,27 @@ class TestClass
}
}");
}
[Test]
public void DoesNotCrashOnDelegateAssignment()
{
TestWrongContext<ConvertToInitializerAction>(@"
using System;
using System.Collections.Generic;
class TestClass {
void F() {
((CheckBox)ControlDictionary[""ReplaceCheckBox""]).CheckedChanged = new E$ventHandler(ReplaceCheckBox_CheckedChanged);
}
Dictionary<string, Control> ControlDictionary;
void ReplaceCheckBox_CheckedChanged(object sender, EventArgs e) {}
}
class Control {}
class CheckBox : Control {
public EventHandler CheckedChanged;
}
");
}
}
}

Loading…
Cancel
Save