示例#1
0
        /// <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);
            }
        }
示例#2
0
        /// <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));
            }
        }