Browse Source

Improve the code completion triggering logic.

newNRvisualizers
Daniel Grunwald 14 years ago
parent
commit
f3e426468a
  1. 51
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionBinding.cs
  2. 1
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/Parser.cs
  3. 1
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/SharpDevelopCompletionWindow.cs
  4. 1
      src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlCompletionItemCollection.cs
  5. 11
      src/Main/Base/Project/Src/Editor/CodeCompletion/ICompletionItemList.cs
  6. 1
      src/Main/Base/Project/Src/Services/ParserService/ParseInformation.cs

51
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionBinding.cs

@ -2,7 +2,9 @@ @@ -2,7 +2,9 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Linq;
using CSharpBinding.Parser;
using ICSharpCode.NRefactory.Completion;
using ICSharpCode.NRefactory.CSharp.Completion;
@ -22,6 +24,18 @@ namespace CSharpBinding.Completion @@ -22,6 +24,18 @@ namespace CSharpBinding.Completion
}
public bool HandleKeyPressed(ITextEditor editor, char ch)
{
if (editor.ActiveCompletionWindow != null)
return false;
return ShowCompletion(editor, ch, false);
}
public bool CtrlSpace(ITextEditor editor)
{
return ShowCompletion(editor, '\0', true);
}
bool ShowCompletion(ITextEditor editor, char completionChar, bool ctrlSpace)
{
// Don't require the very latest parse information, an older cached version is OK.
var parseInfo = ParserService.GetCachedParseInformation(editor.FileName) as CSharpFullParseInformation;
@ -43,30 +57,45 @@ namespace CSharpBinding.Completion @@ -43,30 +57,45 @@ namespace CSharpBinding.Completion
parseInfo.CompilationUnit,
parseInfo.ParsedFile
);
//cc.FormattingPolicy = ?
cc.EolMarker = DocumentUtilitites.GetLineTerminator(editor.Document, editor.Caret.Line);
//cc.IndentString = ?
DefaultCompletionItemList list = new DefaultCompletionItemList();
if (char.IsLetterOrDigit (ch) || ch == '_') {
//if (completionContext.TriggerOffset > 1 && char.IsLetterOrDigit (document.Editor.GetCharAt (completionContext.TriggerOffset - 2)))
// return null;
list.PreselectionLength = 1;
int startPos, triggerWordLength;
IEnumerable<ICompletionData> completionData;
if (ctrlSpace) {
if (!cc.TryGetCompletionWord(editor.Caret.Offset, out startPos, out triggerWordLength)) {
startPos = editor.Caret.Offset;
triggerWordLength = 0;
}
completionData = cc.GetCompletionData(startPos, true);
} else {
startPos = editor.Caret.Offset;
if (char.IsLetterOrDigit (completionChar) || completionChar == '_') {
if (startPos > 1 && char.IsLetterOrDigit (editor.Document.GetCharAt (startPos - 2)))
return false;
completionData = cc.GetCompletionData(startPos, false);
startPos--;
triggerWordLength = 1;
} else {
completionData = cc.GetCompletionData(startPos, false);
triggerWordLength = 0;
}
}
list.Items.AddRange(cc.GetCompletionData(editor.Caret.Offset, false).Cast<ICompletionItem>());
DefaultCompletionItemList list = new DefaultCompletionItemList();
list.Items.AddRange(completionData.Cast<ICompletionItem>());
if (list.Items.Count > 0) {
list.SortItems();
list.PreselectionLength = editor.Caret.Offset - startPos;
list.PostselectionLength = Math.Max(0, startPos + triggerWordLength - editor.Caret.Offset);
list.SuggestedItem = list.Items.FirstOrDefault(i => i.Text == cc.DefaultCompletionString);
editor.ShowCompletionWindow(list);
return true;
}
return false;
}
public bool CtrlSpace(ITextEditor editor)
{
return false;
}
}
}

1
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/Parser.cs

@ -80,6 +80,7 @@ namespace CSharpBinding.Parser @@ -80,6 +80,7 @@ namespace CSharpBinding.Parser
CSharpParser parser = new CSharpParser();
parser.GenerateTypeSystemMode = !fullParseInformationRequested;
CompilationUnit cu = parser.Parse(fileContent.CreateReader(), fileName);
cu.Freeze();
CSharpParsedFile file = cu.ToTypeSystem();
ParseInformation parseInfo;

1
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/SharpDevelopCompletionWindow.cs

@ -88,6 +88,7 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -88,6 +88,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
this.CompletionList.SelectedItem = adapter;
}
this.StartOffset -= itemList.PreselectionLength;
this.EndOffset += itemList.PostselectionLength;
}
public static readonly DependencyProperty EmptyTextProperty =

1
src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlCompletionItemCollection.cs

@ -142,6 +142,7 @@ namespace ICSharpCode.XmlEditor @@ -142,6 +142,7 @@ namespace ICSharpCode.XmlEditor
}
public int PreselectionLength { get; set; }
public int PostselectionLength { get; set; }
public void Complete(CompletionContext context, ICompletionItem item)
{

11
src/Main/Base/Project/Src/Editor/CodeCompletion/ICompletionItemList.cs

@ -20,11 +20,15 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion @@ -20,11 +20,15 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
ICompletionItem SuggestedItem { get; }
/// <summary>
/// Gets the length of the preselection (text in front of the completion list that
/// should be included as completed expression).
/// Gets the length of the preselection (text in front of the caret that should be included as completed expression).
/// </summary>
int PreselectionLength { get; }
/// <summary>
/// Gets the length of the postselection (text after the caret that should be included as completed expression).
/// </summary>
int PostselectionLength { get; }
/// <summary>
/// Processes the specified key press.
/// </summary>
@ -97,6 +101,9 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion @@ -97,6 +101,9 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
/// <inheritdoc/>
public int PreselectionLength { get; set; }
/// <inheritdoc/>
public int PostselectionLength { get; set; }
/// <inheritdoc/>
public ICompletionItem SuggestedItem { get; set; }

1
src/Main/Base/Project/Src/Services/ParserService/ParseInformation.cs

@ -20,7 +20,6 @@ namespace ICSharpCode.SharpDevelop.Parser @@ -20,7 +20,6 @@ namespace ICSharpCode.SharpDevelop.Parser
readonly IParsedFile parsedFile;
IList<TagComment> tagComments = new List<TagComment>();
readonly bool isFullParseInformation;
bool isFrozen;
public ParseInformation(IParsedFile parsedFile, bool isFullParseInformation)
{

Loading…
Cancel
Save