bool CompleteCompletionSession(char ch) { if (_completionSession == null) { return(false); } bool commit = false; bool moveBack = false; Completion completion = null; XSCompletion xscompletion = null; ITextCaret caret = null; WriteOutputMessage("CompleteCompletionSession()"); if (_completionSession.SelectedCompletionSet != null) { bool addDelim = false; if (_completionSession.SelectedCompletionSet.SelectionStatus.Completion != null) { completion = _completionSession.SelectedCompletionSet.SelectionStatus.Completion; } xscompletion = completion as XSCompletion; Kind kind = Kind.Unknown; if (xscompletion != null) { kind = xscompletion.Kind; } bool ctor = false; // some tokens need to be added to the insertion text. switch (kind) { case Kind.Keyword: formatKeyword(completion); break; case Kind.Class: case Kind.Structure: case Kind.Constructor: ctor = true; goto default; default: switch (ch) { case '{' when ctor: case '}' when ctor: if (!completion.InsertionText.EndsWith("{")) { completion.InsertionText += "{"; } break; case '\t': // Tab case '\r': // CR case '\n': // CR case '.': // DOT case ':': // COLON case '\0': break; default: var s = ch.ToString(); if (!completion.InsertionText.EndsWith(s)) { completion.InsertionText += s; } break; } break; } if ((_completionSession.SelectedCompletionSet.Completions.Count > 0) && (_completionSession.SelectedCompletionSet.SelectionStatus.IsSelected)) { if (XSettings.EditorCompletionAutoPairs) { caret = _completionSession.TextView.Caret; addDelim = true; WriteOutputMessage(" --> select " + completion.InsertionText); if (kind == Kind.Constructor) { completion.InsertionText += "{"; } else if (kind.HasParameters() && !completion.InsertionText.EndsWith("(")) { completion.InsertionText += "("; } } commit = true; } else { if (completion != null) { // Push the completion char into the InsertionText if needed if (!completion.InsertionText.EndsWith(ch.ToString())) { completion.InsertionText += ch; } if (XSettings.EditorCompletionAutoPairs) { caret = _completionSession.TextView.Caret; addDelim = true; } } commit = true; } if (addDelim) { if (completion.InsertionText.EndsWith("(")) { moveBack = true; completion.InsertionText += ")"; } else if (completion.InsertionText.EndsWith("{")) { moveBack = true; completion.InsertionText += "}"; } else if (completion.InsertionText.EndsWith("[")) { moveBack = true; completion.InsertionText += "]"; } } } if (commit) { WriteOutputMessage(" --> Commit"); var session = _completionSession; session.Properties.TryGetProperty(XsCompletionProperties.Type, out IXTypeSymbol type); string insertionText = completion.InsertionText; session.Properties.TryGetProperty(XsCompletionProperties.Char, out char triggerChar); if (ch == '.' || ch == ':') { if (insertionText.IndexOfAny("({".ToCharArray()) == -1) { completion.InsertionText += ch; } } _completionSession.Commit(); if (moveBack && (caret != null)) { caret.MoveToPreviousCaretPosition(); } // if a method or constructor was chosen, then trigger the signature help if (insertionText.Contains('(') || insertionText.Contains('{')) { TriggerSignatureHelp(type, insertionText, triggerChar); } return(true); } WriteOutputMessage(" --> Dismiss"); _completionSession.Dismiss(); return(false); }