@@ -128,16 +128,23 @@ private boolean checkInsideStructureInsertOrAdd(BSLParser.ExpressionContext expr
128128 * @return true, если это второй параметр метода Вставить структуры
129129 */
130130 private boolean isSecondParameterOfStructureInsert (BSLParser .CallParamContext callParam ) {
131- var callParamList = (BSLParser .CallParamListContext ) callParam .getParent ();
131+ var callParamListOpt = getCallParamList (callParam );
132+ if (callParamListOpt .isEmpty ()) {
133+ return false ;
134+ }
135+ var callParamList = callParamListOpt .get ();
132136 var callParams = callParamList .callParam ();
133137 var paramIndex = callParams .indexOf (callParam );
134138
135139 if (paramIndex != 1 ) {
136140 return false ;
137141 }
138142
139- var doCall = (BSLParser .DoCallContext ) callParamList .getParent ();
140- var methodCall = isInsertMethod (doCall );
143+ var doCallOpt = getDoCall (callParamList );
144+ if (doCallOpt .isEmpty ()) {
145+ return false ;
146+ }
147+ var methodCall = isInsertMethod (doCallOpt .get ());
141148 if (methodCall == null ) {
142149 return false ;
143150 }
@@ -181,6 +188,48 @@ private static BSLParser.CallStatementContext findCallStatement(BSLParser.Method
181188 return null ;
182189 }
183190
191+ /**
192+ * Безопасно получает CallParamListContext из CallParamContext.
193+ *
194+ * @param callParam контекст параметра вызова
195+ * @return Optional с CallParamListContext или empty, если родитель не является CallParamListContext
196+ */
197+ private static Optional <BSLParser .CallParamListContext > getCallParamList (BSLParser .CallParamContext callParam ) {
198+ var parent = callParam .getParent ();
199+ if (parent instanceof BSLParser .CallParamListContext callParamList ) {
200+ return Optional .of (callParamList );
201+ }
202+ return Optional .empty ();
203+ }
204+
205+ /**
206+ * Безопасно получает DoCallContext из CallParamListContext.
207+ *
208+ * @param callParamList контекст списка параметров вызова
209+ * @return Optional с DoCallContext или empty, если родитель не является DoCallContext
210+ */
211+ private static Optional <BSLParser .DoCallContext > getDoCall (BSLParser .CallParamListContext callParamList ) {
212+ var parent = callParamList .getParent ();
213+ if (parent instanceof BSLParser .DoCallContext doCall ) {
214+ return Optional .of (doCall );
215+ }
216+ return Optional .empty ();
217+ }
218+
219+ /**
220+ * Безопасно получает CallParamContext из ExpressionContext.
221+ *
222+ * @param expression контекст выражения
223+ * @return Optional с CallParamContext или empty, если родитель не является CallParamContext
224+ */
225+ private static Optional <BSLParser .CallParamContext > getCallParam (BSLParser .ExpressionContext expression ) {
226+ var parent = expression .getParent ();
227+ if (parent instanceof BSLParser .CallParamContext callParam ) {
228+ return Optional .of (callParam );
229+ }
230+ return Optional .empty ();
231+ }
232+
184233 /**
185234 * Проверяет, является ли метод методом "Вставить".
186235 *
@@ -207,7 +256,7 @@ private static BSLParser.MethodCallContext isInsertMethod(BSLParser.DoCallContex
207256 * @param methodCall контекст вызова метода
208257 * @return Optional с типом переменной или empty, если не удалось определить
209258 */
210- private Optional <Boolean > getVariableTypeFromCallStatement (BSLParser .MethodCallContext methodCall ) {
259+ private static Optional <Boolean > getVariableTypeFromCallStatement (BSLParser .MethodCallContext methodCall ) {
211260 var callStatement = findCallStatement (methodCall );
212261 if (callStatement == null ) {
213262 return Optional .empty ();
@@ -223,14 +272,19 @@ private Optional<Boolean> getVariableTypeFromCallStatement(BSLParser.MethodCallC
223272 * @return массив из трёх элементов: [CallParamContext, Integer индекс, CallParamListContext] или пустой массив, если не найден
224273 */
225274 private static Object [] getCallParamInfo (BSLParser .ExpressionContext expression ) {
226- var callParam = expression .getParent ();
227- if (callParam instanceof BSLParser .CallParamContext callParamContext ) {
228- var callParamList = (BSLParser .CallParamListContext ) callParamContext .getParent ();
229- var callParams = callParamList .callParam ();
230- var paramIndex = callParams .indexOf (callParamContext );
231- return new Object []{callParamContext , paramIndex , callParamList };
275+ var callParamOpt = getCallParam (expression );
276+ if (callParamOpt .isEmpty ()) {
277+ return new Object [0 ];
278+ }
279+ var callParamContext = callParamOpt .get ();
280+ var callParamListOpt = getCallParamList (callParamContext );
281+ if (callParamListOpt .isEmpty ()) {
282+ return new Object [0 ];
232283 }
233- return new Object [0 ];
284+ var callParamList = callParamListOpt .get ();
285+ var callParams = callParamList .callParam ();
286+ var paramIndex = callParams .indexOf (callParamContext );
287+ return new Object []{callParamContext , paramIndex , callParamList };
234288 }
235289
236290 /**
@@ -240,7 +294,7 @@ private static Object[] getCallParamInfo(BSLParser.ExpressionContext expression)
240294 * @param callStatement контекст вызова метода с идентификатором переменной
241295 * @return Optional с типом: true - соответствие, false - структура, empty - неопределено
242296 */
243- private Optional <Boolean > getVariableTypeFromAST (BSLParser .CallStatementContext callStatement ) {
297+ private static Optional <Boolean > getVariableTypeFromAST (BSLParser .CallStatementContext callStatement ) {
244298 var identifier = callStatement .IDENTIFIER ();
245299 var variableName = identifier .getText ();
246300 var assignment = findVariableAssignment (callStatement , variableName );
@@ -461,9 +515,15 @@ private static BSLParser.CallParamContext findCallParamContext(BSLParser.Express
461515 * @return typeName структуры или null, если не является конструктором структуры
462516 */
463517 private static BSLParser .TypeNameContext getStructureTypeName (BSLParser .CallParamContext callParamContext ) {
464- var callParamList = (BSLParser .CallParamListContext ) callParamContext .getParent ();
465- var doCall = (BSLParser .DoCallContext ) callParamList .getParent ();
466- var newExpression = doCall .getParent ();
518+ var callParamListOpt = getCallParamList (callParamContext );
519+ if (callParamListOpt .isEmpty ()) {
520+ return null ;
521+ }
522+ var doCallOpt = getDoCall (callParamListOpt .get ());
523+ if (doCallOpt .isEmpty ()) {
524+ return null ;
525+ }
526+ var newExpression = doCallOpt .get ().getParent ();
467527 if (!(newExpression instanceof BSLParser .NewExpressionContext )) {
468528 return null ;
469529 }
@@ -571,8 +631,11 @@ private boolean checkInsideCorrespondenceInsert(BSLParser.ExpressionContext expr
571631 }
572632
573633 var callParamList = (BSLParser .CallParamListContext ) callParamInfo [2 ];
574- var doCall = (BSLParser .DoCallContext ) callParamList .getParent ();
575- var methodCall = isInsertMethod (doCall );
634+ var doCallOpt = getDoCall (callParamList );
635+ if (doCallOpt .isEmpty ()) {
636+ return false ;
637+ }
638+ var methodCall = isInsertMethod (doCallOpt .get ());
576639 if (methodCall == null ) {
577640 return false ;
578641 }
@@ -597,10 +660,19 @@ private boolean checkInsideCorrespondenceInsertFirstParam(BSLParser.ExpressionCo
597660 return false ;
598661 }
599662
600- var callParam = (BSLParser .CallParamContext ) expression .getParent ();
601- var callParamList = (BSLParser .CallParamListContext ) callParam .getParent ();
602- var doCall = (BSLParser .DoCallContext ) callParamList .getParent ();
603- var methodCall = isInsertMethod (doCall );
663+ var callParamOpt = getCallParam (expression );
664+ if (callParamOpt .isEmpty ()) {
665+ return false ;
666+ }
667+ var callParamListOpt = getCallParamList (callParamOpt .get ());
668+ if (callParamListOpt .isEmpty ()) {
669+ return false ;
670+ }
671+ var doCallOpt = getDoCall (callParamListOpt .get ());
672+ if (doCallOpt .isEmpty ()) {
673+ return false ;
674+ }
675+ var methodCall = isInsertMethod (doCallOpt .get ());
604676 if (methodCall == null ) {
605677 return false ;
606678 }
@@ -626,8 +698,11 @@ private static boolean isFirstParameterOfInsertMethod(BSLParser.ExpressionContex
626698 }
627699
628700 var callParamList = (BSLParser .CallParamListContext ) callParamInfo [2 ];
629- var doCall = (BSLParser .DoCallContext ) callParamList .getParent ();
630- return isInsertMethod (doCall ) != null ;
701+ var doCallOpt = getDoCall (callParamList );
702+ if (doCallOpt .isEmpty ()) {
703+ return false ;
704+ }
705+ return isInsertMethod (doCallOpt .get ()) != null ;
631706 }
632707
633708
0 commit comments