mirror of
https://github.com/bia-technologies/precommit4onec.git
synced 2025-06-04 23:27:32 +02:00
ORAIS-293(баги) / Исправление сценария ПроверкаКорректностиИнструкцийПрепроцессора
This commit is contained in:
parent
fc081ffd4f
commit
cb38294b1d
@ -42,7 +42,7 @@
|
||||
- `ОбработкаЮнитТестов` - обновляет метод-загрузчик сценариев в общих модулях расширения с unit-тестами (по умолчанию отключен).
|
||||
- `ОтключениеПолнотекстовогоПоиска` - отключает полнотекстовый поиск в файлах описаний метаданных. [См. подробнее](/docs/ОтключениеПолнотекстовогоПоиска.md)
|
||||
- `ПроверкаДублейПроцедурИФункций` - проверяет уникальность названий процедур и функций в модулях.
|
||||
- `ПроверкаКорректностиДирективКомпиляции` - проверяет корректность написания директив компиляции в модулях.
|
||||
- `ПроверкаКорректностиИнструкцийПрепроцессора` - проверяет корректность написания инструкций препроцессора в модулях.
|
||||
- `ПроверкаКорректностиОбластей` - проверяет корректность "скобок" областей в модулях (парность и последовательность).
|
||||
- `ПроверкаНецензурныхСлов` - проверяет наличие нецензурных слов в модулях. [См. подробнее](/docs/ПроверкаНецензурныхСлов.md)
|
||||
- `РазборОбычныхФормНаИсходники` - раскладывает файлы обычных форм (`Form.bin`) на исходные файлы с помощью инструмента `v8unpack`.
|
||||
|
@ -59,7 +59,7 @@ n
|
||||
"ОбработкаЮнитТестов.os",
|
||||
"ОтключениеПолнотекстовогоПоиска.os",
|
||||
"ПроверкаДублейПроцедурИФункций.os",
|
||||
"ПроверкаКорректностиДирективКомпиляции.os",
|
||||
"ПроверкаКорректностиИнструкцийПрепроцессора.os",
|
||||
"ПроверкаКорректностиОбластей.os",
|
||||
"ПроверкаНецензурныхСлов.os",
|
||||
"РазборОбычныхФормНаИсходники.os",
|
||||
|
@ -60,15 +60,15 @@
|
||||
И я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os exec-rules <РабочийКаталог> -source-dir ."
|
||||
Тогда Вывод команды "oscript" содержит "обнаружены нецензурные слова"
|
||||
|
||||
Сценарий: Прекоммит вывел ошибку о некорректных директивах компиляции
|
||||
Когда Я копирую файл "tests\fixtures\ПроверкаКорректностиДирективКомпиляции.bsl" в каталог репозитория "РабочийКаталог"
|
||||
Сценарий: Прекоммит вывел ошибку о некорректных инструкциях препроцессора
|
||||
Когда Я копирую файл "tests\fixtures\ПроверкаКорректностиИнструкцийПрепроцессора.bsl" в каталог репозитория "РабочийКаталог"
|
||||
И я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os exec-rules <РабочийКаталог> -source-dir ."
|
||||
Тогда Вывод команды "oscript" содержит "ошибка в написании директивы"
|
||||
Тогда Вывод команды "oscript" содержит "ошибка в написании инструкции"
|
||||
|
||||
Сценарий: Прекоммит вывел ошибку о некорректных директивах компиляции
|
||||
Когда Я копирую файл "tests\fixtures\ПроверкаКорректностиДирективКомпиляции2.bsl" в каталог репозитория "РабочийКаталог"
|
||||
Сценарий: Прекоммит вывел ошибку о некорректных инструкциях препроцессона
|
||||
Когда Я копирую файл "tests\fixtures\ПроверкаКорректностиИнструкцийПрепроцессора2.bsl" в каталог репозитория "РабочийКаталог"
|
||||
И я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os exec-rules <РабочийКаталог> -source-dir ."
|
||||
Тогда Вывод команды "oscript" содержит "ошибки в парности директив #Если и #КонецЕсли."
|
||||
Тогда Вывод команды "oscript" содержит "ошибки в порядке #Если и #КонецЕсли."
|
||||
|
||||
Сценарий: Прекоммит использует локальные настройки репозитория вместо глобальных
|
||||
Когда Я копирую каталог "localscenario" из каталога "tests\fixtures" проекта в рабочий каталог
|
||||
|
@ -40,7 +40,7 @@
|
||||
Установленные настройки: Базовые настройки
|
||||
ИспользоватьСценарииРепозитория = Нет
|
||||
КаталогЛокальныхСценариев =
|
||||
ГлобальныеСценарии = ДобавлениеПробеловПередКлючевымиСловами.os,ДобавлениеТестовВРасширение.os,ЗапретИспользованияПерейти.os,ИсправлениеНеКаноническогоНаписания.os,КорректировкаXMLФорм.os,ОбработкаЮнитТестов.os,ОтключениеПолнотекстовогоПоиска.os,ПроверкаДублейПроцедурИФункций.os,ПроверкаКорректностиДирективКомпиляции.os,ПроверкаКорректностиОбластей.os,ПроверкаНецензурныхСлов.os,РазборОбычныхФормНаИсходники.os,РазборОтчетовОбработокРасширений.os,СинхронизацияОбъектовМетаданныхИФайлов.os,СортировкаДереваМетаданных.os,УдалениеДублейМетаданных.os,УдалениеЛишнихКонцевыхПробелов.os,УдалениеЛишнихПустыхСтрок.os
|
||||
ГлобальныеСценарии = ДобавлениеПробеловПередКлючевымиСловами.os,ДобавлениеТестовВРасширение.os,ЗапретИспользованияПерейти.os,ИсправлениеНеКаноническогоНаписания.os,КорректировкаXMLФорм.os,ОбработкаЮнитТестов.os,ОтключениеПолнотекстовогоПоиска.os,ПроверкаДублейПроцедурИФункций.os,ПроверкаКорректностиИнструкцийПрепроцессора.os,ПроверкаКорректностиОбластей.os,ПроверкаНецензурныхСлов.os,РазборОбычныхФормНаИсходники.os,РазборОтчетовОбработокРасширений.os,СинхронизацияОбъектовМетаданныхИФайлов.os,СортировкаДереваМетаданных.os,УдалениеДублейМетаданных.os,УдалениеЛишнихКонцевыхПробелов.os,УдалениеЛишнихПустыхСтрок.os
|
||||
ОтключенныеСценарии =
|
||||
НастройкиСценариев = Соответствие
|
||||
ОтключениеПолнотекстовогоПоиска = Соответствие
|
||||
|
@ -1,6 +1,6 @@
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Служебный модуль с реализацией сценариев обработки файлов <ПроверкаКорректностиОбластей>
|
||||
//
|
||||
// Служебный модуль с реализацией сценариев обработки файлов <ПроверкаКорректностиИнструкцийПрепроцессора>
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@ -14,7 +14,7 @@
|
||||
//
|
||||
Функция ИмяСценария() Экспорт
|
||||
|
||||
Возврат "ПроверкаКорректностиДирективКомпиляции";
|
||||
Возврат "ПроверкаКорректностиИнструкцийПрепроцессора";
|
||||
|
||||
КонецФункции // ИмяСценария()
|
||||
|
||||
@ -24,7 +24,7 @@
|
||||
// Параметры:
|
||||
// АнализируемыйФайл - Файл - Файл из журнала git для анализа
|
||||
// КаталогИсходныхФайлов - Строка - Каталог расположения исходных файлов относительно каталог репозитория
|
||||
// ДополнительныеПараметры - Структура - Набор дополнительных параметров, которые можно использовать
|
||||
// ДополнительныеПараметры - Структура - Набор дополнительных параметров, которые можно использовать
|
||||
// * Лог - Объект - Текущий лог
|
||||
// * ИзмененныеКаталоги - Массив - Каталоги, которые необходимо добавить в индекс
|
||||
// * КаталогРепозитория - Строка - Адрес каталога репозитория
|
||||
@ -42,7 +42,7 @@
|
||||
|
||||
Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария());
|
||||
|
||||
ПроверитьНаКорректностьДиректив(АнализируемыйФайл.ПолноеИмя);
|
||||
ПроверитьНаКорректностьИнструкций(АнализируемыйФайл.ПолноеИмя);
|
||||
Возврат Истина;
|
||||
|
||||
КонецЕсли;
|
||||
@ -51,89 +51,109 @@
|
||||
|
||||
КонецФункции // ОбработатьФайл()
|
||||
|
||||
Процедура ПроверитьНаКорректностьДиректив(ПутьКФайлуМодуля)
|
||||
Процедура ПроверитьНаКорректностьИнструкций(ПутьКФайлуМодуля)
|
||||
|
||||
МассивКлючевыхСлов = ПолучитьМассивИнструкций();
|
||||
|
||||
МассивКлючевыхСлов = ПолучитьМассивДиректив();
|
||||
|
||||
СодержимоеФайла = ФайловыеОперации.ПрочитатьТекстФайла(ПутьКФайлуМодуля);
|
||||
|
||||
|
||||
ТекстРазбора = Новый ТекстовыйДокумент;
|
||||
ТекстРазбора.УстановитьТекст(СодержимоеФайла);
|
||||
ВсегоСтрок = ТекстРазбора.КоличествоСтрок();
|
||||
|
||||
ШаблонПоиска = Новый РегулярноеВыражение("^[\t ]*?#[\t ]*?(?:(?:Если+?)|(?:КонецЕсли))[\t ]*?");
|
||||
ШаблонПоиска = Новый РегулярноеВыражение("^[\t ]*?#[\t ]*?(?:(?:Если+?)|(?:КонецЕсли)|)[\t\n ]+?");
|
||||
ШаблонПоиска.Многострочный = Истина;
|
||||
ШаблонПоиска.ИгнорироватьРегистр = Истина;
|
||||
|
||||
СовпаденияПоКолличеству = ШаблонПоиска.НайтиСовпадения(СодержимоеФайла);
|
||||
|
||||
ШаблонПоиска = Новый РегулярноеВыражение("^\s?#Если([\W\w]+?)^\s?#КонецЕсли");
|
||||
СовпаденияПоСтруктуре = ШаблонПоиска.НайтиСовпадения(СодержимоеФайла);
|
||||
|
||||
Если СовпаденияПоКолличеству.Количество() <> СовпаденияПоСтруктуре.Количество() * 2 Тогда
|
||||
|
||||
Совпадения = ШаблонПоиска.НайтиСовпадения(СодержимоеФайла);
|
||||
|
||||
// Инструкций нет вообще
|
||||
Если Совпадения.Количество() = 0 Тогда
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
|
||||
Уровень = 0;
|
||||
Для Каждого Совпадение Из Совпадения Цикл
|
||||
|
||||
ТекстОшибки = СтрШаблон("В файле '%1' ошибки в парности директив #Если и #КонецЕсли.", ПутьКФайлуМодуля);
|
||||
Инструкция = СтрЗаменить(Нрег(СокрЛП(Совпадение.Группы[0].Значение)), "#", "");
|
||||
|
||||
Если Инструкция = "если" Тогда
|
||||
Уровень = Уровень + 1;
|
||||
ИначеЕсли Инструкция = "конецесли" Тогда
|
||||
Уровень = Уровень - 1;
|
||||
КонецЕсли;
|
||||
|
||||
Если Уровень < 0 Тогда
|
||||
НомерСтроки = СтрЧислоСтрок(Лев(СодержимоеФайла, Совпадение.Индекс));
|
||||
ТекстОшибки = СтрШаблон("'%1' ошибки в порядке #Если и #КонецЕсли стр. '%2'", ПутьКФайлуМодуля, НомерСтроки);
|
||||
Лог.Ошибка(ТекстОшибки);
|
||||
ВызватьИсключение ТекстОшибки;
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Если Уровень <> 0 Тогда
|
||||
ТекстОшибки = СтрШаблон("'%1' ошибки в парности #Если и #КонецЕсли.", ПутьКФайлуМодуля);
|
||||
Лог.Ошибка(ТекстОшибки);
|
||||
ВызватьИсключение ТекстОшибки;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Для Ит = 1 По ВсегоСтрок Цикл
|
||||
|
||||
СтрокаМодуля = СокрЛ(ТекстРазбора.ПолучитьСтроку(Ит));
|
||||
|
||||
Если ПустаяСтрока(СтрокаМодуля) ИЛИ Не СтрНачинаетсяС(СтрокаМодуля, "#") ИЛИ СтрНачинаетсяС(СтрокаМодуля, "#Область") Тогда
|
||||
ЕстьИнструкция = СтрНачинаетсяС(СтрокаМодуля, "#") И НЕ СтрНачинаетсяС(СтрокаМодуля, "#Область");
|
||||
|
||||
Если НЕ ЕстьИнструкция Тогда
|
||||
|
||||
Продолжить;
|
||||
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
СтрокаМодуля = Прав(СтрокаМодуля, СтрДлина(СтрокаМодуля) - 1);
|
||||
|
||||
|
||||
МассивПодстрок = СтрРазделить(СтрокаМодуля, " ()", Ложь);
|
||||
|
||||
Для Каждого Инструкция Из МассивПодстрок Цикл
|
||||
|
||||
Если МассивКлючевыхСлов.Найти(НРег(Инструкция)) = Неопределено Тогда
|
||||
|
||||
Для Каждого Директива Из МассивПодстрок Цикл
|
||||
|
||||
Если МассивКлючевыхСлов.Найти(Директива) = Неопределено Тогда
|
||||
|
||||
ТекстОшибки = СтрШаблон("В файле '%1' ошибка в написании директивы '%2' в строке '%3'", ПутьКФайлуМодуля, Директива, Ит);
|
||||
ТекстОшибки = СтрШаблон("'%1' ошибка в написании инструкции '%2' стр. '%3'", ПутьКФайлуМодуля, Инструкция, Ит);
|
||||
Лог.Ошибка(ТекстОшибки);
|
||||
ВызватьИсключение ТекстОшибки;
|
||||
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Функция ПолучитьМассивДиректив()
|
||||
|
||||
Функция ПолучитьМассивИнструкций()
|
||||
|
||||
МассивКлючевыхСлов = Новый Массив();
|
||||
|
||||
МассивКлючевыхСлов.Добавить("Если");
|
||||
МассивКлючевыхСлов.Добавить("Тогда");
|
||||
МассивКлючевыхСлов.Добавить("ИначеЕсли");
|
||||
МассивКлючевыхСлов.Добавить("Иначе");
|
||||
МассивКлючевыхСлов.Добавить("КонецЕсли");
|
||||
МассивКлючевыхСлов.Добавить("НаКлиенте");
|
||||
МассивКлючевыхСлов.Добавить("НаСервере");
|
||||
МассивКлючевыхСлов.Добавить("Сервер");
|
||||
МассивКлючевыхСлов.Добавить("Клиент");
|
||||
МассивКлючевыхСлов.Добавить("МобильноеПриложениеКлиент");
|
||||
МассивКлючевыхСлов.Добавить("МобильноеПриложениеСервер");
|
||||
МассивКлючевыхСлов.Добавить("ТолстыйКлиентОбычноеПриложение");
|
||||
МассивКлючевыхСлов.Добавить("ТолстыйКлиентУправляемоеПриложение");
|
||||
МассивКлючевыхСлов.Добавить("ВнешнееСоединение");
|
||||
МассивКлючевыхСлов.Добавить("ТонкийКлиент");
|
||||
МассивКлючевыхСлов.Добавить("ВебКлиент");
|
||||
МассивКлючевыхСлов.Добавить("КонецОбласти");
|
||||
МассивКлючевыхСлов.Добавить("И");
|
||||
МассивКлючевыхСлов.Добавить("ИЛИ");
|
||||
МассивКлючевыхСлов.Добавить("НЕ");
|
||||
|
||||
|
||||
МассивКлючевыхСлов.Добавить("если");
|
||||
МассивКлючевыхСлов.Добавить("тогда");
|
||||
МассивКлючевыхСлов.Добавить("иначеесли");
|
||||
МассивКлючевыхСлов.Добавить("иначе");
|
||||
МассивКлючевыхСлов.Добавить("конецесли");
|
||||
МассивКлючевыхСлов.Добавить("наклиенте");
|
||||
МассивКлючевыхСлов.Добавить("насервере");
|
||||
МассивКлючевыхСлов.Добавить("сервер");
|
||||
МассивКлючевыхСлов.Добавить("клиент");
|
||||
МассивКлючевыхСлов.Добавить("мобильноеприложениеклиент");
|
||||
МассивКлючевыхСлов.Добавить("мобильноеприложениесервер");
|
||||
МассивКлючевыхСлов.Добавить("толстыйклиентобычноеприложение");
|
||||
МассивКлючевыхСлов.Добавить("толстыйклиентуправляемоеприложение");
|
||||
МассивКлючевыхСлов.Добавить("внешнеесоединение");
|
||||
МассивКлючевыхСлов.Добавить("тонкийклиент");
|
||||
МассивКлючевыхСлов.Добавить("вебклиент");
|
||||
МассивКлючевыхСлов.Добавить("конецобласти");
|
||||
МассивКлючевыхСлов.Добавить("и");
|
||||
МассивКлючевыхСлов.Добавить("или");
|
||||
МассивКлючевыхСлов.Добавить("не");
|
||||
|
||||
Возврат МассивКлючевыхСлов;
|
||||
|
||||
|
||||
КонецФункции
|
||||
|
@ -19,7 +19,7 @@
|
||||
#Иначе
|
||||
|
||||
#КонецЕсли
|
||||
|
||||
#КонецЕсли
|
||||
Процедура КнопкаВыполнитьНажатие(Кнопка)
|
||||
// Вставить содержимое обработчика.
|
||||
КонецПроцедуры
|
@ -84,7 +84,7 @@
|
||||
"КорректировкаXMLФорм.os",
|
||||
"ОтключениеПолнотекстовогоПоиска.os",
|
||||
"ПроверкаДублейПроцедурИФункций.os",
|
||||
"ПроверкаКорректностиДирективКомпиляции.os",
|
||||
"ПроверкаКорректностиИнструкцийПрепроцессора.os",
|
||||
"ПроверкаНецензурныхСлов.os",
|
||||
"РазборОбычныхФормНаИсходники.os",
|
||||
"РазборОтчетовОбработокРасширений.os",
|
||||
|
@ -94,7 +94,7 @@
|
||||
ОжидаемыеСценарии.Добавить("ОбработкаЮнитТестов.os");
|
||||
ОжидаемыеСценарии.Добавить("ПроверкаНецензурныхСлов.os");
|
||||
ОжидаемыеСценарии.Добавить("ОтключениеПолнотекстовогоПоиска.os");
|
||||
ОжидаемыеСценарии.Добавить("ПроверкаКорректностиДирективКомпиляции.os");
|
||||
ОжидаемыеСценарии.Добавить("ПроверкаКорректностиИнструкцийПрепроцессора.os");
|
||||
ОжидаемыеСценарии.Добавить("ПроверкаДублейПроцедурИФункций.os");
|
||||
ОжидаемыеСценарии.Добавить("ПроверкаКорректностиОбластей.os");
|
||||
ОжидаемыеСценарии.Добавить("РазборОбычныхФормНаИсходники.os");
|
||||
|
@ -11,7 +11,7 @@
|
||||
"ОбработкаЮнитТестов.os",
|
||||
"ОтключениеПолнотекстовогоПоиска.os",
|
||||
"ПроверкаДублейПроцедурИФункций.os",
|
||||
"ПроверкаКорректностиДирективКомпиляции.os",
|
||||
"ПроверкаКорректностиИнструкцийПрепроцессора.os",
|
||||
"ПроверкаКорректностиОбластей.os",
|
||||
"ПроверкаНецензурныхСлов.os",
|
||||
"РазборОбычныхФормНаИсходники.os",
|
||||
|
Loading…
x
Reference in New Issue
Block a user