Browse Source

- Removed context menu items which are now represented by Context actions (it will be possible to add context actions also to any menu if we decide to do so). ResolveExtensionMethod and ResolveAttribute will be implemented as context actions soon.

- ParserService.ParseCurrentViewContent() when getting context actions, so that the DOM is up to date. Context actions will be moved to background thread.


git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@6331 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Martin Koníček 15 years ago
parent
commit
13e4f5a65b
  1. 11
      src/AddIns/Misc/SharpRefactoring/Project/SharpRefactoring.addin
  2. 66
      src/AddIns/Misc/SharpRefactoring/Project/Src/ClassRefactoringSubmenuBuilder.cs
  3. 1
      src/AddIns/Misc/SharpRefactoring/Project/Src/GenerateCode.cs
  4. 48
      src/Main/Base/Project/Src/Editor/Commands/ClassBookmarkSubmenuBuilder.cs
  5. 31
      src/Main/Base/Project/Src/Editor/Commands/ClassMemberMenuBuilder.cs
  6. 2
      src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/ContextActionsService.cs
  7. 57
      src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs

11
src/AddIns/Misc/SharpRefactoring/Project/SharpRefactoring.addin

@ -29,17 +29,6 @@ @@ -29,17 +29,6 @@
insertbefore="MenuBuilder" />
</Path>
<Path name="/SharpDevelop/ViewContent/TextEditor/ContextMenu/Refactorings">
<Condition name="ActiveContentExtension" activeextension=".cs" action="Exclude">
<Class id="IntroduceMethod"
class="SharpRefactoring.IntroduceMethod" />
<Class id="ResolveExtensionMethod"
class="SharpRefactoring.ResolveExtensionMethod" />
<Class id="ResolveAttribute"
class="SharpRefactoring.ResolveAttribute" />
</Condition>
</Path>
<Path name = "/SharpDevelop/Workbench/MainMenu/Refactor">
<MenuItem id = "ExtractMethod"
label = "${res:AddIns.SharpRefactoring.ExtractMethod}"

66
src/AddIns/Misc/SharpRefactoring/Project/Src/ClassRefactoringSubmenuBuilder.cs

