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

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

Сообщение Anonymous »

Я экспериментирую с созданием пользовательского анализатора Roslyn, чтобы вызвать ошибки компилятора при определенных обстоятельствах. Моим «доказательством концепции» является соблюдение брекетов вокруг тела операторов IF. Я создал минимальный анализатор и проект проверки, код в конце. То же самое произойдет, если я щелкну правой кнопкой мыши узел проекта и нажимаю «Build». Кроме того, ничто в редакторе не предполагает, что существует ошибка компилятора, где я обычно ожидаю увидеть кригливую красную линию под кодом оскорбления и/или запись в окне списка ошибок. />
Изменить: dotnet build < /code> вывод, как указано в комментариях: < /p>
C:\repos\AnalyserTest\src\CSharp\TestAnalyserProof>dotnet build
Restore complete (0.7s)
TestAnalyser succeeded with 1 warning(s) (1.2s) → C:\repos\AnalyserTest\src\CSharp\TestAnalyser\bin\Debug\netstandard2.0\TestAnalyser.dll
C:\repos\AnalyserTest\src\CSharp\TestAnalyser\IfStatementBracesAnalyzer.cs(19,13): warning RS2008: Enable analyzer release tracking for the analyzer project containing rule 'ENFB001' (https://github.com/dotnet/roslyn-analyz ... rs.Help.md)
TestAnalyserProof failed with 1 error(s) (1.2s)
C:\repos\AnalyserTest\src\CSharp\TestAnalyserProof\Program.cs(2,1): error ENFB001: Add braces to the 'if' statement

Build failed with 1 error(s) and 1 warning(s) in 3.7s
< /code>
dotnet run:
C:\repos\AnalyserTest\src\CSharp\TestAnalyserProof\Program.cs(2,1): error ENFB001: Add braces to the 'if' statement

The build failed. Fix the build errors and run again.
< /code>

Analyzer < /h2>
testanalyser/testanalyser.csproj



netstandard2.0
TestAnalyser
TestAnalyser
13
true








< /code>
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







< /code>
TestAnalyserProof/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#»