Диагностика диагностического анализатора Roslyn не отражается в экземпляре Visual Studio

88
12

Я пытаюсь обнаружить передачу модели в качестве параметра функции в контроллере для приложения MVC. Я написал код для диагностического анализатора Roslyn. Логика кода отлично работает, поскольку точки останова попадают по назначению. Но диагностический результат с точки зрения предупреждения не отражается в открывшемся экземпляре визуальной студии.


Это фрагмент кода моего диагностического анализатора:


public override void Initialize(AnalysisContext context)
{
// TODO: Consider registering other actions that act on syntax instead of or in addition to symbols
context.RegisterSyntaxNodeAction(AnalyzeSymbol, SyntaxKind.MethodDeclaration);
}

private async static void AnalyzeSymbol(SyntaxNodeAnalysisContext context)
{
var method = (MethodDeclarationSyntax)context.Node;

ParameterListSyntax ParamList = method.ParameterList;
int flag = 0;
string ParamName = null;

foreach (ParameterSyntax Param in ParamList.Parameters)
{
if (Param.Type.ToString().Contains("Model"))
{
ParamName = Param.Type.ToString();
flag = 1;
break;
}
}

if (flag == 0)
return;

string solutionPath = @"C:\Users\Administrator\Documents\Visual Studio 2015\Projects\WebApplication6\WebApplication6.sln";
var workspace = MSBuildWorkspace.Create();
var solution = await workspace.OpenSolutionAsync(solutionPath);

foreach (var project in solution.Projects)
{
foreach (var document in project.Documents)
{
CancellationToken source = default(CancellationToken);

SyntaxNode root = await document.GetSyntaxRootAsync(source);

var classDeclarations = root.DescendantNodes().Where(n => n.IsKind(SyntaxKind.ClassDeclaration));
flag = 0;

foreach (ClassDeclarationSyntax cls in classDeclarations)
{
if (cls.Identifier.Text.ToString() == ParamName)
{

var diagnostic = Diagnostic.Create(Rule, method.GetLocation());
context.ReportDiagnostic(diagnostic);
}
}
}
}
}

спросил(а) 2020-02-26T19:23:44+03:00 1 год, 1 месяц назад
1
Решение
62

Похоже, вы неправильно просматриваете классы. Вы должны работать с контекстом и не должны открывать новое решение. Контекст содержит всю необходимую информацию об открытом решении.

ответил(а) 2020-02-26T19:41:33.666036+03:00 1 год, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема