@@ -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