Browse Source

Merge remote-tracking branch 'upstream/master' into mansheng

newNRvisualizers
Mansheng Yang 13 years ago
parent
commit
e7a902baca
  1. 2
      ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs
  2. 50
      ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ExtractMethod/ExtractMethodAction.cs
  3. 40
      ICSharpCode.NRefactory.CSharp/Refactoring/Script.cs
  4. 2
      ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ExtractMethodTests.cs
  5. 14
      ICSharpCode.NRefactory.Tests/CSharp/CodeActions/TestRefactoringContext.cs

2
ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs

@ -117,7 +117,7 @@ namespace ICSharpCode.NRefactory.CSharp @@ -117,7 +117,7 @@ namespace ICSharpCode.NRefactory.CSharp
curIndent = new Indent(this.options);
}
protected virtual void VisitChildren (AstNode node)
protected override void VisitChildren (AstNode node)
{
if (!FormattingRegion.IsEmpty) {
if (node.EndLocation < FormattingRegion.Begin || node.StartLocation > FormattingRegion.End)

50
ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ExtractMethod/ExtractMethodAction.cs

@ -31,6 +31,7 @@ using ICSharpCode.NRefactory.CSharp.Resolver; @@ -31,6 +31,7 @@ using ICSharpCode.NRefactory.CSharp.Resolver;
using ICSharpCode.NRefactory.CSharp.Analysis;
using System.Threading;
using ICSharpCode.NRefactory.TypeSystem;
using System.Threading.Tasks;
namespace ICSharpCode.NRefactory.CSharp.Refactoring.ExtractMethod
{
@ -44,14 +45,14 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring.ExtractMethod @@ -44,14 +45,14 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring.ExtractMethod
var selected = new List<AstNode>(context.GetSelectedNodes());
if (selected.Count == 0)
yield break;
if (selected.Count == 1 && selected [0] is Expression) {
var codeAction = CreateFromExpression(context, (Expression)selected [0]);
if (codeAction == null)
yield break;
yield return codeAction;
}
foreach (var node in selected) {
if (!(node is Statement))
yield break;
@ -60,13 +61,13 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring.ExtractMethod @@ -60,13 +61,13 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring.ExtractMethod
if (action != null)
yield return action;
}
CodeAction CreateFromExpression(RefactoringContext context, Expression expression)
{
var resolveResult = context.Resolve(expression);
if (resolveResult.IsError)
return null;
return new CodeAction(context.TranslateString("Extract method"), script => {
string methodName = "NewMethod";
var method = new MethodDeclaration() {
@ -78,18 +79,20 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring.ExtractMethod @@ -78,18 +79,20 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring.ExtractMethod
};
if (!StaticVisitor.UsesNotStaticMember(context, expression))
method.Modifiers |= Modifiers.Static;
script.InsertWithCursor(context.TranslateString("Extract method"), Script.InsertPosition.Before, method);
var target = new IdentifierExpression(methodName);
script.Replace(expression, new InvocationExpression(target));
// script.Link(target, method.NameToken);
var task = script.InsertWithCursor(context.TranslateString("Extract method"), Script.InsertPosition.Before, method);
task.ContinueWith (delegate {
var target = new IdentifierExpression(methodName);
script.Replace(expression, new InvocationExpression(target));
script.Link(target, method.NameToken);
}, TaskScheduler.FromCurrentSynchronizationContext ());
});
}
CodeAction CreateFromStatements(RefactoringContext context, List<Statement> statements)
{
if (!(statements [0].Parent is Statement))
return null;
return new CodeAction(context.TranslateString("Extract method"), script => {
string methodName = "NewMethod";
var method = new MethodDeclaration() {
@ -107,9 +110,9 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring.ExtractMethod @@ -107,9 +110,9 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring.ExtractMethod
var target = new IdentifierExpression(methodName);
var invocation = new InvocationExpression(target);
var usedVariables = VariableLookupVisitor.Analyze(context, statements);
var extractedCodeAnalysis = new DefiniteAssignmentAnalysis(
(Statement)statements [0].Parent,
context.Resolver,
@ -136,11 +139,11 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring.ExtractMethod @@ -136,11 +139,11 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring.ExtractMethod
wholeCodeAnalysis.Analyze(variable.Name, DefiniteAssignmentStatus.PotentiallyAssigned, context.CancellationToken);
statusBeforeMethod [variable] = extractedCodeAnalysis.GetStatusBefore(statements [0]);
}
var afterCodeAnalysis = new DefiniteAssignmentAnalysis(stmt, context.Resolver, context.CancellationToken);
var statusAtEnd = new Dictionary<IVariable, DefiniteAssignmentStatus>();
afterCodeAnalysis.SetAnalyzedRange(lastStatement, stmt.Statements.Last(), false, true);
foreach (var variable in usedVariables) {
afterCodeAnalysis.Analyze(variable.Name, DefiniteAssignmentStatus.PotentiallyAssigned, context.CancellationToken);
statusBeforeMethod [variable] = extractedCodeAnalysis.GetStatusBefore(statements [0]);
@ -151,7 +154,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring.ExtractMethod @@ -151,7 +154,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring.ExtractMethod
var afterVisitor = new VariableLookupVisitor(context);
afterVisitor.SetAnalyzedRange(lastStatement, stmt, false, true);
stmt.AcceptVisitor(afterVisitor);
foreach (var status in statusAfterMethod) {
if (!beforeVisitor.UsedVariables.Contains(status.Item1) && !afterVisitor.UsedVariables.Contains(status.Item1))
continue;
@ -171,7 +174,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring.ExtractMethod @@ -171,7 +174,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring.ExtractMethod
mod = ParameterModifier.Out;
argumentExpression = new DirectionExpression(FieldDirection.Out, argumentExpression);
break;
// case DefiniteAssignmentStatus.Unassigned:
// case DefiniteAssignmentStatus.Unassigned:
default:
mod = ParameterModifier.None;
break;
@ -180,13 +183,14 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring.ExtractMethod @@ -180,13 +183,14 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring.ExtractMethod
new ParameterDeclaration(context.CreateShortType(status.Item1.Type), status.Item1.Name, mod));
invocation.Arguments.Add(argumentExpression);
}
foreach (var node in statements.Skip (1)) {
script.Remove(node);
}
script.Replace(statements [0], new ExpressionStatement(invocation));
script.InsertWithCursor(context.TranslateString("Extract method"), Script.InsertPosition.Before, method);
//script.Link(target, method.NameToken);
var task = script.InsertWithCursor(context.TranslateString("Extract method"), Script.InsertPosition.Before, method);
task.ContinueWith (delegate {
foreach (var node in statements.Skip (1)) {
script.Remove(node);
}
script.Replace(statements [0], new ExpressionStatement(invocation));
script.Link(target, method.NameToken);
}, TaskScheduler.FromCurrentSynchronizationContext ());
});
}
}

40
ICSharpCode.NRefactory.CSharp/Refactoring/Script.cs

@ -28,6 +28,7 @@ using System.Collections.Generic; @@ -28,6 +28,7 @@ using System.Collections.Generic;
using System.IO;
using ICSharpCode.NRefactory.Editor;
using ICSharpCode.NRefactory.TypeSystem;
using System.Threading.Tasks;
namespace ICSharpCode.NRefactory.CSharp.Refactoring
{
@ -137,11 +138,11 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -137,11 +138,11 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
public CSharpFormattingOptions FormattingOptions {
get { return formattingOptions; }
}
public TextEditorOptions Options {
get { return options; }
}
public void InsertBefore(AstNode node, AstNode insertNode)
{
var startOffset = GetCurrentOffset(new TextLocation(node.StartLocation.Line, 1));
@ -152,7 +153,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -152,7 +153,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
InsertText(startOffset, text);
output.RegisterTrackedSegments(this, startOffset);
}
public void AddTo(BlockStatement bodyStatement, AstNode insertNode)
{
var startOffset = GetCurrentOffset(bodyStatement.LBraceToken.EndLocation);
@ -161,10 +162,11 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -161,10 +162,11 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
output.RegisterTrackedSegments(this, startOffset);
}
public virtual void Link (params AstNode[] nodes)
public virtual Task Link (params AstNode[] nodes)
{
// Default implementation: do nothing
// Derived classes are supposed to enter the text editor's linked state.
return null;
}
public void Replace (AstNode node, AstNode replaceWith)
@ -197,27 +199,27 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -197,27 +199,27 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
After,
End
}
public virtual void InsertWithCursor(string operation, InsertPosition defaultPosition, IEnumerable<AstNode> node)
public virtual Task InsertWithCursor(string operation, InsertPosition defaultPosition, IEnumerable<AstNode> node)
{
throw new NotImplementedException();
}
public virtual void InsertWithCursor(string operation, ITypeDefinition parentType, IEnumerable<AstNode> node)
public virtual Task InsertWithCursor(string operation, ITypeDefinition parentType, IEnumerable<AstNode> node)
{
throw new NotImplementedException();
}
public void InsertWithCursor(string operation, InsertPosition defaultPosition, params AstNode[] nodes)
public Task InsertWithCursor(string operation, InsertPosition defaultPosition, params AstNode[] nodes)
{
InsertWithCursor(operation, defaultPosition, (IEnumerable<AstNode>)nodes);
return InsertWithCursor(operation, defaultPosition, (IEnumerable<AstNode>)nodes);
}
public void InsertWithCursor(string operation, ITypeDefinition parentType, params AstNode[] nodes)
public Task InsertWithCursor(string operation, ITypeDefinition parentType, params AstNode[] nodes)
{
InsertWithCursor(operation, parentType, (IEnumerable<AstNode>)nodes);
return InsertWithCursor(operation, parentType, (IEnumerable<AstNode>)nodes);
}
protected virtual int GetIndentLevelAt (int offset)
{
return 0;
@ -344,23 +346,23 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -344,23 +346,23 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
public virtual void Rename(IVariable variable, string name = null)
{
}
public virtual void Dispose()
{
}
public enum NewTypeContext {
/// <summary>
/// The class should be placed in a new file to the current namespace.
/// </summary>
CurrentNamespace,
/// <summary>
/// The class should be placed in the unit tests. (not implemented atm.)
/// </summary>
UnitTests
}
/// <summary>
/// Creates a new file containing the type, namespace and correct usings.
/// (Note: Should take care of IDE specific things, file headers, add to project, correct name).

2
ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ExtractMethodTests.cs

@ -28,11 +28,11 @@ using ICSharpCode.NRefactory.CSharp.Refactoring.ExtractMethod; @@ -28,11 +28,11 @@ using ICSharpCode.NRefactory.CSharp.Refactoring.ExtractMethod;
namespace ICSharpCode.NRefactory.CSharp.CodeActions
{
[Ignore("FIXME!!")]
[TestFixture]
public class ExtractMethodTests : ContextActionTestBase
{
[Ignore("FIXME!!")]
[Test()]
public void ExtractMethodResultStatementTest()
{

14
ICSharpCode.NRefactory.Tests/CSharp/CodeActions/TestRefactoringContext.cs

@ -36,6 +36,7 @@ using ICSharpCode.NRefactory.Semantics; @@ -36,6 +36,7 @@ using ICSharpCode.NRefactory.Semantics;
using ICSharpCode.NRefactory.TypeSystem;
using NUnit.Framework;
using System.Threading;
using System.Threading.Tasks;
namespace ICSharpCode.NRefactory.CSharp.CodeActions
{
@ -89,23 +90,27 @@ namespace ICSharpCode.NRefactory.CSharp.CodeActions @@ -89,23 +90,27 @@ namespace ICSharpCode.NRefactory.CSharp.CodeActions
this.context = context;
}
public override void Link (params AstNode[] nodes)
public override Task Link (params AstNode[] nodes)
{
// check that all links are valid.
foreach (var node in nodes) {
Assert.IsNotNull (GetSegment (node));
}
return new Task (() => {});
}
public override void InsertWithCursor(string operation, InsertPosition defaultPosition, IEnumerable<AstNode> nodes)
public override Task InsertWithCursor(string operation, InsertPosition defaultPosition, IEnumerable<AstNode> nodes)
{
var entity = context.GetNode<EntityDeclaration>();
foreach (var node in nodes) {
InsertBefore(entity, node);
}
var t = new Task (() => {});
t.RunSynchronously ();
return t;
}
public override void InsertWithCursor (string operation, ITypeDefinition parentType, IEnumerable<AstNode> nodes)
public override Task InsertWithCursor (string operation, ITypeDefinition parentType, IEnumerable<AstNode> nodes)
{
var unit = context.RootNode;
var insertType = unit.GetNodeAt<TypeDeclaration> (parentType.Region.Begin);
@ -116,6 +121,9 @@ namespace ICSharpCode.NRefactory.CSharp.CodeActions @@ -116,6 +121,9 @@ namespace ICSharpCode.NRefactory.CSharp.CodeActions
InsertText (startOffset, output.Text);
output.RegisterTrackedSegments (this, startOffset);
}
var t = new Task (() => {});
t.RunSynchronously ();
return t;
}
void Rename (AstNode node, string newName)

Loading…
Cancel
Save