Как включить трассировку диагностики для LSP в Visual Studio - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь включить диагностическую трассировку для LSP в Visual Studio, как написано в msdn .

В соответствии с инструкциями я выполнил следующие шаги:

  1. Я добавил ConfigurationSections к ILanguageClient

    public IEnumerable<string> ConfigurationSections
    {
        get
        {
            yield return "foo";
        }
    }
    
  2. Я создал файл VSWorkspaceSettings. json в следующей строке:

    {
       "foo.trace.server": "Verbose"
    }
    
  3. Я добавил файл VSWorkspaceSettings. json в папку .vs, в которую записано ILanguageClient, и папку .vs решения, для которого реализован LSP.

Но это не работает. Что мне не хватает? Может быть, я скопировал файл VSWorkspaceSettings. json в неправильную папку?

1 Ответ

0 голосов
/ 05 марта 2020

Я не нашел, как его включить, но нашел другой способ получить все запросы JSON от визуальной студии. На клиентском языке я перехватил все запросы Visual Studio, создав InterceptionStream как здесь , и обернул PipeStream.

Использование:

var readerPipe = new NamedPipeClientStream(readerPipeName);
var writerPipe = new NamedPipeClientStream(writerPipeName);
var fileStream = File.OpenWrite(logFilePath);
var interceptionStream = new InterceptionStream(writerPipe, fileStream);

if (process.Start())
{
     await Task.WhenAll(readerPipe.ConnectAsync(token), writerPipe.ConnectAsync(token));
     return new Connection(readerPipe, interceptionStream);
}

InterceptionStream:

public class InterceptionStream : Stream
{
    public InterceptionStream(Stream innerStream, Stream copyStream)
    {
        InnerStream = innerStream ?? throw new ArgumentNullException(nameof(innerStream));
        CopyStream = copyStream ?? throw new ArgumentNullException(nameof(copyStream));

        if (!CopyStream.CanWrite)
        {
            throw new ArgumentException("copyStream is not writable");
        }
    }

    public Stream InnerStream { get; }

    public Stream CopyStream { get; }

    public override bool CanRead => InnerStream.CanRead;

    public override bool CanSeek => InnerStream.CanSeek;

    public override bool CanWrite => InnerStream.CanWrite;

    public override long Length => InnerStream.Length;

    public override long Position
    {
        get => InnerStream.Position;
        set => InnerStream.Position = value;
    }

    public override void Flush()
    {
        InnerStream.Flush();
    }

    public override long Seek(long offset, SeekOrigin origin)
    {
        return InnerStream.Seek(offset, origin);
    }

    public override void SetLength(long value)
    {
        InnerStream.SetLength(value);
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        var bytesRead = InnerStream.Read(buffer, offset, count);

        if (bytesRead != 0)
        {
            CopyStream.Write(buffer, offset, bytesRead);
        }

        return bytesRead;
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        InnerStream.Write(buffer, offset, count);
        CopyStream.Write(buffer, offset, count);
    }

    protected override void Dispose(bool disposing)
    {
        CopyStream.Dispose();
        InnerStream.Dispose();
    }
}
...