diff --git a/README.md b/README.md index 076cffb..a74a07b 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ - `ОбработкаЮнитТестов` - обновляет метод-загрузчик сценариев в общих модулях расширения с unit-тестами (по умолчанию отключен). - `ОтключениеПолнотекстовогоПоиска` - отключает полнотекстовый поиск в файлах описаний метаданных. [См. подробнее](/docs/ОтключениеПолнотекстовогоПоиска.md) - `ПроверкаДублейПроцедурИФункций` - проверяет уникальность названий процедур и функций в модулях. -- `ПроверкаКорректностиДирективКомпиляции` - проверяет корректность написания директив компиляции в модулях. +- `ПроверкаКорректностиИнструкцийПрепроцессора` - проверяет корректность написания инструкций препроцессора в модулях. - `ПроверкаКорректностиОбластей` - проверяет корректность "скобок" областей в модулях (парность и последовательность). - `ПроверкаНецензурныхСлов` - проверяет наличие нецензурных слов в модулях. [См. подробнее](/docs/ПроверкаНецензурныхСлов.md) - `РазборОбычныхФормНаИсходники` - раскладывает файлы обычных форм (`Form.bin`) на исходные файлы с помощью инструмента `v8unpack`. diff --git a/features/ИнтерактивнаяНастройка.feature b/features/ИнтерактивнаяНастройка.feature index 12b473f..433e1c4 100644 --- a/features/ИнтерактивнаяНастройка.feature +++ b/features/ИнтерактивнаяНастройка.feature @@ -59,7 +59,7 @@ n "ОбработкаЮнитТестов.os", "ОтключениеПолнотекстовогоПоиска.os", "ПроверкаДублейПроцедурИФункций.os", - "ПроверкаКорректностиДирективКомпиляции.os", + "ПроверкаКорректностиИнструкцийПрепроцессора.os", "ПроверкаКорректностиОбластей.os", "ПроверкаНецензурныхСлов.os", "РазборОбычныхФормНаИсходники.os", diff --git a/features/КомандаВыполнениеСценариев.feature b/features/КомандаВыполнениеСценариев.feature index 1cc177b..5c5068c 100644 --- a/features/КомандаВыполнениеСценариев.feature +++ b/features/КомандаВыполнениеСценариев.feature @@ -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" проекта в рабочий каталог diff --git a/features/Конфигурирование.feature b/features/Конфигурирование.feature index f324f50..45c18ae 100644 --- a/features/Конфигурирование.feature +++ b/features/Конфигурирование.feature @@ -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 ОтключенныеСценарии = НастройкиСценариев = Соответствие ОтключениеПолнотекстовогоПоиска = Соответствие diff --git a/src/СценарииОбработки/ПроверкаКорректностиДирективКомпиляции.os b/src/СценарииОбработки/ПроверкаКорректностиИнструкцийПрепроцессора.os similarity index 52% rename from src/СценарииОбработки/ПроверкаКорректностиДирективКомпиляции.os rename to src/СценарииОбработки/ПроверкаКорректностиИнструкцийПрепроцессора.os index d239d4c..9e9ace9 100644 --- a/src/СценарииОбработки/ПроверкаКорректностиДирективКомпиляции.os +++ b/src/СценарииОбработки/ПроверкаКорректностиИнструкцийПрепроцессора.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'", ПутьКФайлуМодуля, Инструкция, Ит); Лог.Ошибка(ТекстОшибки); ВызватьИсключение ТекстОшибки; - + КонецЕсли; - + КонецЦикла; КонецЦикла; - КонецПроцедуры -Функция ПолучитьМассивДиректив() - +Функция ПолучитьМассивИнструкций() + МассивКлючевыхСлов = Новый Массив(); - - МассивКлючевыхСлов.Добавить("Если"); - МассивКлючевыхСлов.Добавить("Тогда"); - МассивКлючевыхСлов.Добавить("ИначеЕсли"); - МассивКлючевыхСлов.Добавить("Иначе"); - МассивКлючевыхСлов.Добавить("КонецЕсли"); - МассивКлючевыхСлов.Добавить("НаКлиенте"); - МассивКлючевыхСлов.Добавить("НаСервере"); - МассивКлючевыхСлов.Добавить("Сервер"); - МассивКлючевыхСлов.Добавить("Клиент"); - МассивКлючевыхСлов.Добавить("МобильноеПриложениеКлиент"); - МассивКлючевыхСлов.Добавить("МобильноеПриложениеСервер"); - МассивКлючевыхСлов.Добавить("ТолстыйКлиентОбычноеПриложение"); - МассивКлючевыхСлов.Добавить("ТолстыйКлиентУправляемоеПриложение"); - МассивКлючевыхСлов.Добавить("ВнешнееСоединение"); - МассивКлючевыхСлов.Добавить("ТонкийКлиент"); - МассивКлючевыхСлов.Добавить("ВебКлиент"); - МассивКлючевыхСлов.Добавить("КонецОбласти"); - МассивКлючевыхСлов.Добавить("И"); - МассивКлючевыхСлов.Добавить("ИЛИ"); - МассивКлючевыхСлов.Добавить("НЕ"); - + + МассивКлючевыхСлов.Добавить("если"); + МассивКлючевыхСлов.Добавить("тогда"); + МассивКлючевыхСлов.Добавить("иначеесли"); + МассивКлючевыхСлов.Добавить("иначе"); + МассивКлючевыхСлов.Добавить("конецесли"); + МассивКлючевыхСлов.Добавить("наклиенте"); + МассивКлючевыхСлов.Добавить("насервере"); + МассивКлючевыхСлов.Добавить("сервер"); + МассивКлючевыхСлов.Добавить("клиент"); + МассивКлючевыхСлов.Добавить("мобильноеприложениеклиент"); + МассивКлючевыхСлов.Добавить("мобильноеприложениесервер"); + МассивКлючевыхСлов.Добавить("толстыйклиентобычноеприложение"); + МассивКлючевыхСлов.Добавить("толстыйклиентуправляемоеприложение"); + МассивКлючевыхСлов.Добавить("внешнеесоединение"); + МассивКлючевыхСлов.Добавить("тонкийклиент"); + МассивКлючевыхСлов.Добавить("вебклиент"); + МассивКлючевыхСлов.Добавить("конецобласти"); + МассивКлючевыхСлов.Добавить("и"); + МассивКлючевыхСлов.Добавить("или"); + МассивКлючевыхСлов.Добавить("не"); + Возврат МассивКлючевыхСлов; - + КонецФункции - diff --git a/tests/fixtures/ПроверкаКорректностиДирективКомпиляции.bsl b/tests/fixtures/ПроверкаКорректностиИнструкцийПрепроцессора.bsl similarity index 100% rename from tests/fixtures/ПроверкаКорректностиДирективКомпиляции.bsl rename to tests/fixtures/ПроверкаКорректностиИнструкцийПрепроцессора.bsl diff --git a/tests/fixtures/ПроверкаКорректностиДирективКомпиляции2.bsl b/tests/fixtures/ПроверкаКорректностиИнструкцийПрепроцессора2.bsl similarity index 94% rename from tests/fixtures/ПроверкаКорректностиДирективКомпиляции2.bsl rename to tests/fixtures/ПроверкаКорректностиИнструкцийПрепроцессора2.bsl index 198d5bd..7f6c80b 100644 --- a/tests/fixtures/ПроверкаКорректностиДирективКомпиляции2.bsl +++ b/tests/fixtures/ПроверкаКорректностиИнструкцийПрепроцессора2.bsl @@ -19,7 +19,7 @@ #Иначе #КонецЕсли - +#КонецЕсли Процедура КнопкаВыполнитьНажатие(Кнопка) // Вставить содержимое обработчика. КонецПроцедуры \ No newline at end of file diff --git a/tests/fixtures/ХранениеРазныхНастроек/v8config.json b/tests/fixtures/ХранениеРазныхНастроек/v8config.json index 0e705cc..1ebee0c 100644 --- a/tests/fixtures/ХранениеРазныхНастроек/v8config.json +++ b/tests/fixtures/ХранениеРазныхНастроек/v8config.json @@ -84,7 +84,7 @@ "КорректировкаXMLФорм.os", "ОтключениеПолнотекстовогоПоиска.os", "ПроверкаДублейПроцедурИФункций.os", - "ПроверкаКорректностиДирективКомпиляции.os", + "ПроверкаКорректностиИнструкцийПрепроцессора.os", "ПроверкаНецензурныхСлов.os", "РазборОбычныхФормНаИсходники.os", "РазборОтчетовОбработокРасширений.os", diff --git a/tests/ТестНастройкиРепозитория.os b/tests/ТестНастройкиРепозитория.os index f5eb7b7..94e4d4c 100644 --- a/tests/ТестНастройкиРепозитория.os +++ b/tests/ТестНастройкиРепозитория.os @@ -94,7 +94,7 @@ ОжидаемыеСценарии.Добавить("ОбработкаЮнитТестов.os"); ОжидаемыеСценарии.Добавить("ПроверкаНецензурныхСлов.os"); ОжидаемыеСценарии.Добавить("ОтключениеПолнотекстовогоПоиска.os"); - ОжидаемыеСценарии.Добавить("ПроверкаКорректностиДирективКомпиляции.os"); + ОжидаемыеСценарии.Добавить("ПроверкаКорректностиИнструкцийПрепроцессора.os"); ОжидаемыеСценарии.Добавить("ПроверкаДублейПроцедурИФункций.os"); ОжидаемыеСценарии.Добавить("ПроверкаКорректностиОбластей.os"); ОжидаемыеСценарии.Добавить("РазборОбычныхФормНаИсходники.os"); diff --git a/v8config.json b/v8config.json index df8ec5f..7dc1a0e 100644 --- a/v8config.json +++ b/v8config.json @@ -11,7 +11,7 @@ "ОбработкаЮнитТестов.os", "ОтключениеПолнотекстовогоПоиска.os", "ПроверкаДублейПроцедурИФункций.os", - "ПроверкаКорректностиДирективКомпиляции.os", + "ПроверкаКорректностиИнструкцийПрепроцессора.os", "ПроверкаКорректностиОбластей.os", "ПроверкаНецензурныхСлов.os", "РазборОбычныхФормНаИсходники.os",