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 16 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 @@
insertbefore="MenuBuilder" /> insertbefore="MenuBuilder" />
</Path> </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"> <Path name = "/SharpDevelop/Workbench/MainMenu/Refactor">
<MenuItem id = "ExtractMethod" <MenuItem id = "ExtractMethod"
label = "${res:AddIns.SharpRefactoring.ExtractMethod}" label = "${res:AddIns.SharpRefactoring.ExtractMethod}"

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

@ -52,14 +52,6 @@ namespace SharpRefactoring
} }
LanguageProperties language = c.ProjectContent.Language; 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)) { if (!FindReferencesAndRenameHelper.IsReadOnly(c)) {
AddCorrectClassFileNameCommands(c, resultItems); AddCorrectClassFileNameCommands(c, resultItems);
@ -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 #region Implementation
void Rename(object sender, EventArgs e) void Rename(object sender, EventArgs e)
{ {

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

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

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

@ -58,8 +58,6 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
return new ToolStripMenuItem[0]; return new ToolStripMenuItem[0];
} }
LanguageProperties language = c.ProjectContent.Language;
List<ToolStripItem> list = new List<ToolStripItem>(); List<ToolStripItem> list = new List<ToolStripItem>();
// navigation actions // navigation actions
@ -70,19 +68,6 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
list.Add(cmd); 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(); return list.ToArray();
} }
@ -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) public static IClass GetClass(object menuOwner)
{ {
IClass c; IClass c;

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

@ -66,11 +66,6 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
cmd.Tag = member; cmd.Tag = member;
list.Add(cmd); 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 = new MenuCommand("${res:SharpDevelop.Refactoring.FindReferencesCommand}", FindReferences);
cmd.Tag = member; cmd.Tag = member;
@ -187,32 +182,6 @@ namespace ICSharpCode.SharpDevelop.Editor.Commands
FindReferencesAndRenameHelper.RenameMember((IMember)item.Tag); 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) void FindReferences(object sender, EventArgs e)
{ {
MenuCommand item = (MenuCommand)sender; MenuCommand item = (MenuCommand)sender;

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

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

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

@ -101,19 +101,11 @@ namespace ICSharpCode.SharpDevelop.Refactoring
context.IsDefinition = caretLine == ((LocalResolveResult)rr).VariableDefinitionRegion.BeginLine; context.IsDefinition = caretLine == ((LocalResolveResult)rr).VariableDefinitionRegion.BeginLine;
item = MakeItem((LocalResolveResult)rr, context); item = MakeItem((LocalResolveResult)rr, context);
insertIndex = 0; // Insert local variable menu item at the topmost position. 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) { if (item != null) {
resultItems.Insert(insertIndex, item); resultItems.Insert(insertIndex, item);
} }
AddRefactoringItemsToTheBeginning(resultItems, context);
// Include menu for current class and method // Include menu for current class and method
ICompilationUnit cu = null; ICompilationUnit cu = null;
IMember callingMember = null; IMember callingMember = null;
@ -146,17 +138,6 @@ namespace ICSharpCode.SharpDevelop.Refactoring
return resultItems; 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 #region AddTopLevelContextItems
/// <summary> /// <summary>
@ -180,16 +161,14 @@ namespace ICSharpCode.SharpDevelop.Refactoring
} }
if (context.ResolveResult is MemberResolveResult) { if (context.ResolveResult is MemberResolveResult) {
IMember member = ((MemberResolveResult)context.ResolveResult).ResolvedMember as IMember; 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; return contextItems;
} }
MenuItem MakeFindDerivedClassesItem(IClass baseClass, RefactoringMenuContext context) MenuItem MakeFindDerivedClassesItem(IClass baseClass, RefactoringMenuContext context)
{ {
if (baseClass == null) if (baseClass == null || baseClass.IsStatic || baseClass.IsSealed)
return null; return null;
var item = new MenuItem { Header = MenuService.ConvertLabel(StringParser.Parse("${res:SharpDevelop.Refactoring.FindDerivedClassesCommand}")) }; var item = new MenuItem { Header = MenuService.ConvertLabel(StringParser.Parse("${res:SharpDevelop.Refactoring.FindDerivedClassesCommand}")) };
item.Icon = ClassBrowserIconService.Class.CreateImage(); item.Icon = ClassBrowserIconService.Class.CreateImage();
@ -202,7 +181,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
MenuItem MakeFindBaseClassesItem(IClass @class, RefactoringMenuContext context) MenuItem MakeFindBaseClassesItem(IClass @class, RefactoringMenuContext context)
{ {
if (@class == null) if (@class == null || @class.BaseTypes == null || @class.BaseTypes.Count == 0)
return null; return null;
var item = new MenuItem { Header = MenuService.ConvertLabel("${res:SharpDevelop.Refactoring.FindBaseClassesCommand}") }; var item = new MenuItem { Header = MenuService.ConvertLabel("${res:SharpDevelop.Refactoring.FindBaseClassesCommand}") };
item.Icon = ClassBrowserIconService.Interface.CreateImage(); item.Icon = ClassBrowserIconService.Interface.CreateImage();
@ -215,7 +194,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
MenuItem MakeFindOverridesItem(IMember member, RefactoringMenuContext context) MenuItem MakeFindOverridesItem(IMember member, RefactoringMenuContext context)
{ {
if (member == null) if (member == null || !member.IsOverridable)
return null; return null;
var item = new MenuItem { Header = MenuService.ConvertLabel(StringParser.Parse("${res:SharpDevelop.Refactoring.FindOverridesCommand}")) }; var item = new MenuItem { Header = MenuService.ConvertLabel(StringParser.Parse("${res:SharpDevelop.Refactoring.FindOverridesCommand}")) };
item.Icon = ClassBrowserIconService.Method.CreateImage(); item.Icon = ClassBrowserIconService.Method.CreateImage();
@ -228,34 +207,6 @@ namespace ICSharpCode.SharpDevelop.Refactoring
#endregion #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) IMember GetCallingMember(IClass callingClass, int caretLine, int caretColumn)
{ {
if (callingClass == null) { if (callingClass == null) {

Loading…
Cancel
Save