forked from nosami/visualfsharp
/
CompletionService.fs
68 lines (56 loc) · 2.98 KB
/
CompletionService.fs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information.
namespace Microsoft.VisualStudio.FSharp.Editor
open System.Composition
open System.Collections.Immutable
open Microsoft.CodeAnalysis
open Microsoft.CodeAnalysis.Completion
open Microsoft.CodeAnalysis.Host
open Microsoft.CodeAnalysis.Host.Mef
open Microsoft.CodeAnalysis.ExternalAccess.FSharp.Completion
open Microsoft.VisualStudio.Shell
type internal FSharpCompletionService
(
workspace: Workspace,
serviceProvider: SVsServiceProvider,
checkerProvider: FSharpCheckerProvider,
projectInfoManager: FSharpProjectOptionsManager,
assemblyContentProvider: AssemblyContentProvider,
settings: EditorOptions
) =
inherit CompletionServiceWithProviders(workspace)
let builtInProviders =
ImmutableArray.Create<CompletionProvider>(
FSharpCompletionProvider(workspace, serviceProvider, checkerProvider, projectInfoManager, assemblyContentProvider),
FSharpCommonCompletionProvider.Create(HashDirectiveCompletionProvider.Create(workspace, projectInfoManager)))
override _.Language = FSharpConstants.FSharpLanguageName
override _.GetBuiltInProviders() = builtInProviders
override _.GetRules() =
let enterKeyRule =
match settings.IntelliSense.EnterKeySetting with
| NeverNewline -> EnterKeyRule.Never
| NewlineOnCompleteWord -> EnterKeyRule.AfterFullyTypedWord
| AlwaysNewline -> EnterKeyRule.Always
CompletionRules.Default
.WithDismissIfEmpty(true)
.WithDismissIfLastCharacterDeleted(true)
.WithDefaultEnterKeyRule(enterKeyRule)
/// Indicates the text span to be replaced by a committed completion list item.
override _.GetDefaultCompletionListSpan(sourceText, caretIndex) =
let documentId = workspace.GetDocumentIdInCurrentContext(sourceText.Container)
let document = workspace.CurrentSolution.GetDocument(documentId)
let defines = projectInfoManager.GetCompilationDefinesForEditingDocument(document)
CompletionUtils.getDefaultCompletionListSpan(sourceText, caretIndex, documentId, document.FilePath, defines)
[<Shared>]
[<ExportLanguageServiceFactory(typeof<CompletionService>, FSharpConstants.FSharpLanguageName)>]
type internal FSharpCompletionServiceFactory
[<ImportingConstructor>]
(
serviceProvider: SVsServiceProvider,
checkerProvider: FSharpCheckerProvider,
projectInfoManager: FSharpProjectOptionsManager,
assemblyContentProvider: AssemblyContentProvider,
settings: EditorOptions
) =
interface ILanguageServiceFactory with
member _.CreateLanguageService(hostLanguageServices: HostLanguageServices) : ILanguageService =
upcast new FSharpCompletionService(hostLanguageServices.WorkspaceServices.Workspace, serviceProvider, checkerProvider, projectInfoManager, assemblyContentProvider, settings)