Как сделать Visual Studio полностью поддержать пользовательскую ошибку Analyzer RoslynC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как сделать Visual Studio полностью поддержать пользовательскую ошибку Analyzer Roslyn

Сообщение Anonymous »

Я экспериментирую с созданием пользовательского анализатора Roslyn, чтобы вызвать ошибки компилятора при определенных обстоятельствах. Моим «доказательством концепции» является соблюдение брекетов вокруг тела операторов IF. Я создал минимальный анализатор и проект проверки, код в конце. То же самое произойдет, если я щелкну правой кнопкой мыши узел проекта и нажимаю «Build». Кроме того, ничто в редакторе не предполагает, что существует ошибка компилятора, где я обычно ожидаю увидеть кригливую красную линию под кодом оскорбления и/или запись в окне списка ошибок. />
Analyzer < /h2>
testanalyser/testanalyser.csprojобразной


netstandard2.0
TestAnalyser
TestAnalyser
13
true









testanalyser/ifstatementbrancesanalyser.cs
using System.Collections.Immutable;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Diagnostics;

namespace TestAnalyser
{
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public class IfStatementBracesAnalyser : DiagnosticAnalyzer
{
public const string DiagnosticId = "ENFB001";
private static readonly LocalizableString Title = "If statement must use braces";
private static readonly LocalizableString MessageFormat = "Add braces to the 'if' statement";
private static readonly LocalizableString Description = "Single-line 'if' statements must always use braces.";
private const string Category = "Formatting";

private static readonly DiagnosticDescriptor Rule = new DiagnosticDescriptor(
DiagnosticId, Title, MessageFormat, Category,
DiagnosticSeverity.Error, isEnabledByDefault: true, description: Description);

public override ImmutableArray SupportedDiagnostics => ImmutableArray.Create(Rule);

public override void Initialize(AnalysisContext context)
{
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
context.EnableConcurrentExecution();
context.RegisterSyntaxNodeAction(AnalyzeIfStatement, SyntaxKind.IfStatement);
}

private static void AnalyzeIfStatement(SyntaxNodeAnalysisContext context)
{
var ifStatement = (IfStatementSyntax)context.Node;

// Check if the statement's embedded statement is NOT a block
if (ifStatement.Statement is not BlockSyntax)
{
var diagnostic = Diagnostic.Create(Rule, ifStatement.IfKeyword.GetLocation());
context.ReportDiagnostic(diagnostic);
}
else
{
var diagnostic = Diagnostic.Create(Rule, ifStatement.IfKeyword.GetLocation());
context.ReportDiagnostic(diagnostic);
}
}
}
}

proof
testanalyserprotect/testanalyserproof.csproj



Exe
net9.0
enable
enable
true
true








testanalyserprose/program.cs
var a = 1;
if (a == 2) Console.WriteLine("Hello world");
else Console.WriteLine("Test");

// should fail to compile


Подробнее здесь: https://stackoverflow.com/questions/796 ... yzer-error
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»