@ -52,14 +52,6 @@ namespace SharpRefactoring @@ -52,14 +52,6 @@ namespace SharpRefactoring
}
LanguageProperties language = c.ProjectContent.Language;
if (language == LanguageProperties.CSharp) {
AddImplementAbstractClassCommands(c, resultItems);
}
if (c.BaseTypes.Count > 0 && c.ClassType != ClassType.Interface && !FindReferencesAndRenameHelper.IsReadOnly(c)) {
AddImplementInterfaceCommands(c, resultItems);
}
if (!FindReferencesAndRenameHelper.IsReadOnly(c)) {
AddCorrectClassFileNameCommands(c, resultItems);
@ -132,64 +124,6 @@ namespace SharpRefactoring @@ -132,64 +124,6 @@ namespace SharpRefactoring
}
}
void AddImplementInterfaceCommands(IClass c, List<ToolStripItem> list)
{
CodeGenerator codeGen = c.ProjectContent.Language.CodeGenerator;
if (codeGen == null) return;
List<ToolStripItem> subItems = new List<ToolStripItem>();
if (c.ProjectContent.Language.SupportsImplicitInterfaceImplementation) {
// 'Implement interface (implicit)' menu item with subitems
AddImplementInterfaceCommandItems(subItems, c, false);
if (subItems.Count > 0) {
list.Add(new ICSharpCode.Core.WinForms.Menu("${res:SharpDevelop.Refactoring.ImplementInterfaceImplicit}", subItems.ToArray()));
subItems = new List<ToolStripItem>();
}
}
// 'Implement interface (explicit)' menu item with subitems
AddImplementInterfaceCommandItems(subItems, c, true);
if (subItems.Count > 0) {
string explicitMenuItemLabel = StringParser.Parse(c.ProjectContent.Language.SupportsImplicitInterfaceImplementation
? "${res:SharpDevelop.Refactoring.ImplementInterfaceExplicit}"
: "${res:SharpDevelop.Refactoring.ImplementInterface}");
list.Add(new ICSharpCode.Core.WinForms.Menu(explicitMenuItemLabel, subItems.ToArray()));
}
}
void AddImplementInterfaceCommandItems(List<ToolStripItem> subItems, IClass c, bool explicitImpl)
{
IAmbience ambience = AmbienceService.GetCurrentAmbience();
ambience.ConversionFlags = ConversionFlags.ShowTypeParameterList;
MakeMenuItemsFromActions(subItems, RefactoringService.GetImplementInterfaceActions(c, explicitImpl), ambience);
}
void AddImplementAbstractClassCommands(IClass c, List<ToolStripItem> list)
{
List<ToolStripItem> subItems = new List<ToolStripItem>();
AddImplementAbstractClassCommandItems(subItems, c);
if (subItems.Count > 0) {
list.Add(new ICSharpCode.Core.WinForms.Menu("${res:SharpDevelop.Refactoring.ImplementAbstractClass}", subItems.ToArray()));
}
}
void AddImplementAbstractClassCommandItems(List<ToolStripItem> subItems, IClass c)
{
IAmbience ambience = c.ProjectContent.Language.GetAmbience();
ambience.ConversionFlags = ConversionFlags.ShowTypeParameterList;
MakeMenuItemsFromActions(subItems, RefactoringService.GetImplementAbstractClassActions(c), ambience);
}
void MakeMenuItemsFromActions(List<ToolStripItem> subItems, IEnumerable<RefactoringService.ImplementAbstractClassAction> actions, IAmbience labelAmbience)
{
foreach (var action in actions) {
var actionCopy = action;
subItems.Add(new MenuCommand(
labelAmbience.Convert(actionCopy.ClassToImplement),
delegate { actionCopy.Execute(); }));
}
}
#region Implementation
void Rename(object sender, EventArgs e)
{

1
src/AddIns/Misc/SharpRefactoring/Project/Src/GenerateCode.cs

@ -40,7 +40,6 @@ namespace SharpRefactoring @@ -40,7 +40,6 @@ namespace SharpRefactoring
return null;
string title = "${res:AddIns.SharpRefactoring.IntroduceMethod}";
try {
title = string.Format(StringParser.Parse("${res:AddIns.SharpRefactoring.IntroduceMethod}"), unknownMethodCall.CallName, unknownMethodCall.Target.FullyQualifiedName);
} catch (FormatException) {

48
src/Main/Base/Project/Src/Editor/Commands/ClassBookmarkSubmenuBuilder.cs

@ -58,8 +58,6 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands @@ -58,8 +58,6 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
return new ToolStripMenuItem[0];
}
LanguageProperties language = c.ProjectContent.Language;
List<ToolStripItem> list = new List<ToolStripItem>();
// navigation actions
@ -70,19 +68,6 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands @@ -70,19 +68,6 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
list.Add(cmd);
}
// Search actions
list.Add(new MenuSeparator());
if (!c.IsSealed && !c.IsStatic) {
cmd = new MenuCommand("${res:SharpDevelop.Refactoring.FindDerivedClassesCommand}", FindDerivedClasses);
cmd.Tag = c;
list.Add(cmd);
}
cmd = FindReferencesAndRenameHelper.MakeFindReferencesMenuCommand(FindReferences);
cmd.Tag = c;
list.Add(cmd);
return list.ToArray();
}
@ -99,39 +84,6 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands @@ -99,39 +84,6 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
}
}
void FindDerivedClasses(object sender, EventArgs e)
{
MenuCommand item = (MenuCommand)sender;
IClass c = (IClass)item.Tag;
IEnumerable<IClass> derivedClasses = RefactoringService.FindDerivedClasses(c, ParserService.AllProjectContents, false);
IAmbience ambience = AmbienceService.GetCurrentAmbience();
ambience.ConversionFlags = ConversionFlags.UseFullyQualifiedMemberNames | ConversionFlags.ShowTypeParameterList;
List<SearchResultMatch> results = new List<SearchResultMatch>();
foreach (IClass derivedClass in derivedClasses) {
if (derivedClass.CompilationUnit == null) continue;
if (derivedClass.CompilationUnit.FileName == null) continue;
ProvidedDocumentInformation documentInfo = FindReferencesAndRenameHelper.GetDocumentInformation(derivedClass.CompilationUnit.FileName);
SearchResultMatch res = new SimpleSearchResultMatch(documentInfo, ambience.Convert(derivedClass), new Location(derivedClass.Region.BeginColumn, derivedClass.Region.BeginLine));
results.Add(res);
}
SearchResultsPad.Instance.ShowSearchResults(
StringParser.Parse("${res:SharpDevelop.Refactoring.ClassesDerivingFrom}", new string[,] {{ "Name", c.Name }}),
results
);
SearchResultsPad.Instance.BringToFront();
}
void FindReferences(object sender, EventArgs e)
{
MenuCommand item = (MenuCommand)sender;
IClass c = (IClass)item.Tag;
FindReferencesAndRenameHelper.RunFindReferences(c);
}
public static IClass GetClass(object menuOwner)
{
IClass c;

31
src/Main/Base/Project/Src/Editor/Commands/ClassMemberMenuBuilder.cs

@ -66,11 +66,6 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands @@ -66,11 +66,6 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
cmd.Tag = member;
list.Add(cmd);
}
if (member != null && member.IsOverridable) {
cmd = new MenuCommand("${res:SharpDevelop.Refactoring.FindOverridesCommand}", FindOverrides);
cmd.Tag = member;
list.Add(cmd);
}
cmd = new MenuCommand("${res:SharpDevelop.Refactoring.FindReferencesCommand}", FindReferences);
cmd.Tag = member;
@ -187,32 +182,6 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands @@ -187,32 +182,6 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
FindReferencesAndRenameHelper.RenameMember((IMember)item.Tag);
}
void FindOverrides(object sender, EventArgs e)
{
MenuCommand item = (MenuCommand)sender;
IMember member = (IMember)item.Tag;
IEnumerable<IClass> derivedClasses = RefactoringService.FindDerivedClasses(member.DeclaringType, ParserService.AllProjectContents, false);
List<SearchResultMatch> results = new List<SearchResultMatch>();
IAmbience ambience = AmbienceService.GetCurrentAmbience();
ambience.ConversionFlags = ConversionFlags.UseFullyQualifiedMemberNames | ConversionFlags.ShowTypeParameterList;
foreach (IClass derivedClass in derivedClasses) {
if (derivedClass.CompilationUnit == null) continue;
if (derivedClass.CompilationUnit.FileName == null) continue;
IMember m = MemberLookupHelper.FindSimilarMember(derivedClass, member);
if (m != null && !m.Region.IsEmpty) {
string matchText = ambience.Convert(m);
ProvidedDocumentInformation documentInfo = FindReferencesAndRenameHelper.GetDocumentInformation(m.DeclaringType.CompilationUnit.FileName);
SearchResultMatch res = new SimpleSearchResultMatch(documentInfo, matchText, new Location(m.Region.BeginColumn, m.Region.BeginLine));
results.Add(res);
}
}
SearchResultsPad.Instance.ShowSearchResults(
StringParser.Parse("${res:SharpDevelop.Refactoring.OverridesOf}", new string[,] {{ "Name", member.Name }}),
results
);
SearchResultsPad.Instance.BringToFront();
}
void FindReferences(object sender, EventArgs e)
{
MenuCommand item = (MenuCommand)sender;

2
src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/ContextActionsService.cs

@ -39,6 +39,8 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -39,6 +39,8 @@ namespace ICSharpCode.SharpDevelop.Refactoring
/// </summary>
public IEnumerable<IContextAction> GetAvailableActions(ITextEditor editor)
{
var parseTask = ParserService.BeginParseCurrentViewContent();
parseTask.Wait();
var editorContext = new EditorContext(editor);
// could run providers in parallel
foreach (var provider in this.providers) {

57
src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs

@ -101,19 +101,11 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -101,19 +101,11 @@ namespace ICSharpCode.SharpDevelop.Refactoring
context.IsDefinition = caretLine == ((LocalResolveResult)rr).VariableDefinitionRegion.BeginLine;
item = MakeItem((LocalResolveResult)rr, context);
insertIndex = 0; // Insert local variable menu item at the topmost position.
} else if (rr is UnknownIdentifierResolveResult) {
item = MakeItemForResolveError((UnknownIdentifierResolveResult)rr, expressionResult.Context, textEditor);
insertIndex = 0; // Insert menu item at the topmost position.
} else if (rr is UnknownConstructorCallResolveResult) {
item = MakeItemForResolveError((UnknownConstructorCallResolveResult)rr, expressionResult.Context, textEditor);
insertIndex = 0; // Insert menu item at the topmost position.
}
if (item != null) {
resultItems.Insert(insertIndex, item);
}
AddRefactoringItemsToTheBeginning(resultItems, context);
// Include menu for current class and method
ICompilationUnit cu = null;
IMember callingMember = null;
@ -146,17 +138,6 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -146,17 +138,6 @@ namespace ICSharpCode.SharpDevelop.Refactoring
return resultItems;
}
void AddRefactoringItemsToTheBeginning(List<object> resultItems, RefactoringMenuContext refactoringContext)
{
List<IRefactoringMenuItemFactory> refactorings = AddInTree.BuildItems<IRefactoringMenuItemFactory>("/SharpDevelop/ViewContent/TextEditor/ContextMenu/Refactorings", null, false);
foreach (IRefactoringMenuItemFactory r in refactorings) {
MenuItem refactoringItem = r.Create(refactoringContext);
if (refactoringItem != null)
resultItems.Insert(0, refactoringItem);
}
}
#region AddTopLevelContextItems
/// <summary>
@ -180,16 +161,14 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -180,16 +161,14 @@ namespace ICSharpCode.SharpDevelop.Refactoring
}
if (context.ResolveResult is MemberResolveResult) {
IMember member = ((MemberResolveResult)context.ResolveResult).ResolvedMember as IMember;
if (member != null && member.IsOverridable) {
contextItems.AddIfNotNull(MakeFindOverridesItem(member, context));
}
contextItems.AddIfNotNull(MakeFindOverridesItem(member, context));
}
return contextItems;
}
MenuItem MakeFindDerivedClassesItem(IClass baseClass, RefactoringMenuContext context)
{
if (baseClass == null)
if (baseClass == null || baseClass.IsStatic || baseClass.IsSealed)
return null;
var item = new MenuItem { Header = MenuService.ConvertLabel(StringParser.Parse("${res:SharpDevelop.Refactoring.FindDerivedClassesCommand}")) };
item.Icon = ClassBrowserIconService.Class.CreateImage();
@ -202,7 +181,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -202,7 +181,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
MenuItem MakeFindBaseClassesItem(IClass @class, RefactoringMenuContext context)
{
if (@class == null)
if (@class == null || @class.BaseTypes == null || @class.BaseTypes.Count == 0)
return null;
var item = new MenuItem { Header = MenuService.ConvertLabel("${res:SharpDevelop.Refactoring.FindBaseClassesCommand}") };
item.Icon = ClassBrowserIconService.Interface.CreateImage();
@ -215,7 +194,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -215,7 +194,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
MenuItem MakeFindOverridesItem(IMember member, RefactoringMenuContext context)
{
if (member == null)
if (member == null || !member.IsOverridable)
return null;
var item = new MenuItem { Header = MenuService.ConvertLabel(StringParser.Parse("${res:SharpDevelop.Refactoring.FindOverridesCommand}")) };
item.Icon = ClassBrowserIconService.Method.CreateImage();
@ -228,34 +207,6 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -228,34 +207,6 @@ namespace ICSharpCode.SharpDevelop.Refactoring
#endregion
MenuItem MakeItemForResolveError(UnknownIdentifierResolveResult unknownIdent, ExpressionContext context, ITextEditor textArea)
{
return MakeItemForActions(RefactoringService.GetAddUsingActions(unknownIdent, textArea), unknownIdent.Identifier, unknownIdent.CallingClass);
}
MenuItem MakeItemForResolveError(UnknownConstructorCallResolveResult unknownConstructor, ExpressionContext context, ITextEditor textArea)
{
return MakeItemForActions(RefactoringService.GetAddUsingActions(unknownConstructor, textArea), unknownConstructor.TypeName, unknownConstructor.CallingClass);
}
MenuItem MakeItemForActions(IEnumerable<RefactoringService.AddUsingAction> menuActions, string unknownClassName, IClass callingClass)
{
var actions = menuActions.ToList();
if (actions.Count == 0)
return null;
MenuItem item = MakeItemInternal(unknownClassName, ClassBrowserIconService.GotoArrow, callingClass.CompilationUnit, DomRegion.Empty);
foreach (var action in actions) {
MenuItem subItem = new MenuItem();
subItem.Header = "using " + action.NewNamespace;
subItem.Icon = ClassBrowserIconService.Namespace.CreateImage();
item.Items.Add(subItem);
subItem.Click += delegate {
action.Execute();
};
}
return item;
}
IMember GetCallingMember(IClass callingClass, int caretLine, int caretColumn)
{
if (callingClass == null) {

Loading…
Cancel
Save