/// <summary> /// Attempts to convert VS Completion trigger into Roslyn completion trigger /// </summary> /// <param name="trigger">VS completion trigger</param> /// <param name="triggerLocation">Character. /// VS provides Backspace and Delete characters inside the trigger while Roslyn needs the char deleted by the trigger. /// Therefore, we provide this character separately and use it for Delete and Backspace cases only. /// We retrieve this character from triggerLocation. /// </param> /// <returns>Roslyn completion trigger</returns> internal static RoslynTrigger GetRoslynTrigger(AsyncCompletionData.CompletionTrigger trigger, SnapshotPoint triggerLocation) { switch (trigger.Reason) { case AsyncCompletionData.CompletionTriggerReason.InvokeAndCommitIfUnique: return(new RoslynTrigger(CompletionTriggerKind.InvokeAndCommitIfUnique)); case AsyncCompletionData.CompletionTriggerReason.Insertion: return(RoslynTrigger.CreateInsertionTrigger(trigger.Character)); case AsyncCompletionData.CompletionTriggerReason.Deletion: case AsyncCompletionData.CompletionTriggerReason.Backspace: var snapshotBeforeEdit = trigger.ViewSnapshotBeforeTrigger; char characterRemoved; if (triggerLocation.Position >= 0 && triggerLocation.Position < snapshotBeforeEdit.Length) { // If multiple characters were removed (selection), this finds the first character from the left. characterRemoved = snapshotBeforeEdit[triggerLocation.Position]; } else { characterRemoved = (char)0; } return(RoslynTrigger.CreateDeletionTrigger(characterRemoved)); case AsyncCompletionData.CompletionTriggerReason.SnippetsMode: return(new RoslynTrigger(CompletionTriggerKind.Snippets)); default: return(RoslynTrigger.Invoke); } }
/// <summary> /// Attempts to convert VS Completion trigger into Roslyn completion trigger /// </summary> /// <param name="trigger">VS completion trigger</param> /// <param name="triggerLocation">Character. /// VS provides Backspace and Delete characters inside the trigger while Roslyn needs the char deleted by the trigger. /// Therefore, we provide this character separately and use it for Delete and Backspace cases only. /// We retrieve this character from triggerLocation. /// </param> /// <returns>Roslyn completion trigger</returns> internal static RoslynTrigger GetRoslynTrigger(EditorAsyncCompletionData.CompletionTrigger trigger, SnapshotPoint triggerLocation) { var completionTriggerKind = GetRoslynTriggerKind(trigger); if (completionTriggerKind == CompletionTriggerKind.Deletion) { var snapshotBeforeEdit = trigger.ViewSnapshotBeforeTrigger; char characterRemoved; if (triggerLocation.Position >= 0 && triggerLocation.Position < snapshotBeforeEdit.Length) { // If multiple characters were removed (selection), this finds the first character from the left. characterRemoved = snapshotBeforeEdit[triggerLocation.Position]; } else { characterRemoved = (char)0; } return(RoslynTrigger.CreateDeletionTrigger(characterRemoved)); } else { return(new RoslynTrigger(completionTriggerKind, trigger.Character)); } }