Skip to content

Commit bb29a3b

Browse files
committed
refactor(diagnostics): улучшить безопасность и читаемость кода в AbstractMagicValueDiagnostic
Добавлены методы для безопасного получения контекстов вызова и параметров, что упрощает логику проверки и уменьшает количество проверок на null. Обновлены существующие методы для использования новых вспомогательных функций, улучшая читаемость и поддерживаемость кода.
1 parent 99d638b commit bb29a3b

File tree

1 file changed

+98
-23
lines changed

1 file changed

+98
-23
lines changed

src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/AbstractMagicValueDiagnostic.java

Lines changed: 98 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)