@@ -25,18 +25,18 @@ internal class LanguageClientRegistrationManager : IRegisterCapabilityHandler, I
25
25
private readonly ILspHandlerTypeDescriptorProvider _handlerTypeDescriptorProvider ;
26
26
private readonly ILogger < LanguageClientRegistrationManager > _logger ;
27
27
private readonly ConcurrentDictionary < string , Registration > _registrations ;
28
- private readonly ReplaySubject < IEnumerable < Registration > > _registrationSubject ;
28
+ private ReplaySubject < IEnumerable < Registration > > _registrationSubject = new ReplaySubject < IEnumerable < Registration > > ( 1 ) ;
29
29
30
30
public LanguageClientRegistrationManager (
31
31
ISerializer serializer ,
32
32
ILspHandlerTypeDescriptorProvider handlerTypeDescriptorProvider ,
33
- ILogger < LanguageClientRegistrationManager > logger )
33
+ ILogger < LanguageClientRegistrationManager > logger
34
+ )
34
35
{
35
36
_serializer = serializer ;
36
37
_handlerTypeDescriptorProvider = handlerTypeDescriptorProvider ;
37
38
_logger = logger ;
38
39
_registrations = new ConcurrentDictionary < string , Registration > ( StringComparer . OrdinalIgnoreCase ) ;
39
- _registrationSubject = new ReplaySubject < IEnumerable < Registration > > ( 1 ) ;
40
40
}
41
41
42
42
Task < Unit > IRequestHandler < RegistrationParams , Unit > . Handle ( RegistrationParams request , CancellationToken cancellationToken )
@@ -46,7 +46,11 @@ Task<Unit> IRequestHandler<RegistrationParams, Unit>.Handle(RegistrationParams r
46
46
Register ( request . Registrations . ToArray ( ) ) ;
47
47
}
48
48
49
- _registrationSubject . OnNext ( _registrations . Values ) ;
49
+ if ( ! _registrationSubject . IsDisposed )
50
+ {
51
+ _registrationSubject . OnNext ( _registrations . Values ) ;
52
+ }
53
+
50
54
return Unit . Task ;
51
55
}
52
56
@@ -60,15 +64,17 @@ Task<Unit> IRequestHandler<UnregistrationParams, Unit>.Handle(UnregistrationPara
60
64
}
61
65
}
62
66
63
- _registrationSubject . OnNext ( _registrations . Values ) ;
67
+ if ( ! _registrationSubject . IsDisposed )
68
+ {
69
+ _registrationSubject . OnNext ( _registrations . Values ) ;
70
+ }
71
+
64
72
return Unit . Task ;
65
73
}
66
74
67
75
public void RegisterCapabilities ( ServerCapabilities serverCapabilities )
68
76
{
69
- foreach ( var registrationOptions in LspHandlerDescriptorHelpers . GetStaticRegistrationOptions (
70
- serverCapabilities
71
- ) )
77
+ foreach ( var registrationOptions in LspHandlerDescriptorHelpers . GetStaticRegistrationOptions ( serverCapabilities ) )
72
78
{
73
79
var method = _handlerTypeDescriptorProvider . GetMethodForRegistrationOptions ( registrationOptions ) ;
74
80
if ( method == null )
@@ -88,34 +94,30 @@ public void RegisterCapabilities(ServerCapabilities serverCapabilities)
88
94
}
89
95
}
90
96
91
- if ( serverCapabilities . Workspace = = null )
97
+ if ( serverCapabilities . Workspace ! = null )
92
98
{
93
- _registrationSubject . OnNext ( _registrations . Values ) ;
94
- return ;
95
- }
96
-
97
- foreach ( var registrationOptions in LspHandlerDescriptorHelpers . GetStaticRegistrationOptions (
98
- serverCapabilities
99
- . Workspace
100
- ) )
101
- {
102
- var method = _handlerTypeDescriptorProvider . GetMethodForRegistrationOptions ( registrationOptions ) ;
103
- if ( method == null )
99
+ foreach ( var registrationOptions in LspHandlerDescriptorHelpers . GetStaticRegistrationOptions ( serverCapabilities . Workspace ) )
104
100
{
105
- // TODO: Log this
106
- continue ;
107
- }
108
-
109
- if ( registrationOptions . Id != null )
110
- {
111
- var reg = new Registration {
112
- Id = registrationOptions . Id ,
113
- Method = method ,
114
- RegisterOptions = registrationOptions
115
- } ;
116
- _registrations . AddOrUpdate ( registrationOptions . Id , x => reg , ( a , b ) => reg ) ;
101
+ var method = _handlerTypeDescriptorProvider . GetMethodForRegistrationOptions ( registrationOptions ) ;
102
+ if ( method == null )
103
+ {
104
+ // TODO: Log this
105
+ continue ;
106
+ }
107
+
108
+ if ( registrationOptions . Id != null )
109
+ {
110
+ var reg = new Registration {
111
+ Id = registrationOptions . Id ,
112
+ Method = method ,
113
+ RegisterOptions = registrationOptions
114
+ } ;
115
+ _registrations . AddOrUpdate ( registrationOptions . Id , x => reg , ( a , b ) => reg ) ;
116
+ }
117
117
}
118
118
}
119
+
120
+ _registrationSubject . OnNext ( _registrations . Values ) ;
119
121
}
120
122
121
123
private void Register ( params Registration [ ] registrations )
@@ -145,7 +147,18 @@ private void Register(Registration registration)
145
147
_registrations . AddOrUpdate ( deserializedRegistration . Id , x => deserializedRegistration , ( a , b ) => deserializedRegistration ) ;
146
148
}
147
149
148
- public IObservable < IEnumerable < Registration > > Registrations => _registrationSubject . AsObservable ( ) ;
150
+ public IObservable < IEnumerable < Registration > > Registrations
151
+ {
152
+ get {
153
+ if ( _registrationSubject . IsDisposed )
154
+ {
155
+ return Observable . Empty < IEnumerable < Registration > > ( ) ;
156
+ }
157
+
158
+ return _registrationSubject . AsObservable ( ) ;
159
+ }
160
+ }
161
+
149
162
public IEnumerable < Registration > CurrentRegistrations => _registrations . Values ;
150
163
151
164
public IEnumerable < Registration > GetRegistrationsForMethod ( string method ) => _registrations . Select ( z => z . Value ) . Where ( x => x . Method == method ) ;
@@ -154,19 +167,25 @@ public IEnumerable<Registration> GetRegistrationsMatchingSelector(DocumentSelect
154
167
_registrations
155
168
. Select ( z => z . Value )
156
169
. Where (
157
- x => x . RegisterOptions is ITextDocumentRegistrationOptions ro && ro . DocumentSelector
158
- . Join (
159
- documentSelector ,
160
- z => z . HasLanguage ? z . Language :
161
- z . HasScheme ? z . Scheme :
162
- z . HasPattern ? z . Pattern : string . Empty ,
163
- z => z . HasLanguage ? z . Language :
164
- z . HasScheme ? z . Scheme :
165
- z . HasPattern ? z . Pattern : string . Empty , ( a , b ) => a
166
- )
167
- . Any ( y => y . HasLanguage || y . HasPattern || y . HasScheme )
170
+ x => x . RegisterOptions is ITextDocumentRegistrationOptions ro &&
171
+ ro . DocumentSelector != null &&
172
+ ro . DocumentSelector
173
+ . Join (
174
+ documentSelector ,
175
+ z => z . HasLanguage ? z . Language :
176
+ z . HasScheme ? z . Scheme :
177
+ z . HasPattern ? z . Pattern : string . Empty ,
178
+ z => z . HasLanguage ? z . Language :
179
+ z . HasScheme ? z . Scheme :
180
+ z . HasPattern ? z . Pattern : string . Empty , ( a , b ) => a
181
+ )
182
+ . Any ( y => y . HasLanguage || y . HasPattern || y . HasScheme )
168
183
) ;
169
184
170
- public void Dispose ( ) => _registrationSubject . Dispose ( ) ;
185
+ public void Dispose ( )
186
+ {
187
+ if ( _registrationSubject . IsDisposed ) return ;
188
+ _registrationSubject . Dispose ( ) ;
189
+ }
171
190
}
172
191
}
0 commit comments