私は最初にDiagnosticAnalyzer
と書いて、そのプロジェクトをVSIXマニフェストの資産としてリストアップするまでロードするように戦いました。Roslyn CodeFixProviderがVisual Studio IDEに読み込まれていないか、実行されていません。私は何が欠けていますか?
今度はCodeFixProvider
をアナライザーと同じプロジェクトに追加しましたが、ロードされません。
私には何が欠けていますか?
私は次のことを試してみました:
- はSharedAttributeを追加しました。
- 名前空間をアナライザと同じ名前空間に変更しました。
- DiagnosticIdがAnalyzerで使用されているDiagnosticIdを指していることを確認してください。
- "C:\ Users \ユーザーcp321831 \のAppData \ローカル\マイクロソフト\ VisualStudioを\ 15.0_c657f3ebRoslyn \ ComponentModelCache" 削除:\ Users \ユーザーcp321831 \のAppData \ローカル\マイクロソフト\ VisualStudioを\ 15.0_c657f3ebExpディレクトリ
- は」Cを削除したが\ 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に '.'が含まれていると動作しないことがあります –