@@ -23,6 +23,9 @@ public final class CapabilityRegistry {
23
23
/// Dynamically registered completion options.
24
24
private var completion : [ CapabilityRegistration : CompletionRegistrationOptions ] = [ : ]
25
25
26
+ /// Dynamically registered folding range options.
27
+ private var foldingRange : [ CapabilityRegistration : FoldingRangeRegistrationOptions ] = [ : ]
28
+
26
29
/// Dynamically registered semantic tokens options.
27
30
private var semanticTokens : [ CapabilityRegistration : SemanticTokensRegistrationOptions ] = [ : ]
28
31
@@ -36,6 +39,10 @@ public final class CapabilityRegistry {
36
39
clientCapabilities. textDocument? . completion? . dynamicRegistration == true
37
40
}
38
41
42
+ public var clientHasDynamicFoldingRangeRegistration : Bool {
43
+ clientCapabilities. textDocument? . foldingRange? . dynamicRegistration == true
44
+ }
45
+
39
46
public var clientHasDynamicSemanticTokensRegistration : Bool {
40
47
clientCapabilities. textDocument? . semanticTokens? . dynamicRegistration == true
41
48
}
@@ -68,6 +75,34 @@ public final class CapabilityRegistry {
68
75
registerOnClient ( registration)
69
76
}
70
77
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
+
71
106
/// Dynamically register semantic tokens capabilities if the client supports
72
107
/// it and we haven't yet registered any semantic tokens capabilities for the
73
108
/// given languages.
0 commit comments