@@ -73,6 +73,11 @@ public class MagicDateDiagnostic extends AbstractVisitorDiagnostic {
7373 )
7474 private final Set <String > authorizedDates = new HashSet <>(Arrays .asList (DEFAULT_AUTHORIZED_DATES .split ("," )));
7575
76+ /**
77+ * Настраивает диагностику с указанными параметрами.
78+ *
79+ * @param configuration карта параметров конфигурации
80+ */
7681 @ Override
7782 public void configure (Map <String , Object > configuration ) {
7883 var authorizedDatesString = (String ) configuration .getOrDefault ("authorizedDates" , DEFAULT_AUTHORIZED_DATES );
@@ -83,6 +88,12 @@ public void configure(Map<String, Object> configuration) {
8388 authorizedDates .addAll (authD );
8489 }
8590
91+ /**
92+ * Обрабатывает константные значения и проверяет их на наличие магических дат.
93+ *
94+ * @param ctx контекст константного значения
95+ * @return результат обработки
96+ */
8697 @ Override
8798 public ParseTree visitConstValue (BSLParser .ConstValueContext ctx ) {
8899 var tNode = ctx .DATETIME ();
@@ -104,6 +115,12 @@ public ParseTree visitConstValue(BSLParser.ConstValueContext ctx) {
104115 return defaultResult ();
105116 }
106117
118+ /**
119+ * Проверяет, является ли строка валидной датой.
120+ *
121+ * @param ctx контекст строки для проверки
122+ * @return true, если строка является валидной датой, иначе false
123+ */
107124 private static boolean isValidDate (BSLParser .StringContext ctx ) {
108125 final var text = ctx .getText ();
109126 if (!paramPattern .matcher (text ).matches ()) {
@@ -113,6 +130,12 @@ private static boolean isValidDate(BSLParser.StringContext ctx) {
113130 return isValidDate (strDate );
114131 }
115132
133+ /**
134+ * Проверяет, является ли строка валидной датой в формате YYYYMMDD или YYYYMMDDHHMMSS.
135+ *
136+ * @param strDate строка даты для проверки
137+ * @return true, если строка является валидной датой, иначе false
138+ */
116139 private static boolean isValidDate (String strDate ) {
117140 var year = parseInt (strDate .substring (0 , 4 ));
118141 if (year < 1 || year > MAX_YEAR_BY_1C ) {
@@ -132,6 +155,12 @@ private static boolean isValidDate(String strDate) {
132155 return hh <= 24 && mm <= 60 && ss <= 60 ;
133156 }
134157
158+ /**
159+ * Парсит строку в целое число, удаляя ведущие нули.
160+ *
161+ * @param text строка для парсинга
162+ * @return целое число или 0, если парсинг не удался
163+ */
135164 private static int parseInt (String text ) {
136165 String s = zeroPattern .matcher (text ).replaceAll ("" );
137166 try {
@@ -141,16 +170,34 @@ private static int parseInt(String text) {
141170 }
142171 }
143172
173+ /**
174+ * Проверяет, должно ли константное значение быть обработано диагностикой.
175+ *
176+ * @param ctx контекст константного значения
177+ * @return true, если значение должно быть обработано, иначе false
178+ */
144179 private boolean isAccepted (BSLParser .ConstValueContext ctx ) {
145180 String text = ctx .getText ();
146181 return text != null && !text .isEmpty () && !isExcluded (text );
147182 }
148183
184+ /**
185+ * Проверяет, исключено ли значение из проверки (находится в списке авторизованных дат).
186+ *
187+ * @param text текст для проверки
188+ * @return true, если значение исключено, иначе false
189+ */
149190 private boolean isExcluded (String text ) {
150191 String s = nonNumberPattern .matcher (text ).replaceAll ("" );
151192 return authorizedDates .contains (s );
152193 }
153194
195+ /**
196+ * Получает контекст выражения для заданного константного значения.
197+ *
198+ * @param constValue контекст константного значения
199+ * @return контекст выражения или пустой Optional, если не найден
200+ */
154201 private static Optional <BSLParser .ExpressionContext > getExpression (Optional <BSLParser .ConstValueContext > constValue ) {
155202 return constValue
156203 .map (BSLParserRuleContext ::getParent )
@@ -161,10 +208,23 @@ private static Optional<BSLParser.ExpressionContext> getExpression(Optional<BSLP
161208 .map (BSLParser .ExpressionContext .class ::cast );
162209 }
163210
211+ /**
212+ * Проверяет, находится ли выражение внутри простого присваивания даты.
213+ *
214+ * @param expression контекст выражения для проверки
215+ * @return true, если выражение находится внутри присваивания, иначе false
216+ */
164217 private static boolean insideSimpleDateAssignment (Optional <BSLParser .ExpressionContext > expression ) {
165218 return insideContext (expression , BSLParser .AssignmentContext .class );
166219 }
167220
221+ /**
222+ * Проверяет, находится ли выражение внутри контекста заданного типа.
223+ *
224+ * @param expression контекст выражения для проверки
225+ * @param assignmentContextClass класс контекста для проверки
226+ * @return true, если выражение находится внутри контекста заданного типа, иначе false
227+ */
168228 private static boolean insideContext (Optional <BSLParser .ExpressionContext > expression ,
169229 Class <? extends BSLParserRuleContext > assignmentContextClass ) {
170230 return expression
@@ -173,10 +233,22 @@ private static boolean insideContext(Optional<BSLParser.ExpressionContext> expre
173233 .isPresent ();
174234 }
175235
236+ /**
237+ * Проверяет, находится ли выражение внутри оператора возврата.
238+ *
239+ * @param expression контекст выражения для проверки
240+ * @return true, если выражение находится внутри оператора возврата, иначе false
241+ */
176242 private static boolean insideReturnSimpleDate (Optional <BSLParser .ExpressionContext > expression ) {
177243 return insideContext (expression , BSLParser .ReturnStatementContext .class );
178244 }
179245
246+ /**
247+ * Проверяет, находится ли выражение внутри присваивания с методом Дата().
248+ *
249+ * @param expression контекст выражения для проверки
250+ * @return true, если выражение находится внутри присваивания с методом Дата(), иначе false
251+ */
180252 private static boolean insideAssignmentWithDateMethodForSimpleDate (Optional <BSLParser .ExpressionContext > expression ) {
181253 return expression
182254 .map (BSLParserRuleContext ::getParent ) // callParam
@@ -216,5 +288,22 @@ private static boolean insideStructurePropertyAssignment(BSLParser.ExpressionCon
216288
217289 return acceptor != null && acceptor .accessProperty () != null ;
218290 }
291+
292+ /**
293+ * Находит контекст присваивания для заданного узла AST.
294+ *
295+ * @param ctx контекст узла для поиска
296+ * @return контекст присваивания или null, если не найден
297+ */
298+ private static BSLParser .AssignmentContext findAssignmentContext (BSLParserRuleContext ctx ) {
299+ var current = ctx .getParent ();
300+ while (current != null ) {
301+ if (current instanceof BSLParser .AssignmentContext assignmentContext ) {
302+ return assignmentContext ;
303+ }
304+ current = current .getParent ();
305+ }
306+ return null ;
307+ }
219308
220309}
0 commit comments