1
0
mirror of https://github.com/bia-technologies/precommit4onec.git synced 2025-06-12 23:57:25 +02:00

ORAIS-293(баги) / Исправление сценария ПроверкаКорректностиИнструкцийПрепроцессора

This commit is contained in:
Медведев Дмитрий Александрович (000095681) 2021-05-27 07:54:44 +03:00 committed by Максимов Валерий Валерьевич (000044217)
parent fc081ffd4f
commit cb38294b1d
10 changed files with 90 additions and 70 deletions

View File

@ -42,7 +42,7 @@
- `ОбработкаЮнитТестов` - обновляет метод-загрузчик сценариев в общих модулях расширения с unit-тестами (по умолчанию отключен). - `ОбработкаЮнитТестов` - обновляет метод-загрузчик сценариев в общих модулях расширения с unit-тестами (по умолчанию отключен).
- `ОтключениеПолнотекстовогоПоиска` - отключает полнотекстовый поиск в файлах описаний метаданных. [См. подробнее](/docs/ОтключениеПолнотекстовогоПоиска.md) - `ОтключениеПолнотекстовогоПоиска` - отключает полнотекстовый поиск в файлах описаний метаданных. [См. подробнее](/docs/ОтключениеПолнотекстовогоПоиска.md)
- `ПроверкаДублейПроцедурИФункций` - проверяет уникальность названий процедур и функций в модулях. - `ПроверкаДублейПроцедурИФункций` - проверяет уникальность названий процедур и функций в модулях.
- `ПроверкаКорректностиДирективКомпиляции` - проверяет корректность написания директив компиляции в модулях. - `ПроверкаКорректностиИнструкцийПрепроцессора` - проверяет корректность написания инструкций препроцессора в модулях.
- `ПроверкаКорректностиОбластей` - проверяет корректность "скобок" областей в модулях (парность и последовательность). - `ПроверкаКорректностиОбластей` - проверяет корректность "скобок" областей в модулях (парность и последовательность).
- `ПроверкаНецензурныхСлов` - проверяет наличие нецензурных слов в модулях. [См. подробнее](/docs/ПроверкаНецензурныхСлов.md) - `ПроверкаНецензурныхСлов` - проверяет наличие нецензурных слов в модулях. [См. подробнее](/docs/ПроверкаНецензурныхСлов.md)
- `РазборОбычныхФормНаИсходники` - раскладывает файлы обычных форм (`Form.bin`) на исходные файлы с помощью инструмента `v8unpack`. - `РазборОбычныхФормНаИсходники` - раскладывает файлы обычных форм (`Form.bin`) на исходные файлы с помощью инструмента `v8unpack`.

View File

@ -59,7 +59,7 @@ n
"ОбработкаЮнитТестов.os", "ОбработкаЮнитТестов.os",
"ОтключениеПолнотекстовогоПоиска.os", "ОтключениеПолнотекстовогоПоиска.os",
"ПроверкаДублейПроцедурИФункций.os", "ПроверкаДублейПроцедурИФункций.os",
"ПроверкаКорректностиДирективКомпиляции.os", "ПроверкаКорректностиИнструкцийПрепроцессора.os",
"ПроверкаКорректностиОбластей.os", "ПроверкаКорректностиОбластей.os",
"ПроверкаНецензурныхСлов.os", "ПроверкаНецензурныхСлов.os",
"РазборОбычныхФормНаИсходники.os", "РазборОбычныхФормНаИсходники.os",

View File

@ -60,15 +60,15 @@
И я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os exec-rules <РабочийКаталог> -source-dir ." И я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os exec-rules <РабочийКаталог> -source-dir ."
Тогда Вывод команды "oscript" содержит "обнаружены нецензурные слова" Тогда Вывод команды "oscript" содержит "обнаружены нецензурные слова"
Сценарий: Прекоммит вывел ошибку о некорректных директивах компиляции Сценарий: Прекоммит вывел ошибку о некорректных инструкциях препроцессора
Когда Я копирую файл "tests\fixtures\ПроверкаКорректностиДирективКомпиляции.bsl" в каталог репозитория "РабочийКаталог" Когда Я копирую файл "tests\fixtures\ПроверкаКорректностиИнструкцийПрепроцессора.bsl" в каталог репозитория "РабочийКаталог"
И я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os exec-rules <РабочийКаталог> -source-dir ." И я выполняю команду "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" с параметрами "<КаталогПроекта>/src/main.os exec-rules <РабочийКаталог> -source-dir ."
Тогда Вывод команды "oscript" содержит "ошибки в парности директив #Если и #КонецЕсли." Тогда Вывод команды "oscript" содержит "ошибки в порядке #Если и #КонецЕсли."
Сценарий: Прекоммит использует локальные настройки репозитория вместо глобальных Сценарий: Прекоммит использует локальные настройки репозитория вместо глобальных
Когда Я копирую каталог "localscenario" из каталога "tests\fixtures" проекта в рабочий каталог Когда Я копирую каталог "localscenario" из каталога "tests\fixtures" проекта в рабочий каталог

View File

@ -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
ОтключенныеСценарии = ОтключенныеСценарии =
НастройкиСценариев = Соответствие НастройкиСценариев = Соответствие
ОтключениеПолнотекстовогоПоиска = Соответствие ОтключениеПолнотекстовогоПоиска = Соответствие

View File

@ -1,6 +1,6 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// //
// Служебный модуль с реализацией сценариев обработки файлов <ПроверкаКорректностиОбластей> // Служебный модуль с реализацией сценариев обработки файлов <ПроверкаКорректностиИнструкцийПрепроцессора>
// //
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@ -14,7 +14,7 @@
// //
Функция ИмяСценария() Экспорт Функция ИмяСценария() Экспорт
Возврат "ПроверкаКорректностиДирективКомпиляции"; Возврат "ПроверкаКорректностиИнструкцийПрепроцессора";
КонецФункции // ИмяСценария() КонецФункции // ИмяСценария()
@ -42,7 +42,7 @@
Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария()); Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария());
ПроверитьНаКорректностьДиректив(АнализируемыйФайл.ПолноеИмя); ПроверитьНаКорректностьИнструкций(АнализируемыйФайл.ПолноеИмя);
Возврат Истина; Возврат Истина;
КонецЕсли; КонецЕсли;
@ -51,9 +51,9 @@
КонецФункции // ОбработатьФайл() КонецФункции // ОбработатьФайл()
Процедура ПроверитьНаКорректностьДиректив(ПутьКФайлуМодуля) Процедура ПроверитьНаКорректностьИнструкций(ПутьКФайлуМодуля)
МассивКлючевыхСлов = ПолучитьМассивДиректив(); МассивКлючевыхСлов = ПолучитьМассивИнструкций();
СодержимоеФайла = ФайловыеОперации.ПрочитатьТекстФайла(ПутьКФайлуМодуля); СодержимоеФайла = ФайловыеОперации.ПрочитатьТекстФайла(ПутьКФайлуМодуля);
@ -61,28 +61,50 @@
ТекстРазбора.УстановитьТекст(СодержимоеФайла); ТекстРазбора.УстановитьТекст(СодержимоеФайла);
ВсегоСтрок = ТекстРазбора.КоличествоСтрок(); ВсегоСтрок = ТекстРазбора.КоличествоСтрок();
ШаблонПоиска = Новый РегулярноеВыражение("^[\t ]*?#[\t ]*?(?:(?:Если+?)|(?:КонецЕсли))[\t ]*?"); ШаблонПоиска = Новый РегулярноеВыражение("^[\t ]*?#[\t ]*?(?:(?:Если+?)|(?:КонецЕсли)|)[\t\n ]+?");
ШаблонПоиска.Многострочный = Истина; ШаблонПоиска.Многострочный = Истина;
ШаблонПоиска.ИгнорироватьРегистр = Истина; ШаблонПоиска.ИгнорироватьРегистр = Истина;
СовпаденияПоКолличеству = ШаблонПоиска.НайтиСовпадения(СодержимоеФайла); Совпадения = ШаблонПоиска.НайтиСовпадения(СодержимоеФайла);
ШаблонПоиска = Новый РегулярноеВыражение("^\s?#Если([\W\w]+?)^\s?#КонецЕсли"); // Инструкций нет вообще
СовпаденияПоСтруктуре = ШаблонПоиска.НайтиСовпадения(СодержимоеФайла); Если Совпадения.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Если СовпаденияПоКолличеству.Количество() <> СовпаденияПоСтруктуре.Количество() * 2 Тогда Уровень = 0;
Для Каждого Совпадение Из Совпадения Цикл
ТекстОшибки = СтрШаблон("В файле '%1' ошибки в парности директив #Если и #КонецЕсли.", ПутьКФайлуМодуля); Инструкция = СтрЗаменить(Нрег(СокрЛП(Совпадение.Группы[0].Значение)), "#", "");
Если Инструкция = "если" Тогда
Уровень = Уровень + 1;
ИначеЕсли Инструкция = "конецесли" Тогда
Уровень = Уровень - 1;
КонецЕсли;
Если Уровень < 0 Тогда
НомерСтроки = СтрЧислоСтрок(Лев(СодержимоеФайла, Совпадение.Индекс));
ТекстОшибки = СтрШаблон("'%1' ошибки в порядке #Если и #КонецЕсли стр. '%2'", ПутьКФайлуМодуля, НомерСтроки);
Лог.Ошибка(ТекстОшибки); Лог.Ошибка(ТекстОшибки);
ВызватьИсключение ТекстОшибки; ВызватьИсключение ТекстОшибки;
КонецЕсли;
КонецЦикла;
Если Уровень <> 0 Тогда
ТекстОшибки = СтрШаблон("'%1' ошибки в парности #Если и #КонецЕсли.", ПутьКФайлуМодуля);
Лог.Ошибка(ТекстОшибки);
ВызватьИсключение ТекстОшибки;
КонецЕсли; КонецЕсли;
Для Ит = 1 По ВсегоСтрок Цикл Для Ит = 1 По ВсегоСтрок Цикл
СтрокаМодуля = СокрЛ(ТекстРазбора.ПолучитьСтроку(Ит)); СтрокаМодуля = СокрЛ(ТекстРазбора.ПолучитьСтроку(Ит));
Если ПустаяСтрока(СтрокаМодуля) ИЛИ Не СтрНачинаетсяС(СтрокаМодуля, "#") ИЛИ СтрНачинаетсяС(СтрокаМодуля, "#Область") Тогда ЕстьИнструкция = СтрНачинаетсяС(СтрокаМодуля, "#") И НЕ СтрНачинаетсяС(СтрокаМодуля, "#Область");
Если НЕ ЕстьИнструкция Тогда
Продолжить; Продолжить;
@ -92,11 +114,11 @@
МассивПодстрок = СтрРазделить(СтрокаМодуля, " ()", Ложь); МассивПодстрок = СтрРазделить(СтрокаМодуля, " ()", Ложь);
Для Каждого Директива Из МассивПодстрок Цикл Для Каждого Инструкция Из МассивПодстрок Цикл
Если МассивКлючевыхСлов.Найти(Директива) = Неопределено Тогда Если МассивКлючевыхСлов.Найти(НРег(Инструкция)) = Неопределено Тогда
ТекстОшибки = СтрШаблон("В файле '%1' ошибка в написании директивы '%2' в строке '%3'", ПутьКФайлуМодуля, Директива, Ит); ТекстОшибки = СтрШаблон("'%1' ошибка в написании инструкции '%2' стр. '%3'", ПутьКФайлуМодуля, Инструкция, Ит);
Лог.Ошибка(ТекстОшибки); Лог.Ошибка(ТекстОшибки);
ВызватьИсключение ТекстОшибки; ВызватьИсключение ТекстОшибки;
@ -105,35 +127,33 @@
КонецЦикла; КонецЦикла;
КонецЦикла; КонецЦикла;
КонецПроцедуры КонецПроцедуры
Функция ПолучитьМассивДиректив() Функция ПолучитьМассивИнструкций()
МассивКлючевыхСлов = Новый Массив(); МассивКлючевыхСлов = Новый Массив();
МассивКлючевыхСлов.Добавить("Если"); МассивКлючевыхСлов.Добавить("если");
МассивКлючевыхСлов.Добавить("Тогда"); МассивКлючевыхСлов.Добавить("тогда");
МассивКлючевыхСлов.Добавить("ИначеЕсли"); МассивКлючевыхСлов.Добавить("иначеесли");
МассивКлючевыхСлов.Добавить("Иначе"); МассивКлючевыхСлов.Добавить("иначе");
МассивКлючевыхСлов.Добавить("КонецЕсли"); МассивКлючевыхСлов.Добавить("конецесли");
МассивКлючевыхСлов.Добавить("НаКлиенте"); МассивКлючевыхСлов.Добавить("наклиенте");
МассивКлючевыхСлов.Добавить("НаСервере"); МассивКлючевыхСлов.Добавить("насервере");
МассивКлючевыхСлов.Добавить("Сервер"); МассивКлючевыхСлов.Добавить("сервер");
МассивКлючевыхСлов.Добавить("Клиент"); МассивКлючевыхСлов.Добавить("клиент");
МассивКлючевыхСлов.Добавить("МобильноеПриложениеКлиент"); МассивКлючевыхСлов.Добавить("мобильноеприложениеклиент");
МассивКлючевыхСлов.Добавить("МобильноеПриложениеСервер"); МассивКлючевыхСлов.Добавить("мобильноеприложениесервер");
МассивКлючевыхСлов.Добавить("ТолстыйКлиентОбычноеПриложение"); МассивКлючевыхСлов.Добавить("толстыйклиентобычноеприложение");
МассивКлючевыхСлов.Добавить("ТолстыйКлиентУправляемоеПриложение"); МассивКлючевыхСлов.Добавить("толстыйклиентуправляемоеприложение");
МассивКлючевыхСлов.Добавить("ВнешнееСоединение"); МассивКлючевыхСлов.Добавить("внешнеесоединение");
МассивКлючевыхСлов.Добавить("ТонкийКлиент"); МассивКлючевыхСлов.Добавить("тонкийклиент");
МассивКлючевыхСлов.Добавить("ВебКлиент"); МассивКлючевыхСлов.Добавить("вебклиент");
МассивКлючевыхСлов.Добавить("КонецОбласти"); МассивКлючевыхСлов.Добавить("конецобласти");
МассивКлючевыхСлов.Добавить("И"); МассивКлючевыхСлов.Добавить("и");
МассивКлючевыхСлов.Добавить("ИЛИ"); МассивКлючевыхСлов.Добавить("или");
МассивКлючевыхСлов.Добавить("НЕ"); МассивКлючевыхСлов.Добавить("не");
Возврат МассивКлючевыхСлов; Возврат МассивКлючевыхСлов;
КонецФункции КонецФункции

View File

@ -19,7 +19,7 @@
#Иначе #Иначе
#КонецЕсли #КонецЕсли
#КонецЕсли
Процедура КнопкаВыполнитьНажатие(Кнопка) Процедура КнопкаВыполнитьНажатие(Кнопка)
// Вставить содержимое обработчика. // Вставить содержимое обработчика.
КонецПроцедуры КонецПроцедуры

View File

@ -84,7 +84,7 @@
"КорректировкаXMLФорм.os", "КорректировкаXMLФорм.os",
"ОтключениеПолнотекстовогоПоиска.os", "ОтключениеПолнотекстовогоПоиска.os",
"ПроверкаДублейПроцедурИФункций.os", "ПроверкаДублейПроцедурИФункций.os",
"ПроверкаКорректностиДирективКомпиляции.os", "ПроверкаКорректностиИнструкцийПрепроцессора.os",
"ПроверкаНецензурныхСлов.os", "ПроверкаНецензурныхСлов.os",
"РазборОбычныхФормНаИсходники.os", "РазборОбычныхФормНаИсходники.os",
"РазборОтчетовОбработокРасширений.os", "РазборОтчетовОбработокРасширений.os",

View File

@ -94,7 +94,7 @@
ОжидаемыеСценарии.Добавить("ОбработкаЮнитТестов.os"); ОжидаемыеСценарии.Добавить("ОбработкаЮнитТестов.os");
ОжидаемыеСценарии.Добавить("ПроверкаНецензурныхСлов.os"); ОжидаемыеСценарии.Добавить("ПроверкаНецензурныхСлов.os");
ОжидаемыеСценарии.Добавить("ОтключениеПолнотекстовогоПоиска.os"); ОжидаемыеСценарии.Добавить("ОтключениеПолнотекстовогоПоиска.os");
ОжидаемыеСценарии.Добавить("ПроверкаКорректностиДирективКомпиляции.os"); ОжидаемыеСценарии.Добавить("ПроверкаКорректностиИнструкцийПрепроцессора.os");
ОжидаемыеСценарии.Добавить("ПроверкаДублейПроцедурИФункций.os"); ОжидаемыеСценарии.Добавить("ПроверкаДублейПроцедурИФункций.os");
ОжидаемыеСценарии.Добавить("ПроверкаКорректностиОбластей.os"); ОжидаемыеСценарии.Добавить("ПроверкаКорректностиОбластей.os");
ОжидаемыеСценарии.Добавить("РазборОбычныхФормНаИсходники.os"); ОжидаемыеСценарии.Добавить("РазборОбычныхФормНаИсходники.os");

View File

@ -11,7 +11,7 @@
"ОбработкаЮнитТестов.os", "ОбработкаЮнитТестов.os",
"ОтключениеПолнотекстовогоПоиска.os", "ОтключениеПолнотекстовогоПоиска.os",
"ПроверкаДублейПроцедурИФункций.os", "ПроверкаДублейПроцедурИФункций.os",
"ПроверкаКорректностиДирективКомпиляции.os", "ПроверкаКорректностиИнструкцийПрепроцессора.os",
"ПроверкаКорректностиОбластей.os", "ПроверкаКорректностиОбластей.os",
"ПроверкаНецензурныхСлов.os", "ПроверкаНецензурныхСлов.os",
"РазборОбычныхФормНаИсходники.os", "РазборОбычныхФормНаИсходники.os",