如何使用 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"));
}
}
}
我尝试过的:
- 我的直觉(错误地)说返回具有不同 errorType 的 ErrorTag 可能会产生不同类型的标记,但无论您传递给它什么字符串,波浪线仍然是红色的。例如。 new ErrorTag("Warning") 给出红色波浪线。 MSDN 文档几乎不存在。参见 ErrorTag。
- 在 Tagging namespace 中没有提到实施 ITag 的不同标签 class。我希望存在 WarningTag 或 InfoTag。
- 在 MSDN 论坛上提问 here。
问题:如何创建绿色(或蓝色或黄色)波浪形装饰?可悲的是,即使是神秘或复杂的解决方案也会受到赞赏...
我的目标是 VS2015 和 VS2017。
编辑:在输入此问题时,MSDN 论坛上的某个人回答说当前 API 无法完成此问题。 Visual Studio真的不可能做出黄色的波浪线吗?!
PredefinedErrorTypeNames 包含 ErrorTag
的 ErrorType
属性 支持的值。
您接近 "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。
我有一个显示红色错误曲线的 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"));
}
}
}
我尝试过的:
- 我的直觉(错误地)说返回具有不同 errorType 的 ErrorTag 可能会产生不同类型的标记,但无论您传递给它什么字符串,波浪线仍然是红色的。例如。 new ErrorTag("Warning") 给出红色波浪线。 MSDN 文档几乎不存在。参见 ErrorTag。
- 在 Tagging namespace 中没有提到实施 ITag 的不同标签 class。我希望存在 WarningTag 或 InfoTag。
- 在 MSDN 论坛上提问 here。
问题:如何创建绿色(或蓝色或黄色)波浪形装饰?可悲的是,即使是神秘或复杂的解决方案也会受到赞赏...
我的目标是 VS2015 和 VS2017。
编辑:在输入此问题时,MSDN 论坛上的某个人回答说当前 API 无法完成此问题。 Visual Studio真的不可能做出黄色的波浪线吗?!
PredefinedErrorTypeNames 包含 ErrorTag
的 ErrorType
属性 支持的值。
您接近 "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。