diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnostic.java index f278de821f1..cb87952b4d9 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnostic.java @@ -124,12 +124,22 @@ private void checkColumnNode(SDBLParser.ColumnContext ctx, Set tableName String penultimateIdentifierName = penultimateChild.getText(); if (REF_PATTERN.matcher(penultimateIdentifierName).matches() + && !penultimateIdentifierParentIsTabularSection(ctx) || (REF_PATTERN.matcher(lastIdentifierName).matches() && !tableNames.contains(penultimateIdentifierName))) { diagnosticStorage.addDiagnostic(ctx); } } + private boolean penultimateIdentifierParentIsTabularSection(SDBLParser.ColumnContext ctx) { + var penultimateChildTable = ctx.getChild(0); + var penultimateChildTableName = penultimateChildTable.getText(); + + return this.dataSourceCollection.stream() + .filter(dataSource -> dataSource.getChild(0).getChildCount() > 2) + .anyMatch(dataSource -> dataSource.getChild(1).getChild(1).getText().matches(penultimateChildTableName)); + } + private static String getTableNameOrAlias(ParseTree dataSource) { return Optional.of(dataSource) .flatMap(dataSrc -> extractTextFromChild(dataSrc, SDBLParser.RULE_alias)) diff --git a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl index f19c74d0656..bee4001c524 100644 --- a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl +++ b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl @@ -179,10 +179,21 @@ | Контрагенты.Ссылка.ИНН = &ИНН"; // ошибка КонецПроцедуры -Процедура Тест17() +Процедура Тест16() ТекстЗапроса = "ВЫБРАТЬ | Артикул КАК Артикул // не задано имя таблицы |ИЗ | Справочник.Номенклатура КАК Номенклатура"; КонецПроцедуры + +Процедура Тест17() + ТекстЗапроса = + "ВЫБРАТЬ + | ДопРеквизиты.Свойство КАК Свойство + |ИЗ + | Справочник.Номенклатура.ДополнительныеРеквизиты КАК ДопРеквизиты + |ГДЕ + | НЕ ДопРеквизиты.Ссылка.ПометкаУдаления"; +КонецПроцедуры +