diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionBinding.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionBinding.cs index 298c07682a..9c2ebe0566 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionBinding.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionBinding.cs @@ -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 } 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 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 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()); + + DefaultCompletionItemList list = new DefaultCompletionItemList(); + list.Items.AddRange(completionData.Cast()); 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; - } } } diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/Parser.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/Parser.cs index 2fb5b1521e..18e30a2587 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/Parser.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/Parser.cs @@ -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; diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/SharpDevelopCompletionWindow.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/SharpDevelopCompletionWindow.cs index dba8554c02..955d8bbece 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/SharpDevelopCompletionWindow.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/SharpDevelopCompletionWindow.cs @@ -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 = diff --git a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlCompletionItemCollection.cs b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlCompletionItemCollection.cs index f629407eb8..f11a995ee5 100644 --- a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlCompletionItemCollection.cs +++ b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlCompletionItemCollection.cs @@ -142,6 +142,7 @@ namespace ICSharpCode.XmlEditor } public int PreselectionLength { get; set; } + public int PostselectionLength { get; set; } public void Complete(CompletionContext context, ICompletionItem item) { diff --git a/src/Main/Base/Project/Src/Editor/CodeCompletion/ICompletionItemList.cs b/src/Main/Base/Project/Src/Editor/CodeCompletion/ICompletionItemList.cs index 4e3f4a6ad1..9481b68273 100644 --- a/src/Main/Base/Project/Src/Editor/CodeCompletion/ICompletionItemList.cs +++ b/src/Main/Base/Project/Src/Editor/CodeCompletion/ICompletionItemList.cs @@ -20,11 +20,15 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion ICompletionItem SuggestedItem { get; } /// - /// 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). /// int PreselectionLength { get; } + /// + /// Gets the length of the postselection (text after the caret that should be included as completed expression). + /// + int PostselectionLength { get; } + /// /// Processes the specified key press. /// @@ -97,6 +101,9 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion /// public int PreselectionLength { get; set; } + /// + public int PostselectionLength { get; set; } + /// public ICompletionItem SuggestedItem { get; set; } diff --git a/src/Main/Base/Project/Src/Services/ParserService/ParseInformation.cs b/src/Main/Base/Project/Src/Services/ParserService/ParseInformation.cs index d2e3ad438a..123b6ae675 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/ParseInformation.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/ParseInformation.cs @@ -20,7 +20,6 @@ namespace ICSharpCode.SharpDevelop.Parser readonly IParsedFile parsedFile; IList tagComments = new List(); readonly bool isFullParseInformation; - bool isFrozen; public ParseInformation(IParsedFile parsedFile, bool isFullParseInformation) {