示例#1
0
        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");
                }
        }