0

我正在尝试在 Visual Studio 中启用 LSP 的诊断跟踪,就像用msdn编写的一样。

根据说明,我做了以下步骤:

  1. ConfigurationSections已将ILanguageClient

    public IEnumerable<string> ConfigurationSections
    {
        get
        {
            yield return "foo";
        }
    }
    
  2. 我在以下行创建了 VSWorkspaceSettings.json 文件:

    {
       "foo.trace.server": "Verbose"
    }
    
  3. 我将 VSWorkspaceSettings.json 文件添加到ILanguageClient写入 .vs 的文件夹和实现 LSP 的解决方案的 .vs 文件夹中。

但是,它不起作用。我错过了什么?也许我将 VSWorkspaceSettings.json 文件复制到了错误的文件夹中?

4

1 回答 1

0

我没有找到如何启用它,但我找到了另一种从 Visual Studio 获取所有 JSON 请求的方法。在语言客户端,我通过在这里InterceptionStream创建这样的方式截获了来自 Visual Studio 的所有请求,并包装了 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();
    }
}
于 2020-03-05T11:37:16.587 回答