5 changed files with 3 additions and 230 deletions
@ -1,110 +0,0 @@ |
|||||||
//
|
|
||||||
// RemoveField.cs
|
|
||||||
//
|
|
||||||
// Author:
|
|
||||||
// Ciprian Khlud <ciprian.mustiata@yahoo.com>
|
|
||||||
//
|
|
||||||
// Copyright (c) 2013 Ciprian Khlud
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
using System; |
|
||||||
using ICSharpCode.NRefactory.CSharp.Refactoring; |
|
||||||
using System.Collections.Generic; |
|
||||||
using ICSharpCode.NRefactory.CSharp.Resolver; |
|
||||||
using ICSharpCode.NRefactory.Semantics; |
|
||||||
|
|
||||||
namespace ICSharpCode.NRefactory.CSharp |
|
||||||
{ |
|
||||||
[ContextAction("Removes a field from a class", Description = "It removes also the empty assingments and the usages")] |
|
||||||
public class RemoveFieldRefactoryAction : ICodeActionProvider |
|
||||||
{ |
|
||||||
public IEnumerable<CodeAction> GetActions(RefactoringContext context) |
|
||||||
{ |
|
||||||
var fieldDeclaration = GetFieldDeclaration(context); |
|
||||||
if(fieldDeclaration==null) |
|
||||||
yield break; |
|
||||||
|
|
||||||
|
|
||||||
yield return new CodeAction(string.Format(context.TranslateString("Remove field '{0}'"), fieldDeclaration.Name) |
|
||||||
, script => GenerateNewScript( |
|
||||||
script, fieldDeclaration, context), fieldDeclaration); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
void GenerateNewScript(Script script, FieldDeclaration fieldDeclaration, RefactoringContext context) |
|
||||||
{ |
|
||||||
var firstOrNullObject = fieldDeclaration.Variables.FirstOrNullObject(); |
|
||||||
if(firstOrNullObject==null) |
|
||||||
return; |
|
||||||
var matchedNodes = ComputeMatchNodes(context, firstOrNullObject); |
|
||||||
|
|
||||||
foreach (var matchNode in matchedNodes) |
|
||||||
{ |
|
||||||
var parent = matchNode.Parent; |
|
||||||
if (matchNode is VariableInitializer) |
|
||||||
{ |
|
||||||
script.Remove(parent); |
|
||||||
} |
|
||||||
else |
|
||||||
if (matchNode is IdentifierExpression) |
|
||||||
{ |
|
||||||
if(parent is AssignmentExpression) |
|
||||||
{ |
|
||||||
script.Remove(parent.Parent); |
|
||||||
} |
|
||||||
else |
|
||||||
{ |
|
||||||
var clone = (IdentifierExpression)matchNode.Clone(); |
|
||||||
clone.Identifier = "TODO"; |
|
||||||
script.Replace(matchNode, clone); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private static List<AstNode> ComputeMatchNodes(RefactoringContext context, VariableInitializer firstOrNullObject) |
|
||||||
{ |
|
||||||
var referenceFinder = new FindReferences(); |
|
||||||
var matchedNodes = new List<AstNode>(); |
|
||||||
|
|
||||||
var resolveResult = context.Resolver.Resolve(firstOrNullObject); |
|
||||||
var member = resolveResult as MemberResolveResult; |
|
||||||
if (member == null)//not a member is unexpected case, so is better to return no match than to break the code
|
|
||||||
return matchedNodes; |
|
||||||
|
|
||||||
FoundReferenceCallback callback = (matchNode, result) => matchedNodes.Add(matchNode); |
|
||||||
|
|
||||||
var searchScopes = referenceFinder.GetSearchScopes(member.Member); |
|
||||||
referenceFinder.FindReferencesInFile(searchScopes, |
|
||||||
context.UnresolvedFile, |
|
||||||
context.RootNode as SyntaxTree, |
|
||||||
context.Compilation, callback, |
|
||||||
context.CancellationToken); |
|
||||||
return matchedNodes; |
|
||||||
} |
|
||||||
|
|
||||||
FieldDeclaration GetFieldDeclaration(RefactoringContext context) |
|
||||||
{ |
|
||||||
var result = context.GetNode<FieldDeclaration>(); |
|
||||||
|
|
||||||
return result; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
@ -1,96 +0,0 @@ |
|||||||
//
|
|
||||||
// RemoveFieldRefactoryActionTests.cs
|
|
||||||
//
|
|
||||||
// Author:
|
|
||||||
// Ciprian Khlud <ciprian.mustiata@yahoo.com>
|
|
||||||
//
|
|
||||||
// Copyright (c) 2013 Ciprian Khlud
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
using NUnit.Framework; |
|
||||||
|
|
||||||
namespace ICSharpCode.NRefactory.CSharp.CodeActions |
|
||||||
{ |
|
||||||
[TestFixture] |
|
||||||
public class RemoveFieldRefactoryActionTests : ContextActionTestBase |
|
||||||
{ |
|
||||||
[Test] |
|
||||||
public void RemoveOneField() |
|
||||||
{ |
|
||||||
Test<RemoveFieldRefactoryAction>( |
|
||||||
@"
|
|
||||||
class A { |
|
||||||
int $field; |
|
||||||
} |
|
||||||
",
|
|
||||||
@"
|
|
||||||
class A { |
|
||||||
} |
|
||||||
"
|
|
||||||
);} |
|
||||||
|
|
||||||
[Test] |
|
||||||
public void RemoveOneFieldAndAssignmentValue() |
|
||||||
{ |
|
||||||
Test<RemoveFieldRefactoryAction>( |
|
||||||
@"
|
|
||||||
class A { |
|
||||||
int $field; |
|
||||||
A() { |
|
||||||
field = 3; |
|
||||||
} |
|
||||||
} |
|
||||||
",
|
|
||||||
@"
|
|
||||||
class A { |
|
||||||
A() { |
|
||||||
} |
|
||||||
} |
|
||||||
"
|
|
||||||
); |
|
||||||
} |
|
||||||
|
|
||||||
[Test] |
|
||||||
public void RemoveOneFieldAndAssignmentValueAndMethodCall() |
|
||||||
{ |
|
||||||
Test<RemoveFieldRefactoryAction>( |
|
||||||
@"
|
|
||||||
class A { |
|
||||||
int $field; |
|
||||||
A() { |
|
||||||
field = 3; |
|
||||||
if(field!=0) |
|
||||||
Method(field); |
|
||||||
} |
|
||||||
} |
|
||||||
",
|
|
||||||
@"
|
|
||||||
class A { |
|
||||||
A() { |
|
||||||
if(TODO!=0) |
|
||||||
Method(TODO); |
|
||||||
} |
|
||||||
} |
|
||||||
"
|
|
||||||
); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
Binary file not shown.
Loading…
Reference in new issue