40 lines
1.1 KiB
C#
40 lines
1.1 KiB
C#
using Microsoft.SqlServer.TransactSql.ScriptDom;
|
|
using SQLLinter.Common;
|
|
|
|
namespace SQLLinter.Infrastructure.Rules;
|
|
|
|
public class DuplicateGoRule : BaseRuleVisitor, IRule
|
|
{
|
|
|
|
public override string Text => "Обнаружен дублирующийся оператор GO";
|
|
|
|
public override void Visit(TSqlScript node)
|
|
{
|
|
TSqlParserToken lastToken = null;
|
|
TSqlParserToken currentToken;
|
|
for (var index = 0; index <= node.LastTokenIndex; index++)
|
|
{
|
|
var tokenType = node.ScriptTokenStream[index].TokenType;
|
|
|
|
// Skip these
|
|
switch (tokenType)
|
|
{
|
|
case TSqlTokenType.MultilineComment:
|
|
case TSqlTokenType.WhiteSpace:
|
|
case TSqlTokenType.Semicolon:
|
|
continue;
|
|
}
|
|
|
|
currentToken = node.ScriptTokenStream[index];
|
|
|
|
if (tokenType is TSqlTokenType.Go &&
|
|
lastToken?.TokenType is TSqlTokenType.Go)
|
|
{
|
|
AddViolation(Name, Text, currentToken.Line, currentToken.Column);
|
|
}
|
|
|
|
lastToken = currentToken;
|
|
}
|
|
}
|
|
}
|