1
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
2
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
4
using ICSharpCode.SharpDevelop.Editor;
6
using System.Reflection;
7
using ICSharpCode.Core;
8
using ICSharpCode.SharpDevelop.Dom;
9
using ICSharpCode.SharpDevelop.Dom.Refactoring;
10
using ICSharpCode.SharpDevelop.Gui;
12
namespace ICSharpCode.SharpDevelop.Refactoring
15
/// Tests if the refactoring provider for the current document
16
/// supports the specified option.
18
/// <attribute name="supports">
19
/// Same of the action that should be supported.
20
/// "*" to test if refactoring is supported at all.
22
/// <example title="Test if refactoring is supported">
23
/// <Condition name="RefactoringProviderSupports" supports="*">
25
/// <example title="Test if managing imports is supported">
26
/// <Condition name="RefactoringProviderSupports" supports="FindUnusedUsingDeclarations">
28
public class RefactoringProviderSupportsConditionEvaluator : IConditionEvaluator
30
public bool IsValid(object caller, Condition condition)
32
if (WorkbenchSingleton.Workbench == null) {
35
ITextEditorProvider provider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider;
38
LanguageProperties language = ParserService.CurrentProjectContent.Language;
41
if (string.IsNullOrEmpty(provider.TextEditor.FileName))
44
RefactoringProvider rp = language.RefactoringProvider;
45
if (!rp.IsEnabledForFile(provider.TextEditor.FileName))
48
string supports = condition.Properties["supports"];
52
Type t = rp.GetType();
54
return (bool)t.InvokeMember("Supports" + supports, BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty, null, rp, null);
55
} catch (Exception ex) {
56
LoggingService.Warn(ex.ToString());
62
public abstract class AbstractRefactoringCommand : AbstractMenuCommand
64
public override void Run()
66
if (ParserService.LoadSolutionProjectsThreadRunning) {
69
if (WorkbenchSingleton.Workbench == null) {
72
ITextEditorProvider provider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider;
73
if (provider == null) return;
74
LanguageProperties language = ParserService.CurrentProjectContent.Language;
75
if (language == null) return;
77
RefactoringProvider rp = language.RefactoringProvider;
78
Run(provider.TextEditor, rp);
81
protected ResolveResult ResolveAtCaret(ITextEditor textEditor)
83
string fileName = textEditor.FileName;
84
IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(fileName);
85
if (expressionFinder == null) return null;
86
string content = textEditor.Document.Text;
87
ExpressionResult expr = expressionFinder.FindFullExpression(content, textEditor.Caret.Offset);
88
if (expr.Expression == null) return null;
89
return ParserService.Resolve(expr, textEditor.Caret.Line, textEditor.Caret.Column, fileName, content);
92
protected abstract void Run(ITextEditor textEditor, RefactoringProvider provider);
95
public class RemoveUnusedUsingsCommand : AbstractRefactoringCommand
97
protected override void Run(ITextEditor textEditor, RefactoringProvider provider)
99
using (var pm = Gui.AsynchronousWaitDialog.ShowWaitDialog("${res:SharpDevelop.Refactoring.RemoveUnusedImports}")) {
100
NamespaceRefactoringService.ManageUsings(pm, textEditor.FileName, textEditor.Document, true, true);
105
public class RenameCommand : AbstractRefactoringCommand
107
protected override void Run(ITextEditor textEditor, RefactoringProvider provider)
109
ResolveResult rr = ResolveAtCaret(textEditor);
110
if (rr is MixedResolveResult) rr = (rr as MixedResolveResult).PrimaryResult;
111
if (rr is TypeResolveResult) {
112
Rename((rr as TypeResolveResult).ResolvedClass);
113
} else if (rr is MemberResolveResult) {
114
Rename((rr as MemberResolveResult).ResolvedMember);
115
} else if (rr is MethodGroupResolveResult) {
116
Rename((rr as MethodGroupResolveResult).GetMethodIfSingleOverload());
117
} else if (rr is LocalResolveResult) {
118
RenameLocalVariableCommand.Run(rr as LocalResolveResult);
120
ShowUnknownSymbolError();
124
static void ShowUnknownSymbolError()
126
MessageService.ShowMessage("${res:SharpDevelop.Refactoring.CannotRenameElement}");
128
static void ShowNoUserCodeError()
130
MessageService.ShowMessage("${res:SharpDevelop.Refactoring.CannotRenameBecauseNotUserCode}");
133
static void Rename(IMember member)
135
if (member == null) {
136
ShowUnknownSymbolError();
137
} else if (member.DeclaringType.CompilationUnit.FileName == null) {
138
ShowNoUserCodeError();
140
IMethod method = member as IMethod;
141
if (method != null && method.IsConstructor) {
142
Rename(method.DeclaringType);
144
FindReferencesAndRenameHelper.RenameMember(member);
149
static void Rename(IClass c)
152
ShowUnknownSymbolError();
153
} else if (c.CompilationUnit.FileName == null) {
154
ShowNoUserCodeError();
156
FindReferencesAndRenameHelper.RenameClass(c);