forked from OmniSharp/omnisharp-vim
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Program.cs
60 lines (56 loc) · 2.22 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
namespace stdioproxy
{
class Program
{
private static string HomeFolder = Environment.GetEnvironmentVariable(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "USERPROFILE" : "HOME");
private const int MAX_BUFFER_SIZE = 2048;
private static string LOG_FILE = $"{HomeFolder}/omnisharp-proxy.log";
private static string OMNISHARP_EXECUTABLE = $"{HomeFolder}/.omnisharp/omnisharp-roslyn/OmniSharp.exe";
static void Main(string[] args)
{
using (var logStream = new StreamWriter(File.Create(LOG_FILE)))
using (var proc = Process.Start(new ProcessStartInfo
{
FileName = OMNISHARP_EXECUTABLE,
RedirectStandardInput = true,
RedirectStandardOutput = true,
Arguments = string.Join(' ', args)
}))
{
var stdoutTask = Task.Run(() =>
{
using (var stdout = proc.StandardOutput)
{
var buffer = new char[MAX_BUFFER_SIZE];
int bytesRead;
while((bytesRead = stdout.Read(buffer, 0, 1)) > 0)
{
var output = new String(buffer.Take(bytesRead).ToArray());
Console.Write(output);
logStream.Write(output);
}
}
});
var stdinTask = Task.Run(() =>
{
using (var thisStdin = Console.OpenStandardInput())
{
var buffer = new char[MAX_BUFFER_SIZE];
int byteRead;
while ((byteRead = thisStdin.ReadByte()) > 0)
{
proc.StandardInput.Write((char)byteRead);
}
}
});
Task.WaitAll(stdoutTask, stdinTask);
}
}
}
}