From 473c87b546921d92e276c45c24ac76731ee9f10d Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Fri, 15 Dec 2023 00:10:10 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=A4=D0=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diagnostics/MagicDateDiagnostic.java | 42 ++++++++++++++++++- .../diagnostics/MagicDateDiagnosticTest.java | 38 ++++++++--------- .../diagnostics/MagicDateDiagnostic.bsl | 40 +++++++++++++++++- 3 files changed, 98 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MagicDateDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MagicDateDiagnostic.java index 85cb1298e90..fc611406a09 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MagicDateDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MagicDateDiagnostic.java @@ -58,8 +58,9 @@ public class MagicDateDiagnostic extends AbstractVisitorDiagnostic { ); private static final Pattern paramPattern = CaseInsensitivePattern.compile( - "\"\\d{8}.*" + "\"[0123]{1}\\d{7}\"|\"[0123]{1}\\d{13}\"" ); + private static final Pattern zeroPattern = Pattern.compile("^0+"); private static final Pattern nonNumberPattern = CaseInsensitivePattern.compile( "\\D" @@ -109,6 +110,43 @@ private static boolean insideAssignmentWithDateMethodForSimpleDate(Optional 3999) { + return false; + } + var month = parseInt(strDate.substring(4, 6)); + var day = parseInt(strDate.substring(6, 8)); + if (month < 1 || month > 12 || day < 1 || day > 31) { + return false; + } + if (strDate.length() == 8) { + return true; + } + var hh = parseInt(strDate.substring(8, 10)); + var mm = parseInt(strDate.substring(10, 12)); + var ss = parseInt(strDate.substring(12, 14)); + return hh <= 24 && mm <= 60 && ss <= 60; + } + + private static int parseInt(String text) { + String s = zeroPattern.matcher(text).replaceAll(""); + try { + return Integer.parseInt(s); + } catch (NumberFormatException e) { + return 0; + } + } + @Override public void configure(Map configuration) { var authorizedDatesString = (String) configuration.getOrDefault("authorizedDates", DEFAULT_AUTHORIZED_DATES); @@ -124,7 +162,7 @@ public ParseTree visitConstValue(BSLParser.ConstValueContext ctx) { var tNode = ctx.DATETIME(); var sNode = ctx.string(); if ((tNode != null || sNode != null) && isAccepted(ctx)) { - if (sNode != null && !paramPattern.matcher(ctx.getText()).matches()) { + if (sNode != null && !isValidDate(sNode)) { return defaultResult(); } diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MagicDateDiagnosticTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MagicDateDiagnosticTest.java index 1d1bf82ef31..4212193d79d 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MagicDateDiagnosticTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MagicDateDiagnosticTest.java @@ -39,20 +39,21 @@ void test() { List diagnostics = getDiagnostics(); - assertThat(diagnostics).hasSize(12); + assertThat(diagnostics).hasSize(13); assertThat(diagnostics, true) - .hasRange(1, 12, 22) - .hasRange(2, 12, 28) - .hasRange(3, 7, 17) - .hasRange(4, 14, 24) - .hasRange(13, 7, 26) - .hasRange(15, 87, 97) - .hasRange(16, 80, 90) - .hasRange(16, 92, 102) - .hasRange(17, 22, 32) - .hasRange(18, 19, 35) - .hasRange(19, 10, 26) - .hasRange(19, 29, 39); + .hasRange(11, 12, 22) + .hasRange(12, 12, 28) + .hasRange(13, 7, 17) + .hasRange(14, 14, 24) + .hasRange(23, 7, 26) + .hasRange(25, 87, 97) + .hasRange(26, 80, 90) + .hasRange(26, 92, 102) + .hasRange(27, 22, 32) + .hasRange(28, 19, 35) + .hasRange(29, 10, 26) + .hasRange(29, 29, 39) + .hasRange(31, 64, 80); } @@ -67,12 +68,11 @@ void testConfigure() { assertThat(diagnostics).hasSize(5); assertThat(diagnostics, true) - .hasRange(2, 12, 28) - .hasRange(3, 7, 17) - .hasRange(13, 7, 26) - .hasRange(13, 7, 26) - .hasRange(17, 22, 32) - .hasRange(19, 29, 39); + .hasRange(12, 12, 28) + .hasRange(13, 7, 17) + .hasRange(23, 7, 26) + .hasRange(27, 22, 32) + .hasRange(29, 29, 39); } } diff --git a/src/test/resources/diagnostics/MagicDateDiagnostic.bsl b/src/test/resources/diagnostics/MagicDateDiagnostic.bsl index cc1fd04b908..a89df894f87 100644 --- a/src/test/resources/diagnostics/MagicDateDiagnostic.bsl +++ b/src/test/resources/diagnostics/MagicDateDiagnostic.bsl @@ -1,3 +1,13 @@ +Функция МаксимальнаяДата() Экспорт + //Возврат '39991231235959'; // TODO +КонецФункции + +Функция МаксимальнаяДатаПриПродолжении() + //Возврат '39990101000000'; // TODO +КонецФункции + +Процедура Тест3() + День = Дата("00020101"); День = Дата("00020101") + Шаг; // ошибка День = Дата("00020101121314") + Шаг; // ошибка @@ -19,7 +29,35 @@ Настройки.Свойство("00020501121314", ЗначениеЕдиничногоПараметра); // замечание Выполнить("00020501121314" + '12350101'); // замечание +ОтборЭлемента.ПравоеЗначение = Новый СтандартнаяДатаНачала(Дата('19800101000000')); + Значение = Метод("%1/%2"); Если Условие Тогда ВызватьИсключение "Не указано значение константы ХХХ"; -КонецЕсли; \ No newline at end of file +КонецЕсли; + +УИДЗамера = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"); +ПосторонниеСимволы = СтрСоединить(СтрРазделить(СтрокаСЧислом, "0123456789", Ложь), ""); +Объект.GetStringValue("2147483649","Software\Buhphone","ProgramPath", Значение); +НедопустимыеСимволы = НедопустимыеСимволыВСтроке(СтрАдрес.АдресСервера, + "0123456789aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ_-.:*?"); +НедопустимыеСимволы = НедопустимыеСимволы + "1234567890 "; + +Дата = Метод("04937803-5dba-11df-a1d4-005056c00008"); +Набор.Идентификатор = Новый УникальныйИдентификатор("70425541-23e3-4e5a-8bd3-9587cc949dfa"); + +НецифровыеСимволы = СтрСоединить(СтрРазделить(Значение, "1234567890,.")); +Результат = Сред("0123456789abcdef", ОстатокОтДеления + 1, 1) + Результат; + +Результат.Добавить(СтрокаОбъектаАдресации("10100000", НСтр("ru = 'Почтовый индекс'"))); +КодСтроки = КодРодителя + Прав("00000000" + Формат(Счетчик, "ЧГ="), ЧислоЦифр); +КлючНаборовСвойств = НачалоКлюча + Лев(КлючНазначения + "00000000000000000000000000000000", 32); + +КодыКЛАДР.Регион = Лев(КодКЛАДР, 2) + "00000000000"; +КодыКЛАДР.Район = Лев(КодКЛАДР, 5) + "00000000"; + +//'39990202' +//'39991231235959' +//'39990101000000' + +КонецПроцедуры \ No newline at end of file