Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Hutchinson <mhutchinson@novell.com>2010-07-30 03:09:43 +0400
committerMichael Hutchinson <mhutchinson@novell.com>2010-07-30 10:08:01 +0400
commite41a7022c65e948c652db8db4a9cb37e85b2da28 (patch)
tree51ac22ca8d0beec8f809d587f0fcba4db97088a9 /main/src/addins/MonoDevelop.AnalysisCore
parent7a14a1645b331c8259cb6c2ab4e2b27d968a5585 (diff)
Added a Show Fixes (Control-.) command.
Diffstat (limited to 'main/src/addins/MonoDevelop.AnalysisCore')
-rw-r--r--main/src/addins/MonoDevelop.AnalysisCore/AnalysisCommands.cs134
-rw-r--r--main/src/addins/MonoDevelop.AnalysisCore/FixHandler.cs2
-rw-r--r--main/src/addins/MonoDevelop.AnalysisCore/MonoDevelop.AnalysisCore.addin.xml16
-rw-r--r--main/src/addins/MonoDevelop.AnalysisCore/MonoDevelop.AnalysisCore.csproj10
4 files changed, 131 insertions, 31 deletions
diff --git a/main/src/addins/MonoDevelop.AnalysisCore/AnalysisCommands.cs b/main/src/addins/MonoDevelop.AnalysisCore/AnalysisCommands.cs
index cb54ea233e..65d4de32a5 100644
--- a/main/src/addins/MonoDevelop.AnalysisCore/AnalysisCommands.cs
+++ b/main/src/addins/MonoDevelop.AnalysisCore/AnalysisCommands.cs
@@ -28,6 +28,9 @@ using System;
using MonoDevelop.Components.Commands;
using System.Linq;
using MonoDevelop.Core;
+using MonoDevelop.Ide.Gui;
+using System.Collections.Generic;
+using Gtk;
namespace MonoDevelop.AnalysisCore
{
@@ -38,15 +41,51 @@ namespace MonoDevelop.AnalysisCore
QuickFix
}
+ class ShowFixesHandler : CommandHandler
+ {
+ protected override void Update (CommandInfo info)
+ {
+ MonoDevelop.Ide.Gui.Document document;
+ IList<FixableResult> results;
+ info.Enabled = FixOperationsHandler.GetFixes (out document, out results)
+ && results.Any (r => FixOperationsHandler.GetActions (document, r).Any ());
+ }
+
+ protected override void Run ()
+ {
+ var doc = MonoDevelop.Ide.IdeApp.Workbench.ActiveDocument;
+ var view = doc.GetContent<MonoDevelop.SourceEditor.SourceEditorView> ();
+ if (view == null) {
+ LoggingService.LogWarning ("ShowFixesHandler could not find a SourceEditorView");
+ return;
+ }
+ var widget = view.TextEditor;
+ var pt = view.DocumentToScreenLocation (doc.Editor.Caret.Location);
+
+ var ces = new CommandEntrySet ();
+ ces.AddItem (AnalysisCommands.FixOperations);
+ var menu = MonoDevelop.Ide.IdeApp.CommandService.CreateMenu (ces);
+
+ menu.Popup (null, null, delegate (Menu mn, out int x, out int y, out bool push_in) {
+ x = pt.X;
+ y = pt.Y;
+ push_in = true;
+ //if the menu would be off the bottom of the screen, "drop" it upwards
+ if (y + mn.Requisition.Height > widget.Screen.Height)
+ y -= mn.Requisition.Height + widget.LineHeight;
+ }, 0, Global.CurrentEventTime);
+ }
+ }
+
class FixOperationsHandler : CommandHandler
{
protected override void Update (CommandArrayInfo info)
{
- var menu = GetFixActionInfos ();
- if (menu != null) {
- menu.Text = GettextCatalog.GetString ("Fix");
- info.Add (menu);
- }
+ MonoDevelop.Ide.Gui.Document document;
+ IList<FixableResult> results;
+ if (!GetFixes (out document, out results))
+ return;
+ PopulateInfos (info, document, results);
}
protected override void Run (object dataItem)
@@ -55,38 +94,79 @@ namespace MonoDevelop.AnalysisCore
action.Fix ();
}
- public static CommandInfoSet GetFixActionInfos ()
+ public static bool GetFixes (out Document document, out IList<FixableResult> results)
{
- var doc = MonoDevelop.Ide.IdeApp.Workbench.ActiveDocument;
- if (doc == null)
- return null;
+ results = null;
+ document = MonoDevelop.Ide.IdeApp.Workbench.ActiveDocument;
+ if (document == null)
+ return false;
- var ext = doc.GetContent<ResultsEditorExtension> ();
+ var ext = document.GetContent<ResultsEditorExtension> ();
if (ext == null)
- return null;
-
- var results = ext.GetResultsAtOffset (doc.Editor.Caret.Offset).OfType<FixableResult> ();
-
- var infoSet = new CommandInfoSet ();
+ return false;
+ var list = ext.GetResultsAtOffset (document.Editor.Caret.Offset).OfType<FixableResult> ().ToList ();
+ list.Sort (ResultCompareImportanceDesc);
+ results = list;
+ return results.Count > 0;
+ }
+
+ static int ResultCompareImportanceDesc (Result r1, Result r2)
+ {
+ int c = ((int)r1.Level).CompareTo ((int)r2.Level);
+ if (c != 0)
+ return c;
+ c = ((int)r1.Importance).CompareTo ((int)r2.Importance);
+ if (c != 0)
+ return c;
+ c = ((int)r1.Certainty).CompareTo ((int)r2.Certainty);
+ if (c != 0)
+ return c;
+ return r1.Message.CompareTo (r2.Message);
+ }
+
+ public static void PopulateInfos (CommandArrayInfo infos, Document doc, IEnumerable<FixableResult> results)
+ {
//FIXME: ellipsize long messages
+ int mnemonic = 1;
foreach (var result in results) {
- foreach (var fix in result.Fixes) {
- var handlers = AnalysisExtensions.GetFixHandlers (fix.FixType);
- bool firstAction = true;
- foreach (var action in handlers.SelectMany (h => h.GetFixes (doc, fix))) {
- if (firstAction) {
- infoSet.CommandInfos.Add (new CommandInfo (result.Message, false, false), null);
- firstAction = false;
- }
- infoSet.CommandInfos.Add (" " + action.Label, action);
+ bool firstAction = true;
+ foreach (var action in GetActions (doc, result)) {
+ if (firstAction) {
+ //FIXME: make this header item insensitive but not greyed out
+ infos.Add (new CommandInfo (result.Message, false, false) {
+ Icon = GetIcon (result.Level)
+ }, null);
+ firstAction = false;
}
+ var label = (mnemonic <= 10)
+ ? "_" + (mnemonic++ % 10).ToString () + " " + action.Label
+ : " " + action.Label;
+ infos.Add (label, action);
}
}
- if (infoSet.CommandInfos.Count == 0)
+ }
+
+ public static IEnumerable<IAnalysisFixAction> GetActions (Document doc, FixableResult result)
+ {
+ foreach (var fix in result.Fixes)
+ foreach (var handler in AnalysisExtensions.GetFixHandlers (fix.FixType))
+ foreach (var action in handler.GetFixes (doc, fix))
+ yield return action;
+ }
+
+ static string GetIcon (ResultLevel severity)
+ {
+ switch (severity) {
+ case ResultLevel.Error:
+ return Gtk.Stock.DialogError;
+ case ResultLevel.Warning:
+ return Gtk.Stock.DialogWarning;
+ case ResultLevel.Suggestion:
+ return Gtk.Stock.Info;
+ default:
return null;
-
- return infoSet;
+ }
}
}
}
diff --git a/main/src/addins/MonoDevelop.AnalysisCore/FixHandler.cs b/main/src/addins/MonoDevelop.AnalysisCore/FixHandler.cs
index e45fb2aaf6..74f3e3f1ab 100644
--- a/main/src/addins/MonoDevelop.AnalysisCore/FixHandler.cs
+++ b/main/src/addins/MonoDevelop.AnalysisCore/FixHandler.cs
@@ -46,6 +46,8 @@ namespace MonoDevelop.AnalysisCore
public class RenameMemberHandler : IFixHandler
{
+ //FIXME: why is this invalid on the parseddocuments loaded when the doc is first loaded?
+ //maybe the item's type's SourceProject is null?
public IEnumerable<IAnalysisFixAction> GetFixes (MonoDevelop.Ide.Gui.Document doc, object fix)
{
var renameFix = (RenameMemberFix) fix;
diff --git a/main/src/addins/MonoDevelop.AnalysisCore/MonoDevelop.AnalysisCore.addin.xml b/main/src/addins/MonoDevelop.AnalysisCore/MonoDevelop.AnalysisCore.addin.xml
index c5f03dfcca..bd10935b0b 100644
--- a/main/src/addins/MonoDevelop.AnalysisCore/MonoDevelop.AnalysisCore.addin.xml
+++ b/main/src/addins/MonoDevelop.AnalysisCore/MonoDevelop.AnalysisCore.addin.xml
@@ -62,14 +62,22 @@
<Command id = "MonoDevelop.AnalysisCore.AnalysisCommands.FixOperations" type="array"
defaultHandler="MonoDevelop.AnalysisCore.FixOperationsHandler"
_label = "Fixes" />
+ <Command id = "MonoDevelop.AnalysisCore.AnalysisCommands.ShowFixes"
+ defaultHandler="MonoDevelop.AnalysisCore.ShowFixesHandler"
+ _label = "Show Fixes"
+ _description="Shows a list of fixes for problems at the current location"
+ macShortcut="Control|."
+ shortcut = "Control|." />
</Extension>
-
+
<Extension path = "/MonoDevelop/SourceEditor2/ContextMenu/Editor">
- <CommandItem id = "MonoDevelop.AnalysisCore.AnalysisCommands.FixOperations"
- insertbefore="MonoDevelop.Refactoring.RefactoryCommands.CurrentRefactoryOperations"/>
+ <ItemSet id = "Fix" _label = "Fix" autohide="true"
+ insertbefore="MonoDevelop.Refactoring.RefactoryCommands.CurrentRefactoryOperations">
+ <CommandItem id = "MonoDevelop.AnalysisCore.AnalysisCommands.FixOperations" />
+ </ItemSet>
</Extension>
<Extension path = "/MonoDevelop/AnalysisCore/FixHandlers">
<Handler fixName="RenameMember" class = "MonoDevelop.AnalysisCore.RenameMemberHandler" />
</Extension>
-</Addin> \ No newline at end of file
+</Addin>
diff --git a/main/src/addins/MonoDevelop.AnalysisCore/MonoDevelop.AnalysisCore.csproj b/main/src/addins/MonoDevelop.AnalysisCore/MonoDevelop.AnalysisCore.csproj
index 203cc4fce2..25aff97452 100644
--- a/main/src/addins/MonoDevelop.AnalysisCore/MonoDevelop.AnalysisCore.csproj
+++ b/main/src/addins/MonoDevelop.AnalysisCore/MonoDevelop.AnalysisCore.csproj
@@ -68,6 +68,16 @@
<Name>NRefactory</Name>
<Private>False</Private>
</ProjectReference>
+ <ProjectReference Include="..\..\core\Mono.Debugging\Mono.Debugging.csproj">
+ <Project>{90C99ADB-7D4B-4EB4-98C2-40BD1B14C7D2}</Project>
+ <Name>Mono.Debugging</Name>
+ <Private>False</Private>
+ </ProjectReference>
+ <ProjectReference Include="..\MonoDevelop.Debugger\MonoDevelop.Debugger.csproj">
+ <Project>{2357AABD-08C7-4808-A495-8FF2D3CDFDB0}</Project>
+ <Name>MonoDevelop.Debugger</Name>
+ <Private>False</Private>
+ </ProjectReference>
</ItemGroup>
<ItemGroup>
<Reference Include="gdk-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">