From 79e8189c7c42d9954e311a576c89e1772a87107b Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Wed, 7 Apr 2010 14:34:24 +0000 Subject: [PATCH] Fixed SD2-1604 - Code completion does not learn commonly used items git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@5676 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../XamlBinding/XamlBinding/XamlCompletionItem.cs | 1 + .../Src/SharpDevelopCompletionWindow.cs | 4 ++++ .../Src/Snippets/SnippetCompletionItem.cs | 7 +++++++ .../CodeCompletion/CompletionList.cs | 2 +- .../CodeCompletion/ICompletionData.cs | 6 ++++++ .../CodeCompletion/CodeCompletionItemProvider.cs | 10 ++++++++-- .../Src/Editor/CodeCompletion/ICompletionItem.cs | 11 +++++++++++ .../Editor/CodeCompletion/OverrideCompletionItem.cs | 4 +++- 8 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlCompletionItem.cs b/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlCompletionItem.cs index 519be97914..4a3ebd57d8 100644 --- a/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlCompletionItem.cs +++ b/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlCompletionItem.cs @@ -70,6 +70,7 @@ namespace ICSharpCode.XamlBinding public override void Complete(CompletionContext context) { if (addType) { + MarkAsUsed(); string newText = Entity.DeclaringType.Name + "." + Text; context.Editor.Document.Replace(context.StartOffset, context.Length, newText); context.EndOffset = context.StartOffset + newText.Length; diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/SharpDevelopCompletionWindow.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/SharpDevelopCompletionWindow.cs index 4954dfdb94..dbd54224e6 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/SharpDevelopCompletionWindow.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/SharpDevelopCompletionWindow.cs @@ -168,6 +168,10 @@ namespace ICSharpCode.AvalonEdit.AddIn } } + public double Priority { + get { return item.Priority; } + } + public void Complete(TextArea textArea, ISegment completionSegment, EventArgs insertionRequestEventArgs) { CompletionContext context = new CompletionContext { diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/SnippetCompletionItem.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/SnippetCompletionItem.cs index 6f59a91bcd..15fbba9237 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/SnippetCompletionItem.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/SnippetCompletionItem.cs @@ -38,6 +38,8 @@ namespace ICSharpCode.AvalonEdit.AddIn.Snippets if (textArea == null) throw new ArgumentException("textEditor must be an AvalonEdit text editor"); this.codeSnippet = codeSnippet; + + this.Priority = CodeCompletionDataUsageCache.GetPriority("snippet" + codeSnippet.Name, true); } public bool AlwaysInsertSnippet { get; set; } @@ -63,6 +65,9 @@ namespace ICSharpCode.AvalonEdit.AddIn.Snippets { if (context.Editor != this.textEditor) throw new ArgumentException("wrong editor"); + + CodeCompletionDataUsageCache.IncrementUsage("snippet" + codeSnippet.Name); + using (context.Editor.Document.OpenUndoGroup()) { if (context.CompletionChar == '\t' || AlwaysInsertSnippet) { context.Editor.Document.Remove(context.StartOffset, context.Length); @@ -98,5 +103,7 @@ namespace ICSharpCode.AvalonEdit.AddIn.Snippets return fancyDescription; } } + + public double Priority { get; set; } } } diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionList.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionList.cs index 0f0c74faa3..ea31c3dca3 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionList.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionList.cs @@ -189,7 +189,7 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion for (int i = 0; i < completionData.Count; ++i) { string itemText = completionData[i].Text; if (itemText.StartsWith(startText, StringComparison.OrdinalIgnoreCase)) { - double priority = 0; //completionData[i].Priority; + double priority = completionData[i].Priority; int quality; if (string.Equals(itemText, startText, StringComparison.OrdinalIgnoreCase)) { if (startText == itemText) diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/ICompletionData.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/ICompletionData.cs index c9f549cdd0..dff8a4ab62 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/ICompletionData.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/ICompletionData.cs @@ -38,6 +38,12 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion /// object Description { get; } + /// + /// Gets the priority. This property is used in the selection logic. You can use it to prefer selecting those items + /// which the user is accessing most frequently. + /// + double Priority { get; } + /// /// Perform the completion. /// diff --git a/src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionItemProvider.cs b/src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionItemProvider.cs index 173581e1b5..7a0c6516ba 100644 --- a/src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionItemProvider.cs +++ b/src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionItemProvider.cs @@ -182,8 +182,6 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion public class CodeCompletionItem : ICompletionItem { - // TODO: what to do with these properties? - [Obsolete] public double Priority { get; set; } readonly IEntity entity; @@ -201,6 +199,8 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion description = ambience.Convert(entity); this.Image = ClassBrowserIconService.GetIcon(entity); this.Overloads = 1; + + this.Priority = CodeCompletionDataUsageCache.GetPriority(entity.DotNetName, true); } public IEntity Entity { @@ -213,8 +213,14 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion public IImage Image { get; set; } + protected void MarkAsUsed() + { + CodeCompletionDataUsageCache.IncrementUsage(entity.DotNetName); + } + public virtual void Complete(CompletionContext context) { + MarkAsUsed(); context.Editor.Document.Replace(context.StartOffset, context.Length, this.Text); context.EndOffset = context.StartOffset + this.Text.Length; diff --git a/src/Main/Base/Project/Src/Editor/CodeCompletion/ICompletionItem.cs b/src/Main/Base/Project/Src/Editor/CodeCompletion/ICompletionItem.cs index 44a23bcdb9..0ae4def753 100644 --- a/src/Main/Base/Project/Src/Editor/CodeCompletion/ICompletionItem.cs +++ b/src/Main/Base/Project/Src/Editor/CodeCompletion/ICompletionItem.cs @@ -19,6 +19,15 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion /// Performs code completion for the item. /// void Complete(CompletionContext context); + + /// + /// Gets a priority value for the completion data item. + /// When selecting items by their start characters, the item with the highest + /// priority is selected first. + /// + double Priority { + get; + } } public class DefaultCompletionItem : ICompletionItem @@ -27,6 +36,8 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion public virtual string Description { get; set; } public virtual IImage Image { get; set; } + public virtual double Priority { get { return 0; } } + public DefaultCompletionItem(string text) { this.Text = text; diff --git a/src/Main/Base/Project/Src/Editor/CodeCompletion/OverrideCompletionItem.cs b/src/Main/Base/Project/Src/Editor/CodeCompletion/OverrideCompletionItem.cs index 1ae52149f4..776cb4716d 100644 --- a/src/Main/Base/Project/Src/Editor/CodeCompletion/OverrideCompletionItem.cs +++ b/src/Main/Base/Project/Src/Editor/CodeCompletion/OverrideCompletionItem.cs @@ -14,7 +14,7 @@ using ICSharpCode.SharpDevelop.Dom.Refactoring; namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion { - public class OverrideCompletionItem : ICompletionItem + public sealed class OverrideCompletionItem : ICompletionItem { IMember member; string text; @@ -49,6 +49,8 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion } } + double ICompletionItem.Priority { get { return 0; } } + static string GetName(IMember member, ConversionFlags flags) { IAmbience ambience = AmbienceService.GetCurrentAmbience();