1
1
//#define WAIT_FOR_DEBUGGER
2
- //#define USE_CONSOLE_READER
3
2
4
3
using System ;
5
4
using System . Diagnostics ;
6
5
using System . IO ;
7
6
using System . Linq ;
8
7
using System . Reflection ;
9
8
using System . Threading ;
10
- using JsonRpc . Dataflow ;
11
9
using JsonRpc . Standard . Client ;
12
10
using JsonRpc . Standard . Contracts ;
13
11
using JsonRpc . Standard . Server ;
12
+ using JsonRpc . Streams ;
14
13
using LanguageServer . VsCode ;
15
14
using Microsoft . Extensions . Logging ;
16
15
using Microsoft . Extensions . Logging . Debug ;
@@ -33,53 +32,50 @@ static void Main(string[] args)
33
32
logWriter . AutoFlush = true ;
34
33
}
35
34
using ( logWriter )
36
- #if ! USE_CONSOLE_READER
37
35
using ( var cin = Console . OpenStandardInput ( ) )
38
36
using ( var bcin = new BufferedStream ( cin ) )
39
- #endif
40
37
using ( var cout = Console . OpenStandardOutput ( ) )
38
+ using ( var reader = new PartwiseStreamMessageReader ( bcin ) )
39
+ using ( var writer = new PartwiseStreamMessageWriter ( cout ) )
41
40
{
42
41
var contractResolver = new JsonRpcContractResolver
43
42
{
44
43
NamingStrategy = new CamelCaseJsonRpcNamingStrategy ( ) ,
45
44
ParameterValueConverter = new CamelCaseJsonValueConverter ( ) ,
46
45
} ;
47
- var client = new JsonRpcClient ( ) ;
46
+ var clientHandler = new StreamRpcClientHandler ( ) ;
47
+ var client = new JsonRpcClient ( clientHandler ) ;
48
48
if ( debugMode )
49
49
{
50
- client . MessageSending += ( _ , e ) =>
50
+ // We want to capture log all the LSP server-to-client calls as well
51
+ clientHandler . MessageSending += ( _ , e ) =>
51
52
{
52
53
lock ( logWriter ) logWriter . WriteLine ( "<C{0}" , e . Message ) ;
53
54
} ;
54
- client . MessageReceiving += ( _ , e ) =>
55
+ clientHandler . MessageReceiving += ( _ , e ) =>
55
56
{
56
57
lock ( logWriter ) logWriter . WriteLine ( ">C{0}" , e . Message ) ;
57
58
} ;
58
59
}
59
60
// Configure & build service host
60
61
var session = new LanguageServerSession ( client , contractResolver ) ;
61
- var host = BuildServiceHost ( session , logWriter , contractResolver , debugMode ) ;
62
- // Connect the datablocks
63
- var target = new PartwiseStreamMessageTargetBlock ( cout ) ;
64
- #if USE_CONSOLE_READER
65
-
66
- var source = new ByLineTextMessageSourceBlock ( Console . In ) ;
67
- #else
68
- var source = new PartwiseStreamMessageSourceBlock ( bcin ) ;
69
- #endif
70
- using ( host . Attach ( source , target ) )
71
- // We want to capture log all the server-to-client calls as well
72
- using ( client . Attach ( source , target ) )
73
- // If we want server to stop, just stop the "source"
74
- using ( session . CancellationToken . Register ( ( ) => source . Complete ( ) ) )
62
+ var host = BuildServiceHost ( logWriter , contractResolver , debugMode ) ;
63
+ var serverHandler = new StreamRpcServerHandler ( host ,
64
+ StreamRpcServerHandlerOptions . ConsistentResponseSequence |
65
+ StreamRpcServerHandlerOptions . SupportsRequestCancellation ) ;
66
+ serverHandler . DefaultFeatures . Set ( session ) ;
67
+ // If we want server to stop, just stop the "source"
68
+ using ( serverHandler . Attach ( reader , writer ) )
69
+ using ( clientHandler . Attach ( reader , writer ) )
75
70
{
71
+ // Wait for the "stop" request.
76
72
session . CancellationToken . WaitHandle . WaitOne ( ) ;
77
73
}
78
- logWriter . WriteLine ( "Exited" ) ;
74
+ logWriter ? . WriteLine ( "Exited" ) ;
79
75
}
80
76
}
81
77
82
- private static DataflowRpcServiceHost BuildServiceHost ( LanguageServerSession session , TextWriter logWriter ,
78
+ private static IJsonRpcServiceHost BuildServiceHost ( TextWriter logWriter ,
83
79
IJsonRpcContractResolver contractResolver , bool debugMode )
84
80
{
85
81
var loggerFactory = new LoggerFactory ( ) ;
@@ -101,13 +97,8 @@ private static DataflowRpcServiceHost BuildServiceHost(LanguageServerSession ses
101
97
lock ( logWriter ) logWriter . WriteLine ( "< {0}" , context . Response ) ;
102
98
} ) ;
103
99
}
104
- var host = builder . Build ( ) ;
105
- var features = new FeatureCollection ( ) ;
106
- features . Set ( session ) ;
107
- return new DataflowRpcServiceHost ( host , features ,
108
- DataflowRpcServiceHostOptions . ConsistentResponseSequence |
109
- DataflowRpcServiceHostOptions . SupportsRequestCancellation ) ;
100
+ return builder . Build ( ) ;
110
101
}
111
-
102
+
112
103
}
113
104
}
0 commit comments