Используйте Roslyn MSBuildWorkspace Project AddAnalyzerReference не загружает анализаторы

1

Я работаю над проектом отчета о кодах. В настоящее время я могу скомпилировать проекты решений, получить диагностику, связанную с компиляцией, и т.д. Проблема возникает, когда я пытаюсь загрузить мои пользовательские идентификационные анализаторы, я пытался использовать AnalyzerFileReference и AnalyzerImageReference без каких-либо результатов, Всегда я получаю доступ к проектам. Анализаторы пустые.

var inmutableArray = (new List<IDiagnosticAnalyzer>
    {
        new VariableEndedWithIdNamedCorrectlyDiagnosticAnalyzer()
    }).ToImmutableArray();
var analyzerImageReference = new AnalyzerImageReference(inmutableArray);

foreach (Project project in solution.Projects)
{                  
    project.AddAnalyzerReference(analyzerImageReference );
    //No analizers loaded....
}

ОБНОВЛЕНИЕ (спасибо за отзыв [Josh Varty])

Я пробовал это двумя способами:

var newProjects = new List<Project>();
foreach (Project project in solution.Projects)
{
    var newSolutionn= solution.AddAnalyzerReference(project.Id, analyzerImageReference);
    newProjects.Add(newSolutionn.Projects.FirstOrDefault(p=> p.Id == project.Id));
}

foreach (Project project in solution.Projects)
{
    var newProject = project.AddAnalyzerReference( analyzerImageReference);
}

В обоих случаях загружаются анализаторы, но когда я получаю компиляцию, и я получаю диагностику, я не получаю вывод, связанный с этими анализаторами (я думаю, что они не вызываются в функции компиляции get).

var compilation = newProject.GetCompilationAsync().Result;

var diagnostics =   compilation.GetDiagnostics();

Какие-либо предложения?

  • 0
    Проекты (как и большинство вещей в Roslyn) неизменны. Таким образом, AddAnalyzerReference() не AddAnalyzerReference() проект, а возвращает новый проект. См .: source.roslyn.codeplex.com/#Microsoft.CodeAnalysis.Workspaces/…
Теги:
compilation
roslyn

2 ответа

1

Я нашел способ сделать это:

 public static Task<ImmutableArray<Diagnostic>> GetDiagnosticsAsync(this Compilation compilation, ImmutableArray<DiagnosticAnalyzer> analyzers, AnalyzerOptions options, CancellationToken cancellationToken = default(CancellationToken))
    {
        options = options ?? new AnalyzerOptions(ImmutableArray<AdditionalStream>.Empty, ImmutableDictionary<string, string>.Empty);
        Compilation newCompilation = null;
        var analyzerDriver = AnalyzerDriver.Create(compilation, analyzers, options, out newCompilation, cancellationToken);
        newCompilation.GetDiagnostics(cancellationToken);

        return analyzerDriver.GetDiagnosticsAsync();
    }

Я опубликовал версию проекта с открытым исходным кодом, с которой я работал с помощью Roslyn, вы можете увидеть код и другую информацию, связанную с анализаторами и кодом.

https://bitbucket.org/jrierapeiro/codeanalyzer

  • 0
    Я попытался реализовать это, и VS пожаловался на «AnalyzerDriver не доступен из-за его уровня защиты». Есть идеи?
1

Как я уже отмечал, большинство объектов Roslyn неизменны. Это означает, что такие методы, как AddAnalyzerReference(), не мутируют проект, а вместо этого возвращают новый.

У меня нет анализатора, чтобы проверить это, но я считаю, что вы можете использовать следующее. Обратите внимание, что я использую Solution.AddAnalyzerReference() вместо того, который вы использовали.

var inmutableArray =(new List<IDiagnosticAnalyzer>
        {
            new VariableEndedWithIdNamedCorrectlyDiagnosticAnalyzer()
        }).ToImmutableArray();
var analyzerImageReference = new AnalyzerImageReference(inmutableArray);

Solution newSolution = solution;

//We iterate over the original solution
foreach (Project project in solution.Projects)
{                   
    //But we save our work in the newSolution
    newSolution = newSolution.AddAnalyzerReference(project.Id, analyzerImageReference);
}

//Now newSolution should contain all your changes.
//Maybe you want to save this reference?
solution = newSolution;
  • 0
    Я попробовал это, и это работает, однако, когда я получаю компиляцию, я не получаю результаты, предоставленные пользовательскими анализаторами. Спасибо за все.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню