4
4
using System ;
5
5
using System . Collections . Generic ;
6
6
using System . Composition ;
7
+ using System . Linq ;
7
8
using System . Runtime . CompilerServices ;
8
9
using System . Threading ;
9
10
using System . Threading . Tasks ;
10
- using Microsoft . AspNetCore . Razor . PooledObjects ;
11
11
using Microsoft . VisualStudio . LanguageServer . Client ;
12
12
using Microsoft . VisualStudio . LanguageServer . Protocol ;
13
13
using Microsoft . VisualStudio . Text ;
@@ -47,16 +47,15 @@ public DefaultLSPRequestInvoker(
47
47
_serializer . AddVSInternalExtensionConverters ( ) ;
48
48
}
49
49
50
- [ Obsolete ]
51
50
public override Task < IEnumerable < ReinvokeResponse < TOut > > > ReinvokeRequestOnMultipleServersAsync < TIn , TOut > ( string method , string contentType , TIn parameters , CancellationToken cancellationToken )
52
51
{
53
- return RequestMultipleServerCoreAsync < TIn , TOut > ( method , parameters , cancellationToken ) ;
52
+ var capabilitiesFilter = _fallbackCapabilitiesFilterResolver . Resolve ( method ) ;
53
+ return RequestMultipleServerCoreAsync < TIn , TOut > ( method , contentType , capabilitiesFilter , parameters , cancellationToken ) ;
54
54
}
55
55
56
- [ Obsolete ]
57
56
public override Task < IEnumerable < ReinvokeResponse < TOut > > > ReinvokeRequestOnMultipleServersAsync < TIn , TOut > ( string method , string contentType , Func < JToken , bool > capabilitiesFilter , TIn parameters , CancellationToken cancellationToken )
58
57
{
59
- return RequestMultipleServerCoreAsync < TIn , TOut > ( method , parameters , cancellationToken ) ;
58
+ return RequestMultipleServerCoreAsync < TIn , TOut > ( method , contentType , capabilitiesFilter , parameters , cancellationToken ) ;
60
59
}
61
60
62
61
public override Task < ReinvokeResponse < TOut > > ReinvokeRequestOnServerAsync < TIn , TOut > (
@@ -82,12 +81,17 @@ public override async Task<ReinvokeResponse<TOut>> ReinvokeRequestOnServerAsync<
82
81
}
83
82
84
83
var serializedParams = JToken . FromObject ( parameters ) ;
85
- var response = await _languageServiceBroker . RequestAsync (
86
- new GeneralRequest < TIn , TOut > { LanguageServerName = languageServerName , Method = method , Request = parameters } ,
84
+ #pragma warning disable CS0618 // Type or member is obsolete. Temporary until we resolve the changes to the ILanguageServiceBroker2 interface.
85
+ var ( languageClient , resultToken ) = await _languageServiceBroker . RequestAsync (
86
+ Array . Empty < string > ( ) ,
87
+ capabilitiesFilter ,
88
+ languageServerName ,
89
+ method ,
90
+ serializedParams ,
87
91
cancellationToken ) ;
92
+ #pragma warning restore CS0618 // Type or member is obsolete
88
93
89
- // No callers actually use the languageClient when handling the response.
90
- var result = response is not null ? new ReinvokeResponse < TOut > ( languageClient : null ! , response ) : default ;
94
+ var result = resultToken is not null ? new ReinvokeResponse < TOut > ( languageClient ! , resultToken . ToObject < TOut > ( _serializer ) ! ) : default ;
91
95
return result ;
92
96
}
93
97
@@ -105,45 +109,60 @@ public override async Task<ReinvokeResponse<TOut>> ReinvokeRequestOnServerAsync<
105
109
TIn parameters ,
106
110
CancellationToken cancellationToken )
107
111
{
112
+ var serializedParams = JToken . FromObject ( parameters ) ;
113
+ JToken ParameterFactory ( ITextSnapshot _ )
114
+ {
115
+ return serializedParams ;
116
+ }
117
+
118
+ #pragma warning disable CS0618 // Type or member is obsolete. Temporary until we resolve the changes to the ILanguageServiceBroker2 interface.
108
119
var response = await _languageServiceBroker . RequestAsync (
109
- new DocumentRequest < TIn , TOut > ( )
110
- {
111
- TextBuffer = textBuffer ,
112
- LanguageServerName = languageServerName ,
113
- ParameterFactory = _ => parameters ,
114
- Method = method ,
115
- } ,
120
+ textBuffer ,
121
+ capabilitiesFilter ,
122
+ languageServerName ,
123
+ method ,
124
+ ParameterFactory ,
116
125
cancellationToken ) ;
126
+ #pragma warning restore CS0618 // Type or member is obsolete
117
127
118
128
if ( response is null )
119
129
{
120
130
return null ;
121
131
}
122
132
123
- var reinvocationResponse = new ReinvocationResponse < TOut > ( languageServerName , response ) ;
133
+ var responseBody = default ( TOut ) ;
134
+ if ( response . Response is not null )
135
+ {
136
+ responseBody = response . Response . ToObject < TOut > ( _serializer ) ;
137
+ }
138
+
139
+ var reinvocationResponse = new ReinvocationResponse < TOut > ( response . LanguageClientName , responseBody ) ;
124
140
return reinvocationResponse ;
125
141
}
126
142
127
- private async Task < IEnumerable < ReinvokeResponse < TOut > > > RequestMultipleServerCoreAsync < TIn , TOut > ( string method , TIn parameters , CancellationToken cancellationToken )
143
+ private async Task < IEnumerable < ReinvokeResponse < TOut > > > RequestMultipleServerCoreAsync < TIn , TOut > ( string method , string contentType , Func < JToken , bool > capabilitiesFilter , TIn parameters , CancellationToken cancellationToken )
128
144
where TIn : notnull
129
145
{
130
146
if ( string . IsNullOrEmpty ( method ) )
131
147
{
132
148
throw new ArgumentException ( "message" , nameof ( method ) ) ;
133
149
}
134
150
135
- var reinvokeResponses = _languageServiceBroker . RequestAllAsync (
136
- new GeneralRequest < TIn , TOut > ( ) { LanguageServerName = null , Method = method , Request = parameters } ,
151
+ var serializedParams = JToken . FromObject ( parameters ) ;
152
+
153
+ #pragma warning disable CS0618 // Type or member is obsolete
154
+ var clientAndResultTokenPairs = await _languageServiceBroker . RequestMultipleAsync (
155
+ new [ ] { contentType } ,
156
+ capabilitiesFilter ,
157
+ method ,
158
+ serializedParams ,
137
159
cancellationToken ) . ConfigureAwait ( false ) ;
160
+ #pragma warning restore CS0618 // Type or member is obsolete
138
161
139
- using var _ = ListPool < ReinvokeResponse < TOut > > . GetPooledObject ( out var responses ) ;
140
- await foreach ( var reinvokeResponse in reinvokeResponses )
141
- {
142
- // No callers actually use the languageClient when handling the response.
143
- responses . Add ( new ReinvokeResponse < TOut > ( languageClient : null ! , reinvokeResponse . response ! ) ) ;
144
- }
162
+ // a little ugly - tuple deconstruction in lambda arguments doesn't work - https://github.com/dotnet/csharplang/issues/258
163
+ var results = clientAndResultTokenPairs . Select ( ( clientAndResultToken ) => clientAndResultToken . Item2 is not null ? new ReinvokeResponse < TOut > ( clientAndResultToken . Item1 , clientAndResultToken . Item2 . ToObject < TOut > ( _serializer ) ! ) : default ) ;
145
164
146
- return responses . ToArray ( ) ;
165
+ return results ;
147
166
}
148
167
149
168
public override IAsyncEnumerable < ReinvocationResponse < TOut > > ReinvokeRequestOnMultipleServersAsync < TIn , TOut > (
@@ -163,13 +182,27 @@ public override async IAsyncEnumerable<ReinvocationResponse<TOut>> ReinvokeReque
163
182
TIn parameters ,
164
183
[ EnumeratorCancellation ] CancellationToken cancellationToken )
165
184
{
166
- var requests = _languageServiceBroker . RequestAllAsync (
167
- new DocumentRequest < TIn , TOut > { ParameterFactory = _ => parameters , Method = method , TextBuffer = textBuffer } ,
185
+ var serializedParams = JToken . FromObject ( parameters ) ;
186
+ Func < ITextSnapshot , JToken > parameterFactory = ( _ ) => serializedParams ;
187
+
188
+ #pragma warning disable CS0618 // Type or member is obsolete. Temporary until we resolve the changes to the ILanguageServiceBroker2 interface.
189
+ var requests = _languageServiceBroker . RequestMultipleAsync (
190
+ textBuffer ,
191
+ capabilitiesFilter ,
192
+ method ,
193
+ parameterFactory ,
168
194
cancellationToken ) ;
195
+ #pragma warning restore CS0618 // Type or member is obsolete
169
196
170
197
await foreach ( var response in requests )
171
198
{
172
- yield return new ReinvocationResponse < TOut > ( response . client , response . response ) ;
199
+ var responseBody = default ( TOut ) ;
200
+ if ( response . Response is not null )
201
+ {
202
+ responseBody = response . Response . ToObject < TOut > ( _serializer ) ;
203
+ var reinvocationResponse = new ReinvocationResponse < TOut > ( response . LanguageClientName , responseBody ) ;
204
+ yield return reinvocationResponse ;
205
+ }
173
206
}
174
207
}
175
208
}
0 commit comments