diff --git a/vsintegration/src/FSharp.Editor/Completion/CompletionProvider.fs b/vsintegration/src/FSharp.Editor/Completion/CompletionProvider.fs index fec42d030f7917bcd51b6bd8786f7ba1b7b5ed7a..d24df1fd8191026ecdb5094859a3b8d84f9cd970 100644 --- a/vsintegration/src/FSharp.Editor/Completion/CompletionProvider.fs +++ b/vsintegration/src/FSharp.Editor/Completion/CompletionProvider.fs @@ -84,22 +84,24 @@ type internal FSharpCompletionProvider static let mruItems = Dictionary<(* Item.FullName *) string, (* hints *) int>() static member ShouldTriggerCompletionAux(sourceText: SourceText, caretPosition: int, trigger: CompletionTriggerKind, getInfo: (unit -> DocumentId * string * string list), intelliSenseOptions: IntelliSenseOptions) = - // Skip if we are at the start of a document - if caretPosition = 0 then false - // Skip if it was triggered by an operation other than insertion - elif not (trigger = CompletionTriggerKind.Insertion) then false - // Skip if we are not on a completion trigger + if caretPosition = 0 then + false else let triggerPosition = caretPosition - 1 let triggerChar = sourceText.[triggerPosition] - // do not trigger completion if it's not single dot, i.e. range expression - if not intelliSenseOptions.ShowAfterCharIsTyped && triggerPosition > 0 && sourceText.[triggerPosition - 1] = '.' then + if trigger = CompletionTriggerKind.Deletion && intelliSenseOptions.ShowAfterCharIsDeleted then + Char.IsLetterOrDigit(sourceText.[triggerPosition]) || triggerChar = '.' + elif not (trigger = CompletionTriggerKind.Insertion) then false else - let documentId, filePath, defines = getInfo() - CompletionUtils.shouldProvideCompletion(documentId, filePath, defines, sourceText, triggerPosition) && - (triggerChar = '.' || (intelliSenseOptions.ShowAfterCharIsTyped && CompletionUtils.isStartingNewWord(sourceText, triggerPosition))) + // Do not trigger completion if it's not single dot, i.e. range expression + if not intelliSenseOptions.ShowAfterCharIsTyped && triggerPosition > 0 && sourceText.[triggerPosition - 1] = '.' then + false + else + let documentId, filePath, defines = getInfo() + CompletionUtils.shouldProvideCompletion(documentId, filePath, defines, sourceText, triggerPosition) && + (triggerChar = '.' || (intelliSenseOptions.ShowAfterCharIsTyped && CompletionUtils.isStartingNewWord(sourceText, triggerPosition))) static member ProvideCompletionsAsyncAux(checker: FSharpChecker, sourceText: SourceText, caretPosition: int, options: FSharpProjectOptions, filePath: string, diff --git a/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs b/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs index 269ae085680c0701c934e3a31a07d705e98ac8f5..3f2610a0d8a3281ce7cd50ddb46c2a0763702aea 100644 --- a/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs +++ b/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs @@ -32,7 +32,7 @@ type IntelliSenseOptions = EnterKeySetting : EnterKeySetting } static member Default = { ShowAfterCharIsTyped = true - ShowAfterCharIsDeleted = true + ShowAfterCharIsDeleted = false IncludeSymbolsFromUnopenedNamespacesOrModules = false EnterKeySetting = EnterKeySetting.NeverNewline} diff --git a/vsintegration/tests/UnitTests/CompletionProviderTests.fs b/vsintegration/tests/UnitTests/CompletionProviderTests.fs index f73c57ce899ca4890c9eae302ac9587be75d6de6..4f90bee81c2c557a53c50244b05783ac5e6fbe22 100644 --- a/vsintegration/tests/UnitTests/CompletionProviderTests.fs +++ b/vsintegration/tests/UnitTests/CompletionProviderTests.fs @@ -148,14 +148,14 @@ System.Console.WriteLine(x + y) Assert.AreEqual(shouldBeTriggered, triggered, "FSharpCompletionProvider.ShouldTriggerCompletionAux() should compute the correct result") [] -let ShouldNotTriggerCompletionAfterAnyTriggerOtherThanInsertion() = - for triggerKind in [CompletionTriggerKind.Deletion; CompletionTriggerKind.Invoke; CompletionTriggerKind.Snippets ] do - let fileContents = "System.Console.WriteLine(123)" - let caretPosition = fileContents.IndexOf("System.") - let documentId = DocumentId.CreateNewId(ProjectId.CreateNewId()) - let getInfo() = documentId, filePath, [] - let triggered = FSharpCompletionProvider.ShouldTriggerCompletionAux(SourceText.From(fileContents), caretPosition, triggerKind, getInfo, IntelliSenseOptions.Default) - Assert.IsFalse(triggered, "FSharpCompletionProvider.ShouldTriggerCompletionAux() should not trigger") +let ShouldNotTriggerCompletionAfterAnyTriggerOtherThanInsertionOrDeletion() = + for triggerKind in [ CompletionTriggerKind.Invoke; CompletionTriggerKind.Snippets ] do + let fileContents = "System.Console.WriteLine(123)" + let caretPosition = fileContents.IndexOf("rite") + let documentId = DocumentId.CreateNewId(ProjectId.CreateNewId()) + let getInfo() = documentId, filePath, [] + let triggered = FSharpCompletionProvider.ShouldTriggerCompletionAux(SourceText.From(fileContents), caretPosition, triggerKind, getInfo, IntelliSenseOptions.Default) + Assert.IsFalse(triggered, "FSharpCompletionProvider.ShouldTriggerCompletionAux() should not trigger") [] let ShouldNotTriggerCompletionInStringLiterals() =