Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Respect ShowAfterCharIsDeleted and turn it off by default (#5865)
* Respect ShowAfterCharIsDeleted

* Small refactor and modify test

* ShowCharAfterDelete false by default

* Delete FSharp.Core.UnitTests.dll.config
  • Loading branch information
cartermp authored Feb 5, 2019
commit 5857c33e1113e5b94bf9f13f3753ae6c3992b0a9
22 changes: 12 additions & 10 deletions vsintegration/src/FSharp.Editor/Completion/CompletionProvider.fs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion vsintegration/src/FSharp.Editor/Options/EditorOptions.fs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ type IntelliSenseOptions =
EnterKeySetting : EnterKeySetting }
static member Default =
{ ShowAfterCharIsTyped = true
ShowAfterCharIsDeleted = true
ShowAfterCharIsDeleted = false
IncludeSymbolsFromUnopenedNamespacesOrModules = false
EnterKeySetting = EnterKeySetting.NeverNewline}

Expand Down
16 changes: 8 additions & 8 deletions vsintegration/tests/UnitTests/CompletionProviderTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -148,14 +148,14 @@ System.Console.WriteLine(x + y)
Assert.AreEqual(shouldBeTriggered, triggered, "FSharpCompletionProvider.ShouldTriggerCompletionAux() should compute the correct result")

[<Test>]
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")

[<Test>]
let ShouldNotTriggerCompletionInStringLiterals() =
Expand Down