如何使用 Visual Studio 扩展创建绿色(或蓝色)波浪形装饰

How to create green (or blue) squiggle adornments with a Visual Studio extension

我有一个显示红色错误曲线的 Visual Studio 扩展。我还喜欢提供其他颜色的波浪线,例如黄色用于警告。

创建红色波浪线可以通过扩展 ITagger class 来完成:

internal sealed class MySquigglesTagger : ITagger<IErrorTag> {
    public IEnumerable<ITagSpan<IErrorTag>> GetTags(NormalizedSnapshotSpanCollection spans) {
        foreach (IMappingTagSpan<MyTokenTag> myTokenTag in this._aggregator.GetTags(spans))        
            SnapshotSpan tagSpan = myTokenTag.Span.GetSpans(this._sourceBuffer)[0];
            yield return new TagSpan<IErrorTag>(tagSpan, new ErrorTag("Error", "some info about the error"));
        }
    }
}

我尝试过的:

  1. 我的直觉(错误地)说返回具有不同 errorType 的 ErrorTag 可能会产生不同类型的标记,但无论您传递给它什么字符串,波浪线仍然是红色的。例如。 new ErrorTag("Warning") 给出红色波浪线。 MSDN 文档几乎不存在。参见 ErrorTag
  2. Tagging namespace 中没有提到实施 ITag 的不同标签 class。我希望存在 WarningTag 或 InfoTag。
  3. 在 MSDN 论坛上提问 here

问题:如何创建绿色(或蓝色或黄色)波浪形装饰?可悲的是,即使是神秘或复杂的解决方案也会受到赞赏...

我的目标是 VS2015 和 VS2017。

编辑:在输入此问题时,MSDN 论坛上的某个人回答说当前 API 无法完成此问题。 Visual Studio真的不可能做出黄色的波浪线吗?!

PredefinedErrorTypeNames 包含 ErrorTagErrorType 属性 支持的值。

您接近 "Warning",但 PredefinedErrorTypeNames.Warning 的值似乎是 "compiler warning"。

只是为了记录我自己的问题和答案。

创建一个包含以下内容的文件SquigglesTaggerProvider.cs

[Export(typeof(IViewTaggerProvider))]
[ContentType("Your Content Type")]
[TagType(typeof(ErrorTag))]
internal sealed class SquigglesTaggerProvider : IViewTaggerProvider {
    [Import]
    private IBufferTagAggregatorFactoryService _aggregatorFactory = null;

    public ITagger<T> CreateTagger<T>(ITextView textView, ITextBuffer buffer) where T : ITag {
        ITagger<T> sc() {
            return new SquigglesTagger(buffer, this._aggregatorFactory) as ITagger<T>;
        }
        return buffer.Properties.GetOrCreateSingletonProperty(sc);
    }
}

创建一个名为 SquigglesTagger.cs 的文件,内容如下:

internal sealed class SquigglesTagger : ITagger<IErrorTag> {
    private readonly ITextBuffer _sourceBuffer;
    private readonly ITagAggregator<AsmTokenTag> _aggregator;

    internal SquigglesTagger(ITextBuffer buffer, IBufferTagAggregatorFactoryService aggregatorFactory) {
        this._sourceBuffer = buffer;            
        ITagAggregator<AsmTokenTag> sc() {   
            return aggregatorFactory.CreateTagAggregator<AsmTokenTag>(buffer);
        }
        this._aggregator = buffer.Properties.GetOrCreateSingletonProperty(sc);
    }

    public IEnumerable<ITagSpan<IErrorTag>> GetTags(NormalizedSnapshotSpanCollection spans) {
        foreach (IMappingTagSpan<MyTokenTag> myTokenTag in this._aggregator.GetTags(spans))        
            SnapshotSpan tagSpan = myTokenTag.Span.GetSpans(this._sourceBuffer)[0];
            yield return new TagSpan<IErrorTag>(tagSpan, new ErrorTag(PredefinedErrorTypeNames.SyntaxError, "some info about the error"));
        }
    }
}

PredefinedErrorTypeNames 有不同的预定义错误。

public const string SyntaxError = "syntax error";
public const string CompilerError = "compiler error";
public const string OtherError = "other error";
public const string Warning = "compiler warning";
public const string Suggestion = "suggestion";

代码取自我的存储库here