【发布时间】:2017-10-22 17:29:12
【问题描述】:
我首先写了一个 DiagnosticAnalyzer,然后努力让它加载,直到我将其项目列为 VSIX 清单中的资产。
现在我还添加了一个CodeFixProvider 到与分析器相同的项目中,但它没有加载。
我错过了什么?
我尝试了以下方法:
- 添加了 SharedAttribute。
- 已将其命名空间更改为与分析器相同的命名空间。
- 确保 DiagnosticId 指向 Analyzer 使用的相同 DiagnosticId。
- 删除了“C:\Users\cp321831\AppData\Local\Microsoft\VisualStudio\15.0_c657f3ebRoslyn\ComponentModelCache”目录
- 删除了“C:\Users\cp321831\AppData\Local\Microsoft\VisualStudio\15.0_c657f3ebExp\ComponentModelCache”目录
- 删除了已完成的“15.0_c657f3ebRoslyn”和“15.0_c657f3ebExp”目录
- 我确保名称以 CodeFixProvider 结尾。
类型构造函数、实例构造函数和任何方法中的断点表明代码修复程序中没有加载任何内容,也没有命中任何内容。
这是代码修复程序的代码:
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.CodeFixes;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Text;
using System.Collections.Immutable;
using System.Composition;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace Capitec.CodeAnalysis.Diagnostics
{
[ExportCodeFixProvider(LanguageNames.CSharp), Shared]
public sealed class UserInteractionCodeFixProvider : CodeFixProvider
{
private const string Title = "Invoke mapped function instead";
static UserInteractionCodeFixProvider()
{
}
public UserInteractionCodeFixProvider()
{
}
public override ImmutableArray<string> FixableDiagnosticIds =>
ImmutableArray.Create(
AutomationScriptAnalyzerOfReplacableUserInteractions.DiagnosticId);
public override FixAllProvider GetFixAllProvider()
{
return WellKnownFixAllProviders.BatchFixer;
}
public override async Task RegisterCodeFixesAsync(CodeFixContext context)
{
var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken)
.ConfigureAwait(false);
var diagnostic = context.Diagnostics.First();
var span = diagnostic.Location.SourceSpan;
var invocation = ResolveInvocation(root, span);
context.RegisterCodeFix(
CodeAction.Create(
Title,
ct => InvokeFunctionInstead(context.Document, invocation, ct),
equivalenceKey: Title),
diagnostic);
}
private InvocationExpressionSyntax ResolveInvocation(SyntaxNode root, TextSpan span)
{
return root
.FindToken(span.Start)
.Parent
.AncestorsAndSelf()
.OfType<InvocationExpressionSyntax>()
.First();
}
private Task<Document> InvokeFunctionInstead(
Document document,
InvocationExpressionSyntax invocation,
CancellationToken cancellationToken)
{
return Task.FromResult(document);
}
}
}
任何帮助将不胜感激。
谢谢。
【问题讨论】:
-
我知道你已经解决了这个问题,但这只是给其他到达这里的人的小费。如果其中包含
.,DiagnosticId 有时不起作用
标签: c# roslyn roslyn-code-analysis codefixprovider