Статический анализ кода на Roslyn в памяти кода
В документации Roslyn приведен пример, приведенный ниже как способ компиляции некоторого кода и отображения любых ошибок компиляции.
Мне было интересно, если кто-нибудь знает способ выполнить некоторый статический анализ кода на код, содержащийся в переменной sourceCode в примере ниже. Я добавил StyleCop.Analyzers в свой тестовый проект, но на этом этапе я не вижу, как это можно использовать для анализа стилей (например, читаемости).
Это возможно сделать с StyleCop.Analyzers или есть альтернативный подход? Любое предложение с благодарностью получено.
Благодарю.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
namespace SemanticsCS
{
class Program
{
static void Main(string[] args)
{
var sourceCode = @"using System;
using System.Collections.Generic;
using System.Text;
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(""Hello, World!"");
}
}
}";
SyntaxTree tree = CSharpSyntaxTree.ParseText(sourceCode);
var root = (CompilationUnitSyntax)tree.GetRoot();
var compilation = CSharpCompilation.Create("HelloWorld")
.AddReferences(
MetadataReference.CreateFromFile(
typeof(object).Assembly.Location))
.AddSyntaxTrees(tree);
using (var ms = new MemoryStream())
{
EmitResult result = compilation.Emit(ms);
if (!result.Success)
{
IEnumerable<Diagnostic> failures = result.Diagnostics.Where(diagnostic =>
diagnostic.IsWarningAsError ||
diagnostic.Severity == DiagnosticSeverity.Error);
foreach (Diagnostic diagnostic in failures)
{
Console.WriteLine(diagnostic.ToString());
Console.Error.WriteLine("{0}({1})", diagnostic.GetMessage(), diagnostic.Id);
}
}
}
}
}
}
1 ответ
На самом деле, это абсолютно возможно.
Вам нужно добавить ссылку на анализатор в свой Roslyn Compilation
, с использованием WithAnalyzers
метод.
Чтобы это работало, вам нужно добавить нормальную ссылку на StyleCop.Analyzers
в свой проект, а затем создавать экземпляры различных DiagnosticAnalyzer
в этом. Так как они internal
Отражение