Я экспериментирую с созданием пользовательского анализатора 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
Как сделать Visual Studio полностью поддержать пользовательскую ошибку Analyzer Roslyn ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как сделать Visual Studio полностью поддержать пользовательскую ошибку Analyzer Roslyn
Anonymous » » в форуме C# - 0 Ответы
- 2 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как сделать Visual Studio полностью поддержать пользовательскую ошибку Analyzer Roslyn
Anonymous » » в форуме C# - 0 Ответы
- 8 Просмотры
-
Последнее сообщение Anonymous
-