diff --git a/eng/Versions.props b/eng/Versions.props
index b6fdb3e2883..d586cb2d10d 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -112,8 +112,8 @@
5.0.0
4.5.0
- 17.0.154-preview
- 17.0.0-previews-2-31423-289
+ 17.0.391-preview-g5e248c9073
+ 17.0.0-previews-4-31709-430
17.0.77-pre-g62a6cb5699
$(VisualStudioContractPackagesVersion)
$(VisualStudioContractPackagesVersion)
@@ -134,7 +134,7 @@
$(VisualStudioContractPackagesVersion)
$(VisualStudioContractPackagesVersion)
- 4.0.0-1.21181.18
+ 4.1.0-1.21511.14
$(RoslynVersion)
$(RoslynVersion)
$(RoslynVersion)
@@ -168,7 +168,7 @@
$(VisualStudioContractPackagesVersion)
$(VisualStudioContractPackagesVersion)
- 17.0.50-preview-0002-0002
+ 17.0.50-preview-0002-0025
$(VisualStudioImplementationPackagesVersion)
17.0.0
$(VisualStudioContractPackagesVersion)
@@ -184,9 +184,9 @@
15.0.25123-Dev15Preview
16.0.1
16.0.28924.11111
- 17.0.26-alpha
+ 17.0.46-alpha
$(VisualStudioContractPackagesVersion)
- 17.0.1-alpha
+ 17.0.23-alpha
9.0.30729
5.0.0
12.0.4
@@ -209,12 +209,13 @@
5.0.0-preview.7.20364.11
16.11.0
4.3.0
- 12.0.2
+ 13.0.1
3.13.2
4.1.0
2.1.80
1.0.0-beta2-dev3
- 2.8.3-alpha
+ 2.8.21
+ 2.7.74
2.4.1
2.4.2
5.10.3
diff --git a/vsintegration/src/FSharp.Editor/Completion/CompletionProvider.fs b/vsintegration/src/FSharp.Editor/Completion/CompletionProvider.fs
index e8c119ece0d..08c4bd8b542 100644
--- a/vsintegration/src/FSharp.Editor/Completion/CompletionProvider.fs
+++ b/vsintegration/src/FSharp.Editor/Completion/CompletionProvider.fs
@@ -10,7 +10,6 @@ open System.Threading.Tasks
open Microsoft.CodeAnalysis
open Microsoft.CodeAnalysis.Completion
-open Microsoft.CodeAnalysis.Options
open Microsoft.CodeAnalysis.Text
open Microsoft.CodeAnalysis.ExternalAccess.FSharp.Completion
@@ -31,7 +30,7 @@ type internal FSharpCompletionProvider
assemblyContentProvider: AssemblyContentProvider
) =
- inherit CompletionProvider()
+ inherit FSharpCompletionProviderBase()
// Save the backing data in a cache, we need to save for at least the length of the completion session
// See https://github.com/Microsoft/visualfsharp/issues/4714
@@ -196,7 +195,7 @@ type internal FSharpCompletionProvider
return results
}
- override _.ShouldTriggerCompletion(sourceText: SourceText, caretPosition: int, trigger: CompletionTrigger, _: OptionSet) =
+ override _.ShouldTriggerCompletionImpl(sourceText: SourceText, caretPosition: int, trigger: CompletionTrigger) =
use _logBlock = Logger.LogBlock LogEditorFunctionId.Completion_ShouldTrigger
let getInfo() =
diff --git a/vsintegration/src/FSharp.Editor/Completion/CompletionService.fs b/vsintegration/src/FSharp.Editor/Completion/CompletionService.fs
index ccdadf504f7..c333ae55f21 100644
--- a/vsintegration/src/FSharp.Editor/Completion/CompletionService.fs
+++ b/vsintegration/src/FSharp.Editor/Completion/CompletionService.fs
@@ -20,7 +20,7 @@ type internal FSharpCompletionService
assemblyContentProvider: AssemblyContentProvider,
settings: EditorOptions
) =
- inherit CompletionServiceWithProviders(workspace)
+ inherit FSharpCompletionServiceWithProviders(workspace)
let projectInfoManager = workspace.Services.GetRequiredService().FSharpProjectOptionsManager
@@ -31,7 +31,7 @@ type internal FSharpCompletionService
override _.Language = FSharpConstants.FSharpLanguageName
override _.GetBuiltInProviders() = builtInProviders
- override _.GetRules() =
+ override _.GetRulesImpl() =
let enterKeyRule =
match settings.IntelliSense.EnterKeySetting with
| NeverNewline -> EnterKeyRule.Never
diff --git a/vsintegration/src/FSharp.Editor/Completion/HashDirectiveCompletionProvider.fs b/vsintegration/src/FSharp.Editor/Completion/HashDirectiveCompletionProvider.fs
index 26ed5f76115..7646a795822 100644
--- a/vsintegration/src/FSharp.Editor/Completion/HashDirectiveCompletionProvider.fs
+++ b/vsintegration/src/FSharp.Editor/Completion/HashDirectiveCompletionProvider.fs
@@ -23,7 +23,14 @@ type internal HashCompletion =
AllowableExtensions = allowableExtensions
UseIncludeDirectives = useIncludeDirectives }
-type internal HashDirectiveCompletionProvider(workspace: Workspace, projectInfoManager: FSharpProjectOptionsManager, completions: HashCompletion list) =
+type internal HashDirectiveCompletionProvider
+ (
+ workspace: Workspace,
+ projectInfoManager: FSharpProjectOptionsManager,
+ completions: HashCompletion list
+ ) =
+
+ inherit FSharpCommonCompletionProviderBase()
let [] NetworkPath = "\\\\"
let commitRules = ImmutableArray.Create(CharacterSetModificationRule.Create(CharacterSetModificationKind.Replace, '"', '\\', ',', '/'))
@@ -91,77 +98,75 @@ type internal HashDirectiveCompletionProvider(workspace: Workspace, projectInfoM
]
HashDirectiveCompletionProvider(workspace, projectInfoManager, completions)
- interface IFSharpCommonCompletionProvider with
-
- member _.ProvideCompletionsAsync(context) =
- asyncMaybe {
- let document = context.Document
- let position = context.Position
- do! let extension = Path.GetExtension document.FilePath
- Option.guard (extension = ".fsx" || extension = ".fsscript")
-
- let! ct = liftAsync Async.CancellationToken
- let! text = document.GetTextAsync(ct)
- do! Option.guard (isInStringLiteral(text, position))
- let line = text.Lines.GetLineFromPosition(position)
- let lineText = text.ToString(TextSpan.FromBounds(line.Start, position))
+ override _.ProvideCompletionsAsync(context) =
+ asyncMaybe {
+ let document = context.Document
+ let position = context.Position
+ do! let extension = Path.GetExtension document.FilePath
+ Option.guard (extension = ".fsx" || extension = ".fsscript")
+
+ let! ct = liftAsync Async.CancellationToken
+ let! text = document.GetTextAsync(ct)
+ do! Option.guard (isInStringLiteral(text, position))
+ let line = text.Lines.GetLineFromPosition(position)
+ let lineText = text.ToString(TextSpan.FromBounds(line.Start, position))
- let! completion, quotedPathGroup =
- completions |> List.tryPick (fun completion ->
- match completion.DirectiveRegex.Match lineText with
- | m when m.Success ->
- let quotedPathGroup = m.Groups.["literal"]
- let endsWithQuote = PathCompletionUtilities.EndsWithQuote(quotedPathGroup.Value)
- if endsWithQuote && (position >= line.Start + m.Length) then
- None
- else
- Some (completion, quotedPathGroup)
- | _ -> None)
-
- let snapshot = text.FindCorrespondingEditorTextSnapshot()
+ let! completion, quotedPathGroup =
+ completions |> List.tryPick (fun completion ->
+ match completion.DirectiveRegex.Match lineText with
+ | m when m.Success ->
+ let quotedPathGroup = m.Groups.["literal"]
+ let endsWithQuote = PathCompletionUtilities.EndsWithQuote(quotedPathGroup.Value)
+ if endsWithQuote && (position >= line.Start + m.Length) then
+ None
+ else
+ Some (completion, quotedPathGroup)
+ | _ -> None)
+
+ let snapshot = text.FindCorrespondingEditorTextSnapshot()
- do! Option.guard (not (isNull snapshot))
-
- let extraSearchPaths =
- if completion.UseIncludeDirectives then
- getIncludeDirectives (text, position)
- else []
-
- let defaultSearchPath = Path.GetDirectoryName document.FilePath
- let searchPaths = defaultSearchPath :: extraSearchPaths
-
- let helper =
- FSharpFileSystemCompletionHelper(
- Glyph.OpenFolder,
- completion.AllowableExtensions |> List.tryPick getFileGlyph |> Option.defaultValue Glyph.None,
- Seq.toImmutableArray searchPaths,
- null,
- completion.AllowableExtensions |> Seq.toImmutableArray,
- rules)
+ do! Option.guard (not (isNull snapshot))
+
+ let extraSearchPaths =
+ if completion.UseIncludeDirectives then
+ getIncludeDirectives (text, position)
+ else []
+
+ let defaultSearchPath = Path.GetDirectoryName document.FilePath
+ let searchPaths = defaultSearchPath :: extraSearchPaths
+
+ let helper =
+ FSharpFileSystemCompletionHelper(
+ Glyph.OpenFolder,
+ completion.AllowableExtensions |> List.tryPick getFileGlyph |> Option.defaultValue Glyph.None,
+ Seq.toImmutableArray searchPaths,
+ null,
+ completion.AllowableExtensions |> Seq.toImmutableArray,
+ rules)
- let pathThroughLastSlash = getPathThroughLastSlash(text, position, quotedPathGroup)
- let! items = helper.GetItemsAsync(pathThroughLastSlash, ct) |> Async.AwaitTask |> liftAsync
- context.AddItems(items)
- }
- |> Async.Ignore
- |> RoslynHelpers.StartAsyncUnitAsTask context.CancellationToken
+ let pathThroughLastSlash = getPathThroughLastSlash(text, position, quotedPathGroup)
+ let! items = helper.GetItemsAsync(pathThroughLastSlash, ct) |> Async.AwaitTask |> liftAsync
+ context.AddItems(items)
+ }
+ |> Async.Ignore
+ |> RoslynHelpers.StartAsyncUnitAsTask context.CancellationToken
- member _.IsInsertionTrigger(text, position, _) =
- // Bring up completion when the user types a quote (i.e.: #r "), or if they type a slash
- // path separator character, or if they type a comma (#r "foo,version...").
- // Also, if they're starting a word. i.e. #r "c:\W
- let ch = text.[position]
- let isTriggerChar =
- ch = '"' || ch = '\\' || ch = ',' || ch = '/' ||
- FSharpCommonCompletionUtilities.IsStartingNewWord(text, position, (fun x -> Char.IsLetter x), (fun x -> Char.IsLetterOrDigit x))
- isTriggerChar && isInStringLiteral(text, position)
+ override _.IsInsertionTrigger(text, position) =
+ // Bring up completion when the user types a quote (i.e.: #r "), or if they type a slash
+ // path separator character, or if they type a comma (#r "foo,version...").
+ // Also, if they're starting a word. i.e. #r "c:\W
+ let ch = text.[position]
+ let isTriggerChar =
+ ch = '"' || ch = '\\' || ch = ',' || ch = '/' ||
+ FSharpCommonCompletionUtilities.IsStartingNewWord(text, position, (fun x -> Char.IsLetter x), (fun x -> Char.IsLetterOrDigit x))
+ isTriggerChar && isInStringLiteral(text, position)
- member _.GetTextChangeAsync(baseGetTextChangeAsync, selectedItem, ch, cancellationToken) =
- // When we commit "\\" when the user types \ we have to adjust for the fact that the
- // controller will automatically append \ after we commit. Because of that, we don't
- // want to actually commit "\\" as we'll end up with "\\\". So instead we just commit
- // "\" and know that controller will append "\" and give us "\\".
- if selectedItem.DisplayText = NetworkPath && ch = Nullable '\\' then
- Task.FromResult(Nullable(TextChange(selectedItem.Span, "\\")))
- else
- baseGetTextChangeAsync.Invoke(selectedItem, ch, cancellationToken)
\ No newline at end of file
+ override _.GetTextChangeAsync(baseGetTextChangeAsync, selectedItem, ch, cancellationToken) =
+ // When we commit "\\" when the user types \ we have to adjust for the fact that the
+ // controller will automatically append \ after we commit. Because of that, we don't
+ // want to actually commit "\\" as we'll end up with "\\\". So instead we just commit
+ // "\" and know that controller will append "\" and give us "\\".
+ if selectedItem.DisplayText = NetworkPath && ch = Nullable '\\' then
+ Task.FromResult(Nullable(TextChange(selectedItem.Span, "\\")))
+ else
+ baseGetTextChangeAsync.Invoke(selectedItem, ch, cancellationToken)
\ No newline at end of file
diff --git a/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj b/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj
index 3617afce3be..52adc3455de 100644
--- a/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj
+++ b/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj
@@ -176,6 +176,7 @@
+
diff --git a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs
index 6bfec4e0bee..1a3f54dbc9b 100644
--- a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs
+++ b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs
@@ -300,9 +300,11 @@ type internal FSharpLanguageService(package : FSharpPackage) =
override this.Initialize() =
base.Initialize()
- this.Workspace.Options <- this.Workspace.Options.WithChangedOption(Completion.FSharpCompletionOptions.BlockForCompletionItems, FSharpConstants.FSharpLanguageName, false)
this.Workspace.Options <- this.Workspace.Options.WithChangedOption(Shared.Options.FSharpServiceFeatureOnOffOptions.ClosedFileDiagnostic, FSharpConstants.FSharpLanguageName, Nullable false)
+ let globalOptions = package.ComponentModel.DefaultExportProvider.GetExport().Value
+ globalOptions.BlockForCompletionItems <- false
+
let theme = package.ComponentModel.DefaultExportProvider.GetExport().Value
theme.SetColors()
diff --git a/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj b/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj
index 2f2f70ea81e..addb36ccfa8 100644
--- a/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj
+++ b/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj
@@ -76,6 +76,7 @@
+
diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/FSharp.ProjectSystem.Base.csproj b/vsintegration/src/FSharp.ProjectSystem.Base/FSharp.ProjectSystem.Base.csproj
index d91ce5572ac..1d5316c9d17 100644
--- a/vsintegration/src/FSharp.ProjectSystem.Base/FSharp.ProjectSystem.Base.csproj
+++ b/vsintegration/src/FSharp.ProjectSystem.Base/FSharp.ProjectSystem.Base.csproj
@@ -57,6 +57,7 @@
+
diff --git a/vsintegration/tests/UnitTests/VisualFSharp.UnitTests.fsproj b/vsintegration/tests/UnitTests/VisualFSharp.UnitTests.fsproj
index a076325fdd4..b1ee2def910 100644
--- a/vsintegration/tests/UnitTests/VisualFSharp.UnitTests.fsproj
+++ b/vsintegration/tests/UnitTests/VisualFSharp.UnitTests.fsproj
@@ -197,6 +197,7 @@
+