1212using System . Threading ;
1313using System . Threading . Tasks ;
1414using Microsoft . CodeAnalysis . Host . Mef ;
15+ using Microsoft . CodeAnalysis . Text ;
1516using Roslyn . LanguageServer . Protocol ;
1617
1718namespace Microsoft . CodeAnalysis . LanguageServer . Handler . CustomMessage ;
@@ -21,7 +22,7 @@ namespace Microsoft.CodeAnalysis.LanguageServer.Handler.CustomMessage;
2122[ method: ImportingConstructor ]
2223[ method: Obsolete ( MefConstruction . ImportingConstructorMessage , error : true ) ]
2324internal class CustomMessageHandler ( )
24- : ILspServiceDocumentRequestHandler < CustomMessageParams , CustomMessage >
25+ : ILspServiceDocumentRequestHandler < CustomMessageParams , CustomResponse >
2526{
2627 private const string MethodName = "roslyn/customMessage" ;
2728
@@ -31,12 +32,12 @@ internal class CustomMessageHandler()
3132
3233 public TextDocumentIdentifier GetTextDocumentIdentifier ( CustomMessageParams request )
3334 {
34- return request . Message . TextDocumentPositions . First ( ) . TextDocument ;
35+ return request . Message . TextDocument ! ;
3536 }
3637
37- public async Task < CustomMessage > HandleRequestAsync ( CustomMessageParams request , RequestContext context , CancellationToken cancellationToken )
38+ public async Task < CustomResponse > HandleRequestAsync ( CustomMessageParams request , RequestContext context , CancellationToken cancellationToken )
3839 {
39- return request . Message ;
40+ return new CustomResponse ( request . Message . Message , request . Message . Positions ) ;
4041
4142#pragma warning disable CS0162 // Unreachable code detected
4243 AppDomain ? appDomain = null ;
@@ -74,24 +75,36 @@ public async Task<CustomMessage> HandleRequestAsync(CustomMessageParams request,
7475 var assembly = appDomain . Load ( assemblyName ) ;
7576
7677 var handlerType = assembly . GetType ( request . TypeFullName ) ;
77- var handlerMethod = handlerType . GetMethod ( "ExecuteAsync" , BindingFlags . Static ) ;
78+ var handlerMethod = handlerType . GetMethod ( "ExecuteAsync" , BindingFlags . Instance ) ;
7879
79- var messageType = handlerMethod . GetParameters ( ) [ 0 ] . ParameterType ;
80- var deserializedMessage = JsonSerializer . Deserialize ( request . Message . Message , messageType ) ;
80+ JsonSerializerOptions readOptions = new ( ) ;
81+ LinePositionReadConverter linePositionReadConverter = new ( request . Message . Positions . Select ( tdp => ProtocolConversions . PositionToLinePosition ( tdp ) ) . ToArray ( ) ) ;
82+ readOptions . Converters . Add ( linePositionReadConverter ) ;
8183
82- var linePositions = request . Message . TextDocumentPositions . Select ( tdp => ProtocolConversions . PositionToLinePosition ( tdp . Position ) ) . ToArray ( ) ;
84+ var messageType = handlerMethod . GetParameters ( ) [ 0 ] . ParameterType ;
85+ var deserializedMessage = JsonSerializer . Deserialize ( request . Message . Message , messageType , readOptions ) ;
8386
84- var parameters = new object ? [ ] { deserializedMessage , context . Document , linePositions , cancellationToken } ;
85- var resultTask = ( Task ) handlerMethod . Invoke ( null , parameters ) ;
87+ var handler = Activator . CreateInstance ( handlerType ) ;
88+ var parameters = new object ? [ ] { deserializedMessage , context . Document , cancellationToken } ;
89+ var resultTask = ( Task ) handlerMethod . Invoke ( handler , parameters ) ;
8690
8791 await resultTask . ConfigureAwait ( false ) ;
8892
8993 var resultProperty = resultTask . GetType ( ) . GetProperty ( "Result" ) ;
9094 var result = resultProperty . GetValue ( resultTask ) ;
9195
92- var resultJson = JsonSerializer . Serialize ( result , resultProperty . PropertyType ) ;
96+ JsonSerializerOptions writeOptions = new ( ) ;
97+ LinePositionWriteConverter linePositionWriteConverter = new ( ) ;
98+ writeOptions . Converters . Add ( linePositionWriteConverter ) ;
99+
100+ var resultJson = JsonSerializer . Serialize ( result , resultProperty . PropertyType , writeOptions ) ;
93101
94- return new CustomMessage ( JsonNode . Parse ( resultJson ) ! , [ ] ) ;
102+ return new CustomResponse (
103+ JsonNode . Parse ( resultJson ) ! ,
104+ linePositionWriteConverter . LinePositions
105+ . OrderBy ( p => p . Value )
106+ . Select ( p => new Position ( p . Key . Line , p . Key . Character ) )
107+ . ToArray ( ) ) ;
95108 }
96109 finally
97110 {
0 commit comments