diff --git a/src/СценарииОбработки/ЗапретИспользованияПерейти.os b/src/СценарииОбработки/ЗапретИспользованияПерейти.os index 82802d6..b10e211 100644 --- a/src/СценарииОбработки/ЗапретИспользованияПерейти.os +++ b/src/СценарииОбработки/ЗапретИспользованияПерейти.os @@ -54,25 +54,48 @@ Процедура ПроверитьНаОтсутствиеПерейти(ПутьКФайлуМодуля) ТекстМодуля = ФайловыеОперации.ПрочитатьТекстФайла(ПутьКФайлуМодуля); - - ТекстОшибки = ""; - ШаблонПоиска = Новый РегулярноеВыражение("[\s;]+?[^|]Перейти\s+?~[a-zA-ZА-ЯЁа-яё0-9_]+"); - ШаблонПоиска.Многострочный = Истина; - ШаблонПоиска.ИгнорироватьРегистр = Истина; - Если НЕ ПустаяСтрока(ТекстМодуля) Тогда + + ТекстОшибки = ""; + ШаблонПоиска = Новый РегулярноеВыражение("[\s;]+?[^|](Перейти\s+?~[a-zA-ZА-ЯЁа-яё0-9_]+)"); + ШаблонПоиска.Многострочный = Истина; + ШаблонПоиска.ИгнорироватьРегистр = Истина; Совпадения = ШаблонПоиска.НайтиСовпадения(ТекстМодуля); - Если Совпадения.Количество() Тогда - - ТекстОшибки = СтрШаблон( - "В файле '%1' обнаружено использование Перейти (%2)", - ПутьКФайлуМодуля, - Совпадения.Количество()); - Лог.Ошибка(ТекстОшибки); - ВызватьИсключение ТекстОшибки; - + Если Совпадения.Количество() = 0 Тогда + Возврат; КонецЕсли; + + Совпадение = Совпадения[0]; + Если Совпадение.Группы.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + БлокПерейти = Совпадение.Группы[1].Значение; + ПозицияБлока = СтрНайти(Совпадение.Значение, БлокПерейти); + + КавычкиОткрыты = Ложь; + ПозицияКавычек = 0; + Пока ПозицияКавычек < ПозицияБлока Цикл + ПозицияКавычек = СтрНайти(Совпадение.Значение, """", НаправлениеПоиска.СНачала, ПозицияКавычек + 1); + Если ПозицияКавычек = 0 ИЛИ ПозицияКавычек > ПозицияБлока Тогда + Прервать; + КонецЕсли; + + КавычкиОткрыты = НЕ КавычкиОткрыты; + КонецЦикла; + + Если КавычкиОткрыты Тогда + // Блок Перейти находится внутри строкового значения и не является выражением языка. + Возврат; + КонецЕсли; + + ТекстОшибки = СтрШаблон( + "В файле '%1' обнаружено использование Перейти (%2)", + ПутьКФайлуМодуля, + Совпадения.Количество()); + Лог.Ошибка(ТекстОшибки); + ВызватьИсключение ТекстОшибки; КонецЕсли; diff --git a/tests/fixtures/ЗапретИспользованияПерейти/v8config.json b/tests/fixtures/ЗапретИспользованияПерейти/v8config.json new file mode 100644 index 0000000..d370a14 --- /dev/null +++ b/tests/fixtures/ЗапретИспользованияПерейти/v8config.json @@ -0,0 +1,52 @@ +{ + "Precommt4onecСценарии": { + "ИспользоватьСценарииРепозитория": false, + "КаталогЛокальныхСценариев": "", + "ГлобальныеСценарии": [ + "ВставкаКопирайтов.os", + "ДобавлениеПробеловПередКлючевымиСловами.os", + "ЗапретИспользованияПерейти.os", + "ИсправлениеНеКаноническогоНаписания.os", + "КорректировкаXMLФорм.os", + "ОбработкаЮнитТестов.os", + "ОтключениеПолнотекстовогоПоиска.os", + "ОтключениеРазрешенияИзменятьФорму.os", + "ПроверкаДублейПроцедурИФункций.os", + "ПроверкаКорректностиИнструкцийПрепроцессора.os", + "ПроверкаКорректностиОбластей.os", + "ПроверкаНецензурныхСлов.os", + "РазборОбычныхФормНаИсходники.os", + "РазборОтчетовОбработокРасширений.os", + "СинхронизацияОбъектовМетаданныхИФайлов.os", + "СортировкаСостава.os", + "УдалениеДублейМетаданных.os", + "УдалениеЛишнихКонцевыхПробелов.os", + "УдалениеЛишнихПустыхСтрок.os" + ], + "ОтключенныеСценарии": [], + "Проекты": { + "configurator\\": "configurator\\", + "EDT\\Configuration\\src\\": "EDT\\Configuration\\src\\", + "no_parent_configuration\\": "no_parent_configuration\\" + }, + "НастройкиСценариев": { + "ВставкаКопирайтов": { + "ИгнорироватьМодулиОбъектовПоставки": true, + "ПутьКФайлуКопирайта": "COPYRIGHT", + "ИсключаемыеТэги": [ + "// IMPORT" + ] + }, + "ОтключениеПолнотекстовогоПоиска": { + "МетаданныеДляИсключения": {} + }, + "ПроверкаНецензурныхСлов": { + "ФайлСНецензурнымиСловами": "НецензурныеСлова.txt" + }, + "РазборОтчетовОбработокРасширений": { + "ИспользоватьНастройкиПоУмолчанию": true, + "ВерсияПлатформы": "" + } + } + } +} \ No newline at end of file diff --git a/tests/fixtures/ЗапретИспользованияПерейти/МодульСПерейти.bsl b/tests/fixtures/ЗапретИспользованияПерейти/МодульСПерейти.bsl new file mode 100644 index 0000000..6ddd15e --- /dev/null +++ b/tests/fixtures/ЗапретИспользованияПерейти/МодульСПерейти.bsl @@ -0,0 +1,9 @@ + +Процедура ПропуститьБлокВнутриКонструкцииПерейти() + Значение = Неопределено; + Перейти ~Метка; + + Значение = "Не будет установлено"; +~Метка: + Сообщить(Значение); +КонецПроцедуры diff --git a/tests/fixtures/ЗапретИспользованияПерейти/МодульСоСтрокой.bsl b/tests/fixtures/ЗапретИспользованияПерейти/МодульСоСтрокой.bsl new file mode 100644 index 0000000..7b531c8 --- /dev/null +++ b/tests/fixtures/ЗапретИспользованияПерейти/МодульСоСтрокой.bsl @@ -0,0 +1,4 @@ + +Функция РекомендацияПоИспользованию() + Возврат СтрШаблон("Мы не рекомендуем использовать: %1", "Перейти ~Метка"); +КонецФункции diff --git a/tests/fixtures/ЗапретИспользованияПерейти/МодульСоСтрокой2.bsl b/tests/fixtures/ЗапретИспользованияПерейти/МодульСоСтрокой2.bsl new file mode 100644 index 0000000..5f25724 --- /dev/null +++ b/tests/fixtures/ЗапретИспользованияПерейти/МодульСоСтрокой2.bsl @@ -0,0 +1,8 @@ + +Функция ПримерПлохогоКода() + Возврат "Значение = Неопределено; + | Перейти ~Метка; + | Значение = Ложь; + |~Метка: + | Значение = Истина"; +КонецФункции diff --git a/tests/ТестПроверкаСценариевОбработки.os b/tests/ТестПроверкаСценариевОбработки.os index 94c20d2..2fa5818 100644 --- a/tests/ТестПроверкаСценариевОбработки.os +++ b/tests/ТестПроверкаСценариевОбработки.os @@ -38,6 +38,7 @@ ВсеТесты.Добавить("ТестДолжен_ПроверитьЗагрузкуСценариевПоИмени"); ВсеТесты.Добавить("ТестДолжен_ПроверитьИзменениеТегаКастомизацииФормы"); ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийВставкиКопирайтовНеОбновляетКопирайтВФайлахПоставки"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийЗапретаИспользованияПерейтиНеСрабатываетНаСтроку"); Возврат ВсеТесты; @@ -552,6 +553,38 @@ #КонецОбласти +#Область ЗапретИспользованияПерейти + +Процедура ТестДолжен_ПроверитьЧтоСценарийЗапретаИспользованияПерейтиНеСрабатываетНаСтроку() Экспорт + НачалоЗамера = ТекущаяУниверсальнаяДатаВМиллисекундах(); + + ОбъектСценария = ПолучитьСценарий("ЗапретИспользованияПерейти.os"); + + ВременныйКаталог = ПолучитьИмяВременногоФайла(); + Фикстура = Фикстура("ЗапретИспользованияПерейти"); + СоздатьКаталог(ВременныйКаталог); + СкопироватьКаталог(Фикстура, ВременныйКаталог); + + Настройки = ПолучитьДополнительныеНастройки(ВременныйКаталог); + МассивФайлов = НайтиФайлы(ВременныйКаталог, "*.bsl", Истина); + Для Каждого Файл Из МассивФайлов Цикл + ОжидаемыйРезультат = СтрНайти(Файл.Имя, "Перейти") = 0; + Попытка + Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, Настройки); + Исключение + Результат = Ложь; + КонецПопытки; + Ожидаем.Что(Результат, "Ошибка проверки запрета использования Перейти в файле " + Файл.Имя).Равно(ОжидаемыйРезультат); + КонецЦикла; + + МенеджерВременныхФайлов.УдалитьФайл(ВременныйКаталог); + + ВремяВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах() - НачалоЗамера; + Настройки.Лог.Отладка("Тестирование запрета использования Перейти выполнено за %1 мс.", ВремяВыполнения); +КонецПроцедуры + +#КонецОбласти + #КонецОбласти #Область Служебные