1
0
mirror of https://github.com/bia-technologies/precommit4onec.git synced 2024-11-24 08:32:25 +02:00

ORAIS-1430: Ложное срабатывание на инструкцию Перейти

This commit is contained in:
Зазулов Алексей Александрович (ЗК-0001393) 2024-04-17 20:16:58 +03:00 committed by Максимов Валерий Валерьевич (000044217)
parent 249c071069
commit 19a129d93f
6 changed files with 144 additions and 15 deletions

View File

@ -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)",
ПутьКФайлуМодуля,
Совпадения.Количество());
Лог.Ошибка(ТекстОшибки);
ВызватьИсключение ТекстОшибки;
КонецЕсли;

View File

@ -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,
"ВерсияПлатформы": ""
}
}
}
}

View File

@ -0,0 +1,9 @@
Процедура ПропуститьБлокВнутриКонструкцииПерейти()
Значение = Неопределено;
Перейти ~Метка;
Значение = "Не будет установлено";
~Метка:
Сообщить(Значение);
КонецПроцедуры

View File

@ -0,0 +1,4 @@
Функция РекомендацияПоИспользованию()
Возврат СтрШаблон("Мы не рекомендуем использовать: %1", "Перейти ~Метка");
КонецФункции

View File

@ -0,0 +1,8 @@
Функция ПримерПлохогоКода()
Возврат "Значение = Неопределено;
| Перейти ~Метка;
| Значение = Ложь;
|~Метка:
| Значение = Истина";
КонецФункции

View File

@ -38,6 +38,7 @@
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗагрузкуСценариевПоИмени");
ВсеТесты.Добавить("ТестДолжен_ПроверитьИзменениеТегаКастомизацииФормы");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийВставкиКопирайтовНеОбновляетКопирайтВФайлахПоставки");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийЗапретаИспользованияПерейтиНеСрабатываетНаСтроку");
Возврат ВсеТесты;
@ -552,6 +553,38 @@
#КонецОбласти
#Область ЗапретИспользованияПерейти
Процедура ТестДолжен_ПроверитьЧтоСценарийЗапретаИспользованияПерейтиНеСрабатываетНаСтроку() Экспорт
НачалоЗамера = ТекущаяУниверсальнаяДатаВМиллисекундах();
ОбъектСценария = ПолучитьСценарий("ЗапретИспользованияПерейти.os");
ВременныйКаталог = ПолучитьИмяВременногоФайла();
Фикстура = Фикстура("ЗапретИспользованияПерейти");
СоздатьКаталог(ВременныйКаталог);
СкопироватьКаталог(Фикстура, ВременныйКаталог);
Настройки = ПолучитьДополнительныеНастройки(ВременныйКаталог);
МассивФайлов = НайтиФайлы(ВременныйКаталог, "*.bsl", Истина);
Для Каждого Файл Из МассивФайлов Цикл
ОжидаемыйРезультат = СтрНайти(Файл.Имя, "Перейти") = 0;
Попытка
Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, Настройки);
Исключение
Результат = Ложь;
КонецПопытки;
Ожидаем.Что(Результат, "Ошибка проверки запрета использования Перейти в файле " + Файл.Имя).Равно(ОжидаемыйРезультат);
КонецЦикла;
МенеджерВременныхФайлов.УдалитьФайл(ВременныйКаталог);
ВремяВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах() - НачалоЗамера;
Настройки.Лог.Отладка("Тестирование запрета использования Перейти выполнено за %1 мс.", ВремяВыполнения);
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#Область Служебные