diff --git a/src/fsharp/FSharp.Build/Microsoft.FSharp.NetSdk.targets b/src/fsharp/FSharp.Build/Microsoft.FSharp.NetSdk.targets index 65119e6130e..0e4aab34d77 100644 --- a/src/fsharp/FSharp.Build/Microsoft.FSharp.NetSdk.targets +++ b/src/fsharp/FSharp.Build/Microsoft.FSharp.NetSdk.targets @@ -22,6 +22,7 @@ WARNING: DO NOT MODIFY this file unless you are knowledgeable about MSBuild and true true true + true @@ -39,7 +40,6 @@ WARNING: DO NOT MODIFY this file unless you are knowledgeable about MSBuild and mscorlib netcore netstandard - $(OtherFlags) --simpleresolution diff --git a/src/fsharp/FSharp.Build/Microsoft.FSharp.Targets b/src/fsharp/FSharp.Build/Microsoft.FSharp.Targets index 9bdd9868dc0..2190678fec6 100644 --- a/src/fsharp/FSharp.Build/Microsoft.FSharp.Targets +++ b/src/fsharp/FSharp.Build/Microsoft.FSharp.Targets @@ -266,6 +266,12 @@ this file. + + + --simpleresolution $(OtherFlags) + $(OtherFlags) + + () 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 269ae085680..3f2610a0d8a 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 f73c57ce899..4f90bee81c2 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() =