Browse Source

Introduce constant action can now replace more than one occurence

(like declare local variable action).
pull/32/merge
Mike Krüger 13 years ago
parent
commit
a741ec0dd8
  1. 2
      ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/DeclareLocalVariableAction.cs
  2. 57
      ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/IntroduceConstantAction.cs
  3. 24
      ICSharpCode.NRefactory.Tests/CSharp/CodeActions/IntroduceConstantTests.cs

2
ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/DeclareLocalVariableAction.cs

@ -142,7 +142,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
} }
class SearchNodeVisitior : DepthFirstAstVisitor internal class SearchNodeVisitior : DepthFirstAstVisitor
{ {
readonly AstNode searchForNode; readonly AstNode searchForNode;
public readonly List<AstNode> Matches = new List<AstNode> (); public readonly List<AstNode> Matches = new List<AstNode> ();

57
ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/IntroduceConstantAction.cs

@ -43,6 +43,12 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
yield break; yield break;
} }
var visitor = new DeclareLocalVariableAction.SearchNodeVisitior(pexpr);
var node = context.GetNode <BlockStatement>();
if (node != null)
node.AcceptVisitor(visitor);
var resolveResult = context.Resolve(pexpr); var resolveResult = context.Resolve(pexpr);
yield return new CodeAction(context.TranslateString("Create local constant"), script => { yield return new CodeAction(context.TranslateString("Create local constant"), script => {
@ -83,6 +89,57 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
// script.Link(initializer.NameToken, variableUsage); // script.Link(initializer.NameToken, variableUsage);
script.InsertWithCursor(context.TranslateString("Create constant"), Script.InsertPosition.Before, decl); script.InsertWithCursor(context.TranslateString("Create constant"), Script.InsertPosition.Before, decl);
}); });
if (visitor.Matches.Count > 1) {
yield return new CodeAction(string.Format(context.TranslateString("Create local constant (replace '{0}' occurrences)"), visitor.Matches.Count), script => {
string name = CreateMethodDeclarationAction.CreateBaseName(pexpr, resolveResult.Type);
var service = (NamingConventionService)context.GetService(typeof(NamingConventionService));
if (service != null)
name = service.CheckName(context, name, AffectedEntity.LocalConstant);
var initializer = new VariableInitializer(name, pexpr.Clone());
var decl = new VariableDeclarationStatement() {
Type = context.CreateShortType(resolveResult.Type),
Modifiers = Modifiers.Const,
Variables = { initializer }
};
script.InsertBefore(statement, decl);
var linkedNodes = new List<AstNode>();
linkedNodes.Add(initializer.NameToken);
for (int i = 0; i < visitor.Matches.Count; i++) {
var identifierExpression = new IdentifierExpression(name);
linkedNodes.Add(identifierExpression);
script.Replace(visitor.Matches [i], identifierExpression);
}
script.Link(linkedNodes.ToArray ());
});
yield return new CodeAction(string.Format(context.TranslateString("Create constant field (replace '{0}' occurrences)"), visitor.Matches.Count), script => {
string name = CreateMethodDeclarationAction.CreateBaseName(pexpr, resolveResult.Type);
var service = (NamingConventionService)context.GetService(typeof(NamingConventionService));
if (service != null)
name = service.CheckName(context, name, AffectedEntity.ConstantField);
var initializer = new VariableInitializer(name, pexpr.Clone());
var decl = new FieldDeclaration() {
ReturnType = context.CreateShortType(resolveResult.Type),
Modifiers = Modifiers.Const,
Variables = { initializer }
};
var linkedNodes = new List<AstNode>();
linkedNodes.Add(initializer.NameToken);
for (int i = 0; i < visitor.Matches.Count; i++) {
var identifierExpression = new IdentifierExpression(name);
linkedNodes.Add(identifierExpression);
script.Replace(visitor.Matches [i], identifierExpression);
}
script.InsertWithCursor(context.TranslateString("Create constant"), Script.InsertPosition.Before, decl);
});
}
} }
} }
} }

24
ICSharpCode.NRefactory.Tests/CSharp/CodeActions/IntroduceConstantTests.cs

@ -89,5 +89,29 @@ namespace ICSharpCode.NRefactory.CSharp.CodeActions
} }
}", 1); }", 1);
} }
[Test()]
public void TestLocalConstantReplaceAll ()
{
Test<IntroduceConstantAction> (@"class TestClass
{
public void Hello ()
{
System.Console.WriteLine ($""Hello World"");
System.Console.WriteLine (""Hello World"");
System.Console.WriteLine (""Hello World"");
}
}", @"class TestClass
{
public void Hello ()
{
const string helloWorld = ""Hello World"";
System.Console.WriteLine (helloWorld);
System.Console.WriteLine (helloWorld);
System.Console.WriteLine (helloWorld);
}
}", 2);
}
} }
} }
Loading…
Cancel
Save