Files
SQLLint/SQLLinter/Infrastructure/Rules/HeaderCommentRule.cs
FrigaT 7fb11364c4
All checks were successful
CI / build-test (push) Successful in 38s
Release / pack-and-publish (release) Successful in 35s
Изменено формирование деталировки: зависимость от строк, а не от родителя
2025-12-29 01:19:51 +03:00

63 lines
2.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Microsoft.SqlServer.TransactSql.ScriptDom;
using SQLLinter.Common;
using SQLLinter.Common.Helpers;
namespace SQLLinter.Infrastructure.Rules;
public class HeaderCommentRule : BaseRuleVisitor
{
public override string Text => "У процедур/функций/триггеров должна быть шапка-комментарий с автором, департаментом, назначением: {0}";
public override void Visit(CreateProcedureStatement node) => private_visit(node, SQLHelpers.ObjectGetFullName(node.ProcedureReference.Name));
public override void Visit(CreateOrAlterProcedureStatement node) => private_visit(node, SQLHelpers.ObjectGetFullName(node.ProcedureReference.Name));
public override void Visit(CreateFunctionStatement node) => private_visit(node, SQLHelpers.ObjectGetFullName(node.Name));
public override void Visit(CreateOrAlterFunctionStatement node) => private_visit(node, SQLHelpers.ObjectGetFullName(node.Name));
public override void Visit(CreateTriggerStatement node) => private_visit(node, SQLHelpers.ObjectGetFullName(node.Name));
public override void Visit(CreateOrAlterTriggerStatement node) => private_visit(node, SQLHelpers.ObjectGetFullName(node.Name));
public override void Visit(CreateViewStatement node) => private_visit(node, SQLHelpers.ObjectGetFullName(node.SchemaObjectName));
public override void Visit(CreateOrAlterViewStatement node) => private_visit(node, SQLHelpers.ObjectGetFullName(node.SchemaObjectName));
private void private_visit(TSqlFragment node, string name)
{
var prevTokenIndex = node.FirstTokenIndex;
TSqlParserToken? prevToken = null;
while (prevTokenIndex > 0)
{
prevTokenIndex -= 1;
prevToken = node.ScriptTokenStream[prevTokenIndex];
if (prevToken.TokenType != TSqlTokenType.WhiteSpace) break;
}
if (prevToken == null ||
prevToken.TokenType != TSqlTokenType.SingleLineComment && prevToken.TokenType != TSqlTokenType.MultilineComment
)
{
if (node is ProcedureStatementBody proc)
{
AddViolation(proc.ProcedureReference.Name, name);
}
else if (node is ViewStatementBody view)
{
AddViolation(view.SchemaObjectName, name);
}
else if (node is TriggerStatementBody tr)
{
AddViolation(tr.Name, name);
}
else
{
AddViolation(node, name);
}
}
}
}