85 lines
2.5 KiB
C#
85 lines
2.5 KiB
C#
using Microsoft.SqlServer.TransactSql.ScriptDom;
|
|
using SQLLinter.Common;
|
|
using SQLLinter.Core;
|
|
using SQLLinter.Core.Interfaces;
|
|
using SQLLinter.Infrastructure.Configuration.Overrides;
|
|
using SQLLinter.Infrastructure.Interfaces;
|
|
|
|
namespace SQLLinter.Infrastructure.Parser;
|
|
|
|
public class FragmentBuilder : IFragmentBuilder
|
|
{
|
|
private readonly TSqlParser parser;
|
|
private readonly IReporter _reporter;
|
|
|
|
public FragmentBuilder(IReporter reporter) : this(reporter, Constants.DefaultCompatabilityLevel)
|
|
{
|
|
}
|
|
|
|
public FragmentBuilder(IReporter reporter, int compatabilityLevel)
|
|
{
|
|
parser = GetSqlParser(compatabilityLevel);
|
|
_reporter = reporter;
|
|
}
|
|
|
|
public TSqlFragment? GetFragment(string path, TextReader txtRdr, out IList<ParseError> errors, IEnumerable<IOverride> overrides = null)
|
|
{
|
|
TSqlFragment fragment;
|
|
|
|
OverrideCompatabilityLevel? compatibilityLevel = null;
|
|
if (overrides != null)
|
|
{
|
|
foreach (var lintingOverride in overrides)
|
|
{
|
|
if (lintingOverride is OverrideCompatabilityLevel overrideCompatability)
|
|
{
|
|
compatibilityLevel = overrideCompatability;
|
|
}
|
|
}
|
|
}
|
|
|
|
TSqlParser curParser;
|
|
|
|
if (compatibilityLevel != null)
|
|
{
|
|
curParser = GetSqlParser(compatibilityLevel.CompatabilityLevel);
|
|
}
|
|
else
|
|
{
|
|
curParser = parser;
|
|
}
|
|
|
|
fragment = curParser.Parse(txtRdr, out errors); //TODO: Возвращать эти ошибки
|
|
|
|
if (fragment == null)
|
|
{
|
|
foreach (var err in errors)
|
|
{
|
|
_reporter.ReportViolation(path, err.Line, err.Column, RuleViolationSeverity.Critical, "parse", err.Message, null);
|
|
}
|
|
}
|
|
|
|
return fragment?.FirstTokenIndex != -1 ? fragment : null;
|
|
}
|
|
|
|
private static TSqlParser GetSqlParser(int compatabilityLevel)
|
|
{
|
|
TSqlParser parser = compatabilityLevel switch
|
|
{
|
|
80 => new TSql80Parser(true),
|
|
90 => new TSql90Parser(true),
|
|
100 => new TSql100Parser(true),
|
|
110 => new TSql110Parser(true),
|
|
120 => new TSql120Parser(true),
|
|
130 => new TSql130Parser(true),
|
|
140 => new TSql140Parser(true),
|
|
150 => new TSql150Parser(true),
|
|
160 => new TSql160Parser(true),
|
|
170 => new TSql170Parser(true),
|
|
_ => new TSql120Parser(true),
|
|
};
|
|
|
|
return parser;
|
|
}
|
|
}
|