Skip to content

Commit 13d3d93

Browse files
authored
Merge pull request #413 from DavidGoldman/foldingrange
Use dynamic registration for folding range options
2 parents 32b585a + 9cda116 commit 13d3d93

File tree

4 files changed

+63
-1
lines changed

4 files changed

+63
-1
lines changed

Sources/LanguageServerProtocol/SupportTypes/RegistrationOptions.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,23 @@ public struct CompletionRegistrationOptions: RegistrationOptions, TextDocumentRe
7474
}
7575
}
7676

77+
/// Folding range registration options.
78+
public struct FoldingRangeRegistrationOptions: RegistrationOptions, TextDocumentRegistrationOptionsProtocol, Hashable {
79+
public var textDocumentRegistrationOptions: TextDocumentRegistrationOptions
80+
public var foldingRangeOptions: FoldingRangeOptions
81+
82+
public init(documentSelector: DocumentSelector? = nil, foldingRangeOptions: FoldingRangeOptions) {
83+
self.textDocumentRegistrationOptions =
84+
TextDocumentRegistrationOptions(documentSelector: documentSelector)
85+
self.foldingRangeOptions = foldingRangeOptions
86+
}
87+
88+
public func encodeIntoLSPAny(dict: inout [String: LSPAny]) {
89+
textDocumentRegistrationOptions.encodeIntoLSPAny(dict: &dict)
90+
// foldingRangeOptions is currently empty.
91+
}
92+
}
93+
7794
public struct SemanticTokensRegistrationOptions: RegistrationOptions, TextDocumentRegistrationOptionsProtocol, Hashable {
7895
/// Method for registration, which defers from the actual requests' methods
7996
/// since this registration handles multiple requests.

Sources/LanguageServerProtocol/SupportTypes/ServerCapabilities.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,11 @@ public struct CompletionOptions: Codable, Hashable {
275275
}
276276
}
277277

278+
public struct FoldingRangeOptions: Codable, Hashable {
279+
/// Currently empty in the spec.
280+
public init() {}
281+
}
282+
278283
public struct SignatureHelpOptions: Codable, Hashable {
279284
/// The characters that trigger signature help automatically.
280285
public var triggerCharacters: [String]?

Sources/SourceKitLSP/CapabilityRegistry.swift

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ public final class CapabilityRegistry {
2323
/// Dynamically registered completion options.
2424
private var completion: [CapabilityRegistration: CompletionRegistrationOptions] = [:]
2525

26+
/// Dynamically registered folding range options.
27+
private var foldingRange: [CapabilityRegistration: FoldingRangeRegistrationOptions] = [:]
28+
2629
/// Dynamically registered semantic tokens options.
2730
private var semanticTokens: [CapabilityRegistration: SemanticTokensRegistrationOptions] = [:]
2831

@@ -36,6 +39,10 @@ public final class CapabilityRegistry {
3639
clientCapabilities.textDocument?.completion?.dynamicRegistration == true
3740
}
3841

42+
public var clientHasDynamicFoldingRangeRegistration: Bool {
43+
clientCapabilities.textDocument?.foldingRange?.dynamicRegistration == true
44+
}
45+
3946
public var clientHasDynamicSemanticTokensRegistration: Bool {
4047
clientCapabilities.textDocument?.semanticTokens?.dynamicRegistration == true
4148
}
@@ -68,6 +75,34 @@ public final class CapabilityRegistry {
6875
registerOnClient(registration)
6976
}
7077

78+
/// Dynamically register folding range capabilities if the client supports it and
79+
/// we haven't yet registered any folding range capabilities for the given
80+
/// languages.
81+
public func registerFoldingRangeIfNeeded(
82+
options: FoldingRangeOptions,
83+
for languages: [Language],
84+
registerOnClient: ClientRegistrationHandler
85+
) {
86+
guard clientHasDynamicFoldingRangeRegistration else { return }
87+
if let registration = registration(for: languages, in: foldingRange) {
88+
if options != registration.foldingRangeOptions {
89+
log("Unable to register new folding range options \(options) for " +
90+
"\(languages) due to pre-existing options \(registration.foldingRangeOptions)", level: .warning)
91+
}
92+
return
93+
}
94+
let registrationOptions = FoldingRangeRegistrationOptions(
95+
documentSelector: self.documentSelector(for: languages),
96+
foldingRangeOptions: options)
97+
let registration = CapabilityRegistration(
98+
method: FoldingRangeRequest.method,
99+
registerOptions: self.encode(registrationOptions))
100+
101+
self.foldingRange[registration] = registrationOptions
102+
103+
registerOnClient(registration)
104+
}
105+
71106
/// Dynamically register semantic tokens capabilities if the client supports
72107
/// it and we haven't yet registered any semantic tokens capabilities for the
73108
/// given languages.

Sources/SourceKitLSP/SourceKitServer.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -546,7 +546,7 @@ extension SourceKitServer {
546546
supportsCodeActions: true
547547
)),
548548
colorProvider: .bool(true),
549-
foldingRangeProvider: .bool(true),
549+
foldingRangeProvider: .bool(!registry.clientHasDynamicFoldingRangeRegistration),
550550
executeCommandProvider: ExecuteCommandOptions(
551551
commands: builtinSwiftCommands // FIXME: Clangd commands?
552552
)
@@ -563,6 +563,11 @@ extension SourceKitServer {
563563
self.dynamicallyRegisterCapability($0, registry)
564564
}
565565
}
566+
if server.foldingRangeProvider?.isSupported == true {
567+
registry.registerFoldingRangeIfNeeded(options: FoldingRangeOptions(), for: languages) {
568+
self.dynamicallyRegisterCapability($0, registry)
569+
}
570+
}
566571
if let semanticTokensOptions = server.semanticTokensProvider {
567572
registry.registerSemanticTokensIfNeeded(options: semanticTokensOptions, for: languages) {
568573
self.dynamicallyRegisterCapability($0, registry)

0 commit comments

Comments
 (0)