static void Main(string[] args) { var debugMode = args.Any(a => a.Equals("--debug", StringComparison.OrdinalIgnoreCase)); #if WAIT_FOR_DEBUGGER while (!Debugger.IsAttached) { Thread.Sleep(1000); } Debugger.Break(); #endif StreamWriter logWriter = null; if (debugMode) { logWriter = File.CreateText("messages-" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".log"); logWriter.AutoFlush = true; } using (logWriter) using (var cin = Console.OpenStandardInput()) using (var bcin = new BufferedStream(cin)) using (var cout = Console.OpenStandardOutput()) using (var reader = new PartwiseStreamMessageReader(bcin)) using (var writer = new PartwiseStreamMessageWriter(cout)) { var contractResolver = new JsonRpcContractResolver { NamingStrategy = new CamelCaseJsonRpcNamingStrategy(), ParameterValueConverter = new LanguageServiceParameterValueConverter(), }; var clientHandler = new StreamRpcClientHandler(); var client = new JsonRpcClient(clientHandler); if (debugMode) { // We want to capture log all the LSP server-to-client calls as well clientHandler.MessageSending += (_, e) => { lock (logWriter) logWriter.WriteLine("{0} <C{1}", Utility.GetTimeStamp(), e.Message); }; clientHandler.MessageReceiving += (_, e) => { lock (logWriter) logWriter.WriteLine("{0} >C{1}", Utility.GetTimeStamp(), e.Message); }; } // Configure & build service host var session = new LanguageServerSession(client, contractResolver); var host = BuildServiceHost(logWriter, contractResolver, debugMode); var serverHandler = new StreamRpcServerHandler(host, StreamRpcServerHandlerOptions.ConsistentResponseSequence | StreamRpcServerHandlerOptions.SupportsRequestCancellation); serverHandler.DefaultFeatures.Set(session); // If we want server to stop, just stop the "source" using (serverHandler.Attach(reader, writer)) using (clientHandler.Attach(reader, writer)) { // Wait for the "stop" request. session.CancellationToken.WaitHandle.WaitOne(); } logWriter?.WriteLine("Exited"); } }
static void Main(string[] args) { var debugMode = args.Any(a => a.Equals("--debug", StringComparison.OrdinalIgnoreCase)); #if WAIT_FOR_DEBUGGER while (!Debugger.IsAttached) { Thread.Sleep(1000); } Debugger.Break(); #endif StreamWriter logWriter = null; if (debugMode) { logWriter = File.CreateText("messages-" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".log"); logWriter.AutoFlush = true; } using (logWriter) #if !USE_CONSOLE_READER using (var cin = Console.OpenStandardInput()) using (var bcin = new BufferedStream(cin)) #endif using (var cout = Console.OpenStandardOutput()) { var contractResolver = new JsonRpcContractResolver { NamingStrategy = new CamelCaseJsonRpcNamingStrategy(), ParameterValueConverter = new CamelCaseJsonValueConverter(), }; var client = new JsonRpcClient(); if (debugMode) { client.MessageSending += (_, e) => { lock (logWriter) logWriter.WriteLine("<C{0}", e.Message); }; client.MessageReceiving += (_, e) => { lock (logWriter) logWriter.WriteLine(">C{0}", e.Message); }; } // Configure & build service host var session = new LanguageServerSession(client, contractResolver); var host = BuildServiceHost(session, logWriter, contractResolver, debugMode); // Connect the datablocks var target = new PartwiseStreamMessageTargetBlock(cout); #if USE_CONSOLE_READER var source = new ByLineTextMessageSourceBlock(Console.In); #else var source = new PartwiseStreamMessageSourceBlock(bcin); #endif using (host.Attach(source, target)) // We want to capture log all the server-to-client calls as well using (client.Attach(source, target)) // If we want server to stop, just stop the "source" using (session.CancellationToken.Register(() => source.Complete())) { session.CancellationToken.WaitHandle.WaitOne(); } logWriter.WriteLine("Exited"); } }