[英]Roslyn CodeFixProvider isn't loading or running in the Visual Studio IDE. What am I missing?
我首先编写了DiagnosticAnalyzer
,然后为使其加载而奋斗,直到我将其项目列为VSIX清单中的资产。
现在,我还将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);
}
}
}
任何帮助,将不胜感激。
谢谢。
您缺少在vsixmanifest
中的条目,该条目告诉Visual Studio您的项目包含MEF组件。 在Visual Studio内部使用MEF(托管可扩展性框架)来发现,注册和检索不同的组件。 ExportCodeProviderAttribute
实际上扩展了ExportAttribute
,该ExportAttribute
由MEF用作这是MEF组件的标记。 但是,您必须指定您的项目包含扩展的MEF组件,否则不会发生发现。 这就是为什么您的代码修复提供程序未被发现并且无法使用的原因。
同样对于创建分析器和代码修复提供程序,您还应该从Visual Studio中可用的模板开始,该模板位于Visual C# -> Extensibility -> Analyzer with Code Fix (NuGet + VSIX)
。 已经为您设置了所有必需的基础结构代码和设置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.