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

时间:2017-04-11 08:50:05

标签: c# .net visual-studio vsix vs-extensibility

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

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

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可能会产生不同类型的标记,但无论你传递什么字符串,曲线都会保持红色。例如。新的ErrorTag(&#34;警告&#34;)给出了红色的波形。 MSDN文档几乎不存在。见ErrorTag
  2. Tagging namespace中没有提到实现ITag的不同Tag类。我希望有一个WarningTag或InfoTag。
  3. 在MSDN论坛here上提问。
  4. 问题:如何制作绿色(或蓝色或黄色)花边装饰品?可悲的是,即使是神秘或复杂的解决方案也值得赞赏...

    我的目标是VS2015和VS2017。

    编辑:在输入此问题时,有人在MSDN论坛上回复说无法使用当前的API完成。在Visual Studio中制作黄色波浪线真的不可能吗?!

2 个答案:

答案 0 :(得分:4)

PredefinedErrorTypeNames包含ErrorType ErrorTag属性支持的值。

你接近“警告”,但PredefinedErrorTypeNames.Warning的值似乎是“编译器警告”。

答案 1 :(得分:1)

只需记录我自己的问题和答案即可。

创建具有以下内容的文件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