From 7cf2091c8b496844ddf226127c527fb0b2336093 Mon Sep 17 00:00:00 2001 From: Alexey Sosnoviy Date: Fri, 24 Jun 2022 08:58:37 +0300 Subject: [PATCH 01/26] =?UTF-8?q?refOverUse=20=D1=82=D0=B5=D1=81=D1=82=20?= =?UTF-8?q?=D1=81=20=D1=84=D0=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diagnostics/RefOveruseDiagnostic.bsl | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl index 0d15fde0ba0..bc504fddfc3 100644 --- a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl +++ b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl @@ -250,3 +250,18 @@ | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.УпаковкиНоменклатуры КАК УпаковкиНоменклатуры // спец.дубль имени, было падение анализа | ПО Истина"; // не ошибка КонецПроцедуры + +Процедура Тест23() + ТекстЗапроса = + "ВЫБРАТЬ + | СкладскиеЯчейки.Ссылка КАК Ячейка, + | СкладскиеЯчейки.Контейнер КАК Контейнер + |ИЗ + | РегистрСведений.ПериодичностьИнвентаризацииЗон КАК ПериодичностьИнвентаризацииЗон + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СкладскиеЯчейки КАК СкладскиеЯчейки + | ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗадачаПересчет КАК ЗадачаПересчет + | ПО СкладскиеЯчейки.Ссылка = ЗадачаПересчет.Ячейка + | ПО ПериодичностьИнвентаризацииЗон.Зона = СкладскиеЯчейки.СкладскаяЗона + |ГДЕ + | И ЗадачаПересчет.Ссылка ЕСТЬ NULL"; +КонецПроцедуры From 5a195a03651e850bd0d29fa7025f1190b4095862 Mon Sep 17 00:00:00 2001 From: Alexey Sosnoviy Date: Fri, 24 Jun 2022 09:43:41 +0300 Subject: [PATCH 02/26] =?UTF-8?q?refOverUse=20=D1=82=D0=B5=D1=81=D1=82=20?= =?UTF-8?q?=D1=81=20fp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diagnostics/RefOveruseDiagnostic.bsl | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl index bc504fddfc3..11e1c316f22 100644 --- a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl +++ b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl @@ -265,3 +265,22 @@ |ГДЕ | И ЗадачаПересчет.Ссылка ЕСТЬ NULL"; КонецПроцедуры + +Процедура Тест24() + +Запрос.Текст = "ВЫБРАТЬ + | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ усОстаткиТоваровОстатки.Контейнер) КАК Контейнер + |ИЗ + | РегистрНакопления.усОстаткиТоваров.Остатки( + | , + | Контейнер В + | (ВЫБРАТЬ РАЗЛИЧНЫЕ + | ЗадачаПеремещениеТовара.ТекущийКонтейнер КАК ТекущийКонтейнер + | ИЗ + | Документ.ЗадачаПеремещениеТовара КАК ЗадачаПеремещениеТовара + | ГДЕ + | ЗадачаПеремещениеТовара.Ссылка В (&МассивЗадач) + | ) КАК усОстаткиТоваровОстатки + |"; + +КонецПроцедуры From b43f436c369f68920a12f5e6fe66ffce9dba0441 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Fri, 24 Jun 2022 16:06:01 +0300 Subject: [PATCH 03/26] =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D1=8B=D0=B5=20=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D0=BE=D0=B4=D1=8B=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - findAllTopLevelRuleNodes - доп.метод findAllRuleNodes с коллекцией --- .../bsl/languageserver/utils/Trees.java | 60 +++++++++++++++++-- 1 file changed, 54 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/Trees.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/Trees.java index 5b430da8268..16aaf368256 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/Trees.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/Trees.java @@ -360,21 +360,69 @@ private static Stream getChildrenStream(Tree t, Integer[] /** * Получает дочерние ноды с нужными типами + * + * @param t - начальный узел дерева + * @param index - массив индексов + * @return найденные узлы */ public static Collection findAllRuleNodes(ParseTree t, Integer... index) { - List nodes = new ArrayList<>(); - List indexes = Arrays.asList(index); + return findAllRuleNodes(t, Arrays.asList(index)); + } + + /** + * Получает дочерние ноды с нужными типами + * + * @param t - начальный узел дерева + * @param indexes - коллекция индексов + * @return найденные узлы + */ + public static Collection findAllRuleNodes(ParseTree t, Collection indexes) { + List result = new ArrayList<>(); if (t instanceof ParserRuleContext && indexes.contains(((ParserRuleContext) t).getRuleIndex())) { - nodes.add((ParserRuleContext) t); + result.add((ParserRuleContext) t); } IntStream.range(0, t.getChildCount()) - .mapToObj(i -> findAllRuleNodes(t.getChild(i), index)) - .forEachOrdered(nodes::addAll); + .mapToObj(i -> findAllRuleNodes(t.getChild(i), indexes)) + .forEachOrdered(result::addAll); - return nodes; + return result; + } + + /** + * Получает "первые" дочерние ноды с нужными типами + * ВАЖНО: поиск вглубь найденной ноды с нужными индексом не выполняется + * Например, если указать RULE_codeBlock, то найдется только первый код блока, все вложенные найдены не будут + * ВАЖНО: начальная нода не проверяется на условие, т.к. тогда она единственная и вернется в результате + * + * @param t - начальный узел дерева + * @param indexes - коллекция индексов + * @return найденные узлы + */ + public static Collection findAllTopLevelRuleNodes(ParserRuleContext t, Collection indexes) { + var result = new ArrayList(); + + t.children.stream() + .map(node -> findAllTopLevelRuleNodesInner(node, indexes)) + .forEachOrdered(result::addAll); + + return result; + } + + private static Collection findAllTopLevelRuleNodesInner(ParseTree t, Collection indexes) { + if (t instanceof ParserRuleContext + && indexes.contains(((ParserRuleContext) t).getRuleIndex())) { + return List.of((ParserRuleContext) t); + } + + List result = new ArrayList<>(); + IntStream.range(0, t.getChildCount()) + .mapToObj(i -> findAllTopLevelRuleNodesInner(t.getChild(i), indexes)) + .forEachOrdered(result::addAll); + + return result; } /** From b88f851ef2fbacb2f5ee95df4a7763ade73814f5 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Fri, 24 Jun 2022 16:06:36 +0300 Subject: [PATCH 04/26] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20FP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit исключаю вложенные запросы --- .../diagnostics/RefOveruseDiagnostic.java | 60 ++++++++++++++----- .../diagnostics/RefOveruseDiagnostic.bsl | 56 ++++++++--------- 2 files changed, 73 insertions(+), 43 deletions(-) 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 21422768b32..e0b70ad56a5 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 @@ -29,15 +29,20 @@ import com.github._1c_syntax.bsl.languageserver.utils.Trees; import com.github._1c_syntax.bsl.parser.BSLParserRuleContext; import com.github._1c_syntax.bsl.parser.SDBLParser; +import com.github._1c_syntax.bsl.parser.SDBLParser.DataSourceContext; import com.github._1c_syntax.utils.CaseInsensitivePattern; +import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.tree.ParseTree; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -57,6 +62,7 @@ public class RefOveruseDiagnostic extends AbstractSDBLVisitorDiagnostic { private static final Pattern REF_PATTERN = CaseInsensitivePattern.compile("Ссылка|Reference"); private static final int BAD_CHILD_COUNT = 3; private static final int COUNT_OF_TABLE_DOT_REF_DOT_REF = 5; + public static final Set RULE_COLUMNS = Set.of(SDBLParser.RULE_column, SDBLParser.RULE_query); private Map dataSourcesWithTabularFlag = Collections.emptyMap(); @Override @@ -66,18 +72,20 @@ public ParseTree visitQuery(SDBLParser.QueryContext ctx) { } private Stream checkQuery(SDBLParser.QueryContext ctx) { - var columnsCollection = Trees.findAllRuleNodes(ctx, SDBLParser.RULE_column); + var columns = Trees.findAllTopLevelRuleNodes(ctx, RULE_COLUMNS).stream() + .filter(parserRuleContext -> parserRuleContext.getRuleIndex() == SDBLParser.RULE_column) + .collect(Collectors.toList()); - if (columnsCollection.isEmpty()) { + if (columns.isEmpty()) { return Stream.empty(); } dataSourcesWithTabularFlag = dataSourcesWithTabularSection(ctx); if (dataSourcesWithTabularFlag.isEmpty()) { - return getSimpleOverused(columnsCollection); + return getSimpleOverused(columns); } - return getOverused(columnsCollection); + return getOverused(columns); } private static Map dataSourcesWithTabularSection(SDBLParser.QueryContext ctx) { @@ -89,7 +97,7 @@ private static Map dataSourcesWithTabularSection(SDBLParser.Que HashMap::new)); } - private static Stream findAllDataSourceWithoutInnerQueries( + private static Stream findAllDataSourceWithoutInnerQueries( SDBLParser.QueryContext ctx) { if (ctx.from == null){ return Stream.empty(); @@ -97,28 +105,50 @@ private static Stream findAllDataSourceW return Stream.concat( ctx.from.dataSource().stream(), ctx.from.dataSource().stream() - .flatMap(dataSourceContext -> dataSourceContext.joinPart().stream()) - .map(SDBLParser.JoinPartContext::dataSource) - .filter(Objects::nonNull) + .flatMap(dataSourceContext -> getInnerDataSource(dataSourceContext).stream()) +// .flatMap(dataSourceContext -> dataSourceContext.joinPart().stream()) +// .map(SDBLParser.JoinPartContext::dataSource) +// .filter(Objects::nonNull) ); } - private static String getTableNameOrAlias(SDBLParser.DataSourceContext dataSource) { + private static Collection getInnerDataSource(DataSourceContext dataSourceContext) { + var result = new ArrayList(); + Optional.ofNullable(dataSourceContext.dataSource()) + .map(RefOveruseDiagnostic::getInnerDataSource) + .ifPresent(result::addAll); + + var joinDataSources = dataSourceContext.joinPart().stream() + .map(SDBLParser.JoinPartContext::dataSource) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + result.addAll(joinDataSources); + + var dataSourcesFromJoins = joinDataSources.stream() + .flatMap(dataSourceContext1 -> getInnerDataSource(dataSourceContext1).stream()) + .collect(Collectors.toList()); + + result.addAll(dataSourcesFromJoins); + return result; + } + + + private static String getTableNameOrAlias(DataSourceContext dataSource) { final var value = Optional.of(dataSource); return value - .map(SDBLParser.DataSourceContext::alias) + .map(DataSourceContext::alias) .map(alias -> (ParseTree)alias.name) .or(() -> value - .map(SDBLParser.DataSourceContext::table) + .map(DataSourceContext::table) .map(tableContext -> (ParseTree)tableContext.tableName)) .or(() -> value - .map(SDBLParser.DataSourceContext::parameterTable) + .map(DataSourceContext::parameterTable) .map(tableContext -> (ParseTree)tableContext.parameter())) .map(ParseTree::getText) .orElse(""); } - private static boolean isTableWithTabularSection(SDBLParser.DataSourceContext dataSourceContext) { + private static boolean isTableWithTabularSection(DataSourceContext dataSourceContext) { final var table = dataSourceContext.table(); if (table == null) { return dataSourceContext.virtualTable() != null; @@ -126,7 +156,7 @@ private static boolean isTableWithTabularSection(SDBLParser.DataSourceContext da return table.tableName != null || table.objectTableName != null; } - private static Stream getSimpleOverused(Collection columnsCollection) { + private static Stream getSimpleOverused(List columnsCollection) { return columnsCollection.stream() .filter(columnNode -> columnNode.getChildCount() > BAD_CHILD_COUNT) .map(column -> column.getChild(column.getChildCount() - 1)) @@ -134,7 +164,7 @@ private static Stream getSimpleOverused(Collection getOverused(Collection columnsCollection) { + private Stream getOverused(List columnsCollection) { return columnsCollection.stream() .map(SDBLParser.ColumnContext.class::cast) .filter(column -> column.getChildCount() >= BAD_CHILD_COUNT) diff --git a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl index 11e1c316f22..273e196bd2a 100644 --- a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl +++ b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl @@ -252,35 +252,35 @@ КонецПроцедуры Процедура Тест23() - ТекстЗапроса = - "ВЫБРАТЬ - | СкладскиеЯчейки.Ссылка КАК Ячейка, - | СкладскиеЯчейки.Контейнер КАК Контейнер - |ИЗ - | РегистрСведений.ПериодичностьИнвентаризацииЗон КАК ПериодичностьИнвентаризацииЗон - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СкладскиеЯчейки КАК СкладскиеЯчейки - | ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗадачаПересчет КАК ЗадачаПересчет - | ПО СкладскиеЯчейки.Ссылка = ЗадачаПересчет.Ячейка - | ПО ПериодичностьИнвентаризацииЗон.Зона = СкладскиеЯчейки.СкладскаяЗона - |ГДЕ - | И ЗадачаПересчет.Ссылка ЕСТЬ NULL"; + ТекстЗапроса = + "ВЫБРАТЬ + | СкладскиеЯчейки.Ссылка КАК Ячейка, + | СкладскиеЯчейки.Контейнер КАК Контейнер + |ИЗ + | РегистрСведений.ПериодичностьИнвентаризацииЗон КАК ПериодичностьИнвентаризацииЗон + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СкладскиеЯчейки КАК СкладскиеЯчейки + | ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗадачаПересчет КАК ЗадачаПересчет + | ПО СкладскиеЯчейки.Ссылка = ЗадачаПересчет.Ячейка + | ПО ПериодичностьИнвентаризацииЗон.Зона = СкладскиеЯчейки.СкладскаяЗона + |ГДЕ + | ЗадачаПересчет.Ссылка ЕСТЬ NULL"; КонецПроцедуры Процедура Тест24() - -Запрос.Текст = "ВЫБРАТЬ - | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ усОстаткиТоваровОстатки.Контейнер) КАК Контейнер - |ИЗ - | РегистрНакопления.усОстаткиТоваров.Остатки( - | , - | Контейнер В - | (ВЫБРАТЬ РАЗЛИЧНЫЕ - | ЗадачаПеремещениеТовара.ТекущийКонтейнер КАК ТекущийКонтейнер - | ИЗ - | Документ.ЗадачаПеремещениеТовара КАК ЗадачаПеремещениеТовара - | ГДЕ - | ЗадачаПеремещениеТовара.Ссылка В (&МассивЗадач) - | ) КАК усОстаткиТоваровОстатки - |"; - + Запрос.Текст = + "ВЫБРАТЬ + | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ усОстаткиТоваровОстатки.Контейнер) КАК Контейнер + |ИЗ + | РегистрНакопления.усОстаткиТоваров.Остатки( + | , + | Контейнер В + | (ВЫБРАТЬ РАЗЛИЧНЫЕ + | ЗадачаПеремещениеТовара.ТекущийКонтейнер КАК ТекущийКонтейнер + | ИЗ + | Документ.ЗадачаПеремещениеТовара КАК ЗадачаПеремещениеТовара + | ГДЕ + | ЗадачаПеремещениеТовара.Ссылка В (&МассивЗадач) // не ошибка + | ) + | ) КАК усОстаткиТоваровОстатки + |"; КонецПроцедуры From 7bbdff9a935743d1632d1c5961f06e967d4a5c3e Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Fri, 24 Jun 2022 16:55:24 +0300 Subject: [PATCH 05/26] =?UTF-8?q?=D1=83=D1=82=D0=BE=D1=87=D0=BD=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=BA=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/github/_1c_syntax/bsl/languageserver/utils/Trees.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/Trees.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/Trees.java index 16aaf368256..0ca86d46ccb 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/Trees.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/Trees.java @@ -393,8 +393,8 @@ public static Collection findAllRuleNodes(ParseTree t, Collec /** * Получает "первые" дочерние ноды с нужными типами - * ВАЖНО: поиск вглубь найденной ноды с нужными индексом не выполняется - * Например, если указать RULE_codeBlock, то найдется только первый код блока, все вложенные найдены не будут + * ВАЖНО: поиск вглубь найденной ноды с нужными индексами не выполняется + * Например, если указать RULE_codeBlock, то найдется только самый верхнеуровневый блок кода, все вложенные найдены не будут * ВАЖНО: начальная нода не проверяется на условие, т.к. тогда она единственная и вернется в результате * * @param t - начальный узел дерева From fd1a831b1652a4a5d15b514e0ff2f71a94249278 Mon Sep 17 00:00:00 2001 From: Alexey Sosnoviy Date: Fri, 24 Jun 2022 17:25:00 +0300 Subject: [PATCH 06/26] =?UTF-8?q?refOverUse=20Fn=20=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diagnostics/RefOveruseDiagnosticTest.java | 2 +- .../diagnostics/RefOveruseDiagnostic.bsl | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java index 86dc114c122..7b3c40a5234 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java @@ -54,6 +54,6 @@ void test() { .hasRange(216, 13, 37) .hasRange(226, 13, 37) .hasRange(238, 13, 38) - .hasSize(15); + .hasSize(17); } } diff --git a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl index 273e196bd2a..4893f4e23ec 100644 --- a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl +++ b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl @@ -284,3 +284,23 @@ | ) КАК усОстаткиТоваровОстатки |"; КонецПроцедуры + +Процедура Тест25() + Запрос.Текст = + "ВЫБРАТЬ + | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ усОстаткиТоваровОстатки.Контейнер) КАК Контейнер + |ИЗ + | РегистрНакопления.усОстаткиТоваров.Остатки( + | , + | Контейнер В + | (ВЫБРАТЬ РАЗЛИЧНЫЕ + | ЗадачаПеремещениеТовара.ТекущийКонтейнер.Ссылка КАК ТекущийКонтейнер // ошибка + | ИЗ + | Документ.ЗадачаПеремещениеТовара КАК ЗадачаПеремещениеТовара + | ГДЕ + | ЗадачаПеремещениеТовара.Ссылка.Ссылка В (&МассивЗадач) // ошибка + | ) + | ) КАК усОстаткиТоваровОстатки + |"; +КонецПроцедуры + From d1e3bd10d4e140a55c0bd34c2b7fdbd756e9084f Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Fri, 24 Jun 2022 19:39:26 +0300 Subject: [PATCH 07/26] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=BF=D1=83=D1=81?= =?UTF-8?q?=D0=BA=D0=B0=D0=BB=D0=B8=D1=81=D1=8C=20=D0=B2=D0=BB=D0=BE=D0=B6?= =?UTF-8?q?=D0=B5=D0=BD=D0=BD=D1=8B=D0=B5=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D1=81=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diagnostics/RefOveruseDiagnostic.java | 2 +- .../diagnostics/RefOveruseDiagnosticTest.java | 3 + .../diagnostics/RefOveruseDiagnostic.bsl | 67 +++++++++---------- 3 files changed, 37 insertions(+), 35 deletions(-) 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 e0b70ad56a5..d0ad9c13e19 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 @@ -68,7 +68,7 @@ public class RefOveruseDiagnostic extends AbstractSDBLVisitorDiagnostic { @Override public ParseTree visitQuery(SDBLParser.QueryContext ctx) { checkQuery(ctx).forEach(diagnosticStorage::addDiagnostic); - return ctx; + return super.visitQuery(ctx); } private Stream checkQuery(SDBLParser.QueryContext ctx) { diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java index 7b3c40a5234..2468c3f4d8c 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java @@ -48,12 +48,15 @@ void test() { .hasRange(56, 37, 56, 43) .hasRange(57, 42, 57, 48) .hasRange(92, 8, 29) +// .hasRange(136, 54, 75) // TODO не ошибка .hasRange(153, 13, 153, 41) .hasRange(164, 13, 164, 53) .hasRange(178, 13, 178, 35) .hasRange(216, 13, 37) .hasRange(226, 13, 37) .hasRange(238, 13, 38) + .hasRange(296, 33, 80) + .hasRange(300, 33, 70) .hasSize(17); } } diff --git a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl index 4893f4e23ec..6bcabdbd8a2 100644 --- a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl +++ b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl @@ -242,7 +242,7 @@ Процедура Тест22() ТекстЗапроса = "ВЫБРАТЬ - | УпаковкиНоменклатуры.Ссылка КАК Упаковка + | УпаковкиНоменклатуры.Ссылка КАК Упаковка |ИЗ | ТоварыКОтгрузке КАК ТоварыКОтгрузке | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.УпаковкиНоменклатуры КАК УпаковкиНоменклатуры @@ -254,53 +254,52 @@ Процедура Тест23() ТекстЗапроса = "ВЫБРАТЬ - | СкладскиеЯчейки.Ссылка КАК Ячейка, - | СкладскиеЯчейки.Контейнер КАК Контейнер + | СкладскиеЯчейки.Ссылка КАК Ячейка, + | СкладскиеЯчейки.Контейнер КАК Контейнер |ИЗ - | РегистрСведений.ПериодичностьИнвентаризацииЗон КАК ПериодичностьИнвентаризацииЗон - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СкладскиеЯчейки КАК СкладскиеЯчейки - | ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗадачаПересчет КАК ЗадачаПересчет - | ПО СкладскиеЯчейки.Ссылка = ЗадачаПересчет.Ячейка - | ПО ПериодичностьИнвентаризацииЗон.Зона = СкладскиеЯчейки.СкладскаяЗона + | РегистрСведений.ПериодичностьИнвентаризацииЗон КАК ПериодичностьИнвентаризацииЗон + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СкладскиеЯчейки КАК СкладскиеЯчейки + | ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗадачаПересчет КАК ЗадачаПересчет + | ПО СкладскиеЯчейки.Ссылка = ЗадачаПересчет.Ячейка + | ПО ПериодичностьИнвентаризацииЗон.Зона = СкладскиеЯчейки.СкладскаяЗона |ГДЕ - | ЗадачаПересчет.Ссылка ЕСТЬ NULL"; + | ЗадачаПересчет.Ссылка ЕСТЬ NULL"; КонецПроцедуры Процедура Тест24() Запрос.Текст = "ВЫБРАТЬ - | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ усОстаткиТоваровОстатки.Контейнер) КАК Контейнер + | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ усОстаткиТоваровОстатки.Контейнер) КАК Контейнер |ИЗ - | РегистрНакопления.усОстаткиТоваров.Остатки( - | , - | Контейнер В - | (ВЫБРАТЬ РАЗЛИЧНЫЕ - | ЗадачаПеремещениеТовара.ТекущийКонтейнер КАК ТекущийКонтейнер - | ИЗ - | Документ.ЗадачаПеремещениеТовара КАК ЗадачаПеремещениеТовара - | ГДЕ - | ЗадачаПеремещениеТовара.Ссылка В (&МассивЗадач) // не ошибка - | ) - | ) КАК усОстаткиТоваровОстатки + | РегистрНакопления.усОстаткиТоваров.Остатки( + | , + | Контейнер В + | (ВЫБРАТЬ РАЗЛИЧНЫЕ + | ЗадачаПеремещениеТовара.ТекущийКонтейнер КАК ТекущийКонтейнер + | ИЗ + | Документ.ЗадачаПеремещениеТовара КАК ЗадачаПеремещениеТовара + | ГДЕ + | ЗадачаПеремещениеТовара.Ссылка В (&МассивЗадач) // не ошибка + | ) + | ) КАК усОстаткиТоваровОстатки |"; КонецПроцедуры Процедура Тест25() Запрос.Текст = "ВЫБРАТЬ - | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ усОстаткиТоваровОстатки.Контейнер) КАК Контейнер + | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ усОстаткиТоваровОстатки.Контейнер) КАК Контейнер |ИЗ - | РегистрНакопления.усОстаткиТоваров.Остатки( - | , - | Контейнер В - | (ВЫБРАТЬ РАЗЛИЧНЫЕ - | ЗадачаПеремещениеТовара.ТекущийКонтейнер.Ссылка КАК ТекущийКонтейнер // ошибка - | ИЗ - | Документ.ЗадачаПеремещениеТовара КАК ЗадачаПеремещениеТовара - | ГДЕ - | ЗадачаПеремещениеТовара.Ссылка.Ссылка В (&МассивЗадач) // ошибка - | ) - | ) КАК усОстаткиТоваровОстатки + | РегистрНакопления.усОстаткиТоваров.Остатки( + | , + | Контейнер В + | (ВЫБРАТЬ РАЗЛИЧНЫЕ + | ЗадачаПеремещениеТовара.ТекущийКонтейнер.Ссылка КАК ТекущийКонтейнер // ошибка + | ИЗ + | Документ.ЗадачаПеремещениеТовара КАК ЗадачаПеремещениеТовара + | ГДЕ + | ЗадачаПеремещениеТовара.Ссылка.Ссылка В (&МассивЗадач) // ошибка + | ) + | ) КАК усОстаткиТоваровОстатки |"; КонецПроцедуры - From 28bc2da803eca74049dd07bbd037443cf78c2311 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Fri, 24 Jun 2022 21:36:22 +0300 Subject: [PATCH 08/26] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=B5=D1=89=D0=B5=20=D0=BD=D0=B5=D0=B1=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D1=88=D0=BE=D0=B5=20=D0=A4=D0=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diagnostics/RefOveruseDiagnostic.java | 14 ++++++-------- .../diagnostics/RefOveruseDiagnosticTest.java | 1 - .../resources/diagnostics/RefOveruseDiagnostic.bsl | 2 +- 3 files changed, 7 insertions(+), 10 deletions(-) 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 d0ad9c13e19..1693c98050e 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 @@ -106,9 +106,6 @@ private static Stream findAllDataSourceWithoutInner ctx.from.dataSource().stream(), ctx.from.dataSource().stream() .flatMap(dataSourceContext -> getInnerDataSource(dataSourceContext).stream()) -// .flatMap(dataSourceContext -> dataSourceContext.joinPart().stream()) -// .map(SDBLParser.JoinPartContext::dataSource) -// .filter(Objects::nonNull) ); } @@ -190,7 +187,7 @@ private boolean isOveruse(SDBLParser.ColumnContext ctx) { // that is why -3 must be an index of penultimate identifier var penultimateChild = ctx.getChild(childCount - BAD_CHILD_COUNT); - String penultimateIdentifierName = penultimateChild.getText(); + var penultimateIdentifierName = penultimateChild.getText(); if (REF_PATTERN.matcher(penultimateIdentifierName).matches()) { if (childCount < COUNT_OF_TABLE_DOT_REF_DOT_REF){ @@ -199,10 +196,11 @@ private boolean isOveruse(SDBLParser.ColumnContext ctx) { var prevChildID = ctx.getChild(childCount - COUNT_OF_TABLE_DOT_REF_DOT_REF).getText(); return !dataSourcesWithTabularFlag.getOrDefault(prevChildID, false); } - var lastChild = ctx.getChild(childCount - 1); - String lastIdentifierName = lastChild.getText(); - if (REF_PATTERN.matcher(lastIdentifierName).matches()) { - return dataSourcesWithTabularFlag.get(penultimateIdentifierName) == null; + if (childCount > BAD_CHILD_COUNT) { + var lastIdentifierName = ctx.getChild(childCount - 1).getText(); + if (REF_PATTERN.matcher(lastIdentifierName).matches()) { + return dataSourcesWithTabularFlag.get(penultimateIdentifierName) == null; + } } return false; } diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java index 2468c3f4d8c..e28692a147f 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java @@ -48,7 +48,6 @@ void test() { .hasRange(56, 37, 56, 43) .hasRange(57, 42, 57, 48) .hasRange(92, 8, 29) -// .hasRange(136, 54, 75) // TODO не ошибка .hasRange(153, 13, 153, 41) .hasRange(164, 13, 164, 53) .hasRange(178, 13, 178, 35) diff --git a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl index 6bcabdbd8a2..f0a57d6450d 100644 --- a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl +++ b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl @@ -98,7 +98,7 @@ Процедура Тест11() Запрос = Новый Запрос; -ТекстЗапроса = + ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ | ТаблицаКонтактнаяИнформация.АдресЭП КАК Адрес, | ТаблицаКонтакт.Ссылка КАК Контакт From aa7d88e527611b6a072a14cb1e1583cd4d2d89a5 Mon Sep 17 00:00:00 2001 From: Alexey Sosnoviy Date: Fri, 24 Jun 2022 22:22:05 +0300 Subject: [PATCH 09/26] refOfuse fn test --- src/test/resources/diagnostics/RefOveruseDiagnostic.bsl | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl index f0a57d6450d..dbdf642340b 100644 --- a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl +++ b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl @@ -303,3 +303,11 @@ | ) КАК усОстаткиТоваровОстатки |"; КонецПроцедуры + +Процедура Тест26() + Запрос.Текст = + "ВЫБРАТЬ + | Звеньевой.Ссылка // ошибка + |ИЗ + | РегистрСведений.Звеньевые"; +КонецПроцедуры From e7586a1ae7ba49007a4ef3244330a0b378a92af9 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sat, 25 Jun 2022 13:48:34 +0300 Subject: [PATCH 10/26] =?UTF-8?q?=D1=83=D1=87=D0=B8=D1=82=D1=8B=D0=B2?= =?UTF-8?q?=D0=B0=D1=8E=D1=82=D1=81=D1=8F=20=D0=BF=D0=BE=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=B1=D0=B5=D0=B7=20=D0=BF=D1=81=D0=B5=D0=B2=D0=B4=D0=BE=D0=BD?= =?UTF-8?q?=D0=B8=D0=BC=D0=BE=D0=B2=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit правильно учитываются внешние таблицы --- .../diagnostics/RefOveruseDiagnostic.java | 41 +++++++++++++++---- .../diagnostics/RefOveruseDiagnosticTest.java | 3 +- .../diagnostics/RefOveruseDiagnostic.bsl | 4 +- 3 files changed, 37 insertions(+), 11 deletions(-) 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 1693c98050e..e20cee6ed84 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 @@ -26,6 +26,7 @@ import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticSeverity; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticTag; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticType; +import com.github._1c_syntax.bsl.languageserver.utils.Ranges; import com.github._1c_syntax.bsl.languageserver.utils.Trees; import com.github._1c_syntax.bsl.parser.BSLParserRuleContext; import com.github._1c_syntax.bsl.parser.SDBLParser; @@ -33,7 +34,9 @@ import com.github._1c_syntax.utils.CaseInsensitivePattern; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.tree.ParseTree; +import org.eclipse.lsp4j.Range; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -62,8 +65,19 @@ public class RefOveruseDiagnostic extends AbstractSDBLVisitorDiagnostic { private static final Pattern REF_PATTERN = CaseInsensitivePattern.compile("Ссылка|Reference"); private static final int BAD_CHILD_COUNT = 3; private static final int COUNT_OF_TABLE_DOT_REF_DOT_REF = 5; - public static final Set RULE_COLUMNS = Set.of(SDBLParser.RULE_column, SDBLParser.RULE_query); + private static final Set RULE_COLUMNS = Set.of(SDBLParser.RULE_column, SDBLParser.RULE_query); private Map dataSourcesWithTabularFlag = Collections.emptyMap(); + private Map prevDataSourcesWithTabularFlag = Collections.emptyMap(); + @Nullable private Range prevQueryRange; + + @Override + public ParseTree visitQueryPackage(SDBLParser.QueryPackageContext ctx) { + var result = super.visitQueryPackage(ctx); + prevQueryRange = null; + prevDataSourcesWithTabularFlag = Collections.emptyMap(); + dataSourcesWithTabularFlag = Collections.emptyMap(); + return result; + } @Override public ParseTree visitQuery(SDBLParser.QueryContext ctx) { @@ -88,13 +102,26 @@ private Stream checkQuery(SDBLParser.QueryContext ctx) { return getOverused(columns); } - private static Map dataSourcesWithTabularSection(SDBLParser.QueryContext ctx) { - return findAllDataSourceWithoutInnerQueries(ctx) + private Map dataSourcesWithTabularSection(SDBLParser.QueryContext ctx) { + var newResult = findAllDataSourceWithoutInnerQueries(ctx) .collect(Collectors.toMap( RefOveruseDiagnostic::getTableNameOrAlias, RefOveruseDiagnostic::isTableWithTabularSection, (existing, replacement) -> existing, HashMap::new)); + + var queryRange = Ranges.create(ctx); + + final Map result; + if (prevQueryRange == null || !Ranges.containsRange(prevQueryRange, queryRange)){ + result = newResult; + prevDataSourcesWithTabularFlag = result; + prevQueryRange = queryRange; + } else { + result = new HashMap<>(newResult); + result.putAll(prevDataSourcesWithTabularFlag); + } + return result; } private static Stream findAllDataSourceWithoutInnerQueries( @@ -196,11 +223,9 @@ private boolean isOveruse(SDBLParser.ColumnContext ctx) { var prevChildID = ctx.getChild(childCount - COUNT_OF_TABLE_DOT_REF_DOT_REF).getText(); return !dataSourcesWithTabularFlag.getOrDefault(prevChildID, false); } - if (childCount > BAD_CHILD_COUNT) { - var lastIdentifierName = ctx.getChild(childCount - 1).getText(); - if (REF_PATTERN.matcher(lastIdentifierName).matches()) { - return dataSourcesWithTabularFlag.get(penultimateIdentifierName) == null; - } + var lastIdentifierName = ctx.getChild(childCount - 1).getText(); + if (REF_PATTERN.matcher(lastIdentifierName).matches()) { + return dataSourcesWithTabularFlag.get(penultimateIdentifierName) == null; } return false; } diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java index e28692a147f..139fcbd84b7 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java @@ -56,6 +56,7 @@ void test() { .hasRange(238, 13, 38) .hasRange(296, 33, 80) .hasRange(300, 33, 70) - .hasSize(17); + .hasRange(309, 12, 28) + .hasSize(18); } } diff --git a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl index dbdf642340b..430fb437c98 100644 --- a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl +++ b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl @@ -307,7 +307,7 @@ Процедура Тест26() Запрос.Текст = "ВЫБРАТЬ - | Звеньевой.Ссылка // ошибка + | Звеньевой.Ссылка // ошибка, обращение к реквизиту без псевдонима таблицы |ИЗ - | РегистрСведений.Звеньевые"; + | РегистрСведений.Звеньевые"; КонецПроцедуры From b171d5fd8ab06f580b1f0ceb9c9fa22b06f5889b Mon Sep 17 00:00:00 2001 From: Alexey Sosnoviy Date: Mon, 27 Jun 2022 12:57:51 +0300 Subject: [PATCH 11/26] refOverUse fp test --- .../diagnostics/RefOveruseDiagnostic.bsl | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl index 430fb437c98..4b2d7ba84a0 100644 --- a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl +++ b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl @@ -311,3 +311,25 @@ |ИЗ | РегистрСведений.Звеньевые"; КонецПроцедуры + +Процедура Тест25() + Запрос.Текст = + "ВЫБРАТЬ + | Склады.Ссылка КАК Ссылка + |ИЗ + | Справочник.Склады КАК Склады + |ГДЕ + | Склады.Родитель В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | Склады.Родитель КАК Склад + | ИЗ + | Справочник.СтруктураПредприятия КАК СтруктураПредприятия + | ГДЕ + | СтруктураПредприятия.Ссылка В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | Справочник.Пользователи.ТекущееПодразделение + | ИЗ + | Справочник.Пользователи + | ГДЕ + | Справочник.Пользователи.Ссылка = &Пользователь))"; +КонецПроцедуры From 9a6bdd1e2713c0eee6f7ce9ac99d5c2192fd4fe7 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Mon, 27 Jun 2022 21:42:26 +0300 Subject: [PATCH 12/26] =?UTF-8?q?FP=20=D0=BF=D0=BE=D0=BB=D0=BD=D0=BE=D0=B5?= =?UTF-8?q?=20=D0=B8=D0=BC=D1=8F=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86?= =?UTF-8?q?=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diagnostics/RefOveruseDiagnostic.java | 38 +++++++++++++++++-- .../diagnostics/RefOveruseDiagnostic.bsl | 26 ++++--------- 2 files changed, 41 insertions(+), 23 deletions(-) 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 e20cee6ed84..1377bf120b6 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 @@ -66,6 +66,25 @@ public class RefOveruseDiagnostic extends AbstractSDBLVisitorDiagnostic { private static final int BAD_CHILD_COUNT = 3; private static final int COUNT_OF_TABLE_DOT_REF_DOT_REF = 5; private static final Set RULE_COLUMNS = Set.of(SDBLParser.RULE_column, SDBLParser.RULE_query); + private static final Set METADATA_TYPES = Set.of( + SDBLParser.BUSINESS_PROCESS_TYPE, + SDBLParser.CATALOG_TYPE, + SDBLParser.DOCUMENT_TYPE, + SDBLParser.INFORMATION_REGISTER_TYPE, + SDBLParser.CONSTANT_TYPE, + SDBLParser.FILTER_CRITERION_TYPE, + SDBLParser.EXCHANGE_PLAN_TYPE, + SDBLParser.SEQUENCE_TYPE, + SDBLParser.DOCUMENT_JOURNAL_TYPE, + SDBLParser.ENUM_TYPE, + SDBLParser.CHART_OF_CHARACTERISTIC_TYPES_TYPE, + SDBLParser.CHART_OF_ACCOUNTS_TYPE, + SDBLParser.CHART_OF_CALCULATION_TYPES_TYPE, + SDBLParser.ACCUMULATION_REGISTER_TYPE, + SDBLParser.ACCOUNTING_REGISTER_TYPE, + SDBLParser.CALCULATION_REGISTER_TYPE, + SDBLParser.TASK_TYPE, + SDBLParser.EXTERNAL_DATA_SOURCE_TYPE); private Map dataSourcesWithTabularFlag = Collections.emptyMap(); private Map prevDataSourcesWithTabularFlag = Collections.emptyMap(); @Nullable private Range prevQueryRange; @@ -208,11 +227,12 @@ private boolean isOveruse(SDBLParser.ColumnContext ctx) { // ^ ^ ^ // 0 1 2 - final int childCount = ctx.children.size(); + var children = extractFirstMetadataTypeName(ctx); + final int childCount = children.size(); // dots are also children of ColumnContext, // that is why -3 must be an index of penultimate identifier - var penultimateChild = ctx.getChild(childCount - BAD_CHILD_COUNT); + var penultimateChild = children.get(childCount - BAD_CHILD_COUNT); var penultimateIdentifierName = penultimateChild.getText(); @@ -220,13 +240,23 @@ private boolean isOveruse(SDBLParser.ColumnContext ctx) { if (childCount < COUNT_OF_TABLE_DOT_REF_DOT_REF){ return true; } - var prevChildID = ctx.getChild(childCount - COUNT_OF_TABLE_DOT_REF_DOT_REF).getText(); + var prevChildID = children.get(childCount - COUNT_OF_TABLE_DOT_REF_DOT_REF).getText(); return !dataSourcesWithTabularFlag.getOrDefault(prevChildID, false); } - var lastIdentifierName = ctx.getChild(childCount - 1).getText(); + var lastIdentifierName = children.get(childCount - 1).getText(); if (REF_PATTERN.matcher(lastIdentifierName).matches()) { return dataSourcesWithTabularFlag.get(penultimateIdentifierName) == null; } return false; } + + private static List extractFirstMetadataTypeName(SDBLParser.ColumnContext ctx) { + final var mdoName = ctx.mdoName; + final var children = ctx.children; + if (mdoName == null || children.size() < COUNT_OF_TABLE_DOT_REF_DOT_REF + || !METADATA_TYPES.contains(ctx.mdoName.getStart().getType())){ + return children; + } + return children.subList(1, children.size() - 1); + } } diff --git a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl index 4b2d7ba84a0..e569c260952 100644 --- a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl +++ b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl @@ -312,24 +312,12 @@ | РегистрСведений.Звеньевые"; КонецПроцедуры -Процедура Тест25() +Процедура Тест28() Запрос.Текст = - "ВЫБРАТЬ - | Склады.Ссылка КАК Ссылка - |ИЗ - | Справочник.Склады КАК Склады - |ГДЕ - | Склады.Родитель В - | (ВЫБРАТЬ ПЕРВЫЕ 1 - | Склады.Родитель КАК Склад - | ИЗ - | Справочник.СтруктураПредприятия КАК СтруктураПредприятия - | ГДЕ - | СтруктураПредприятия.Ссылка В - | (ВЫБРАТЬ ПЕРВЫЕ 1 - | Справочник.Пользователи.ТекущееПодразделение - | ИЗ - | Справочник.Пользователи - | ГДЕ - | Справочник.Пользователи.Ссылка = &Пользователь))"; + "ВЫБРАТЬ ПЕРВЫЕ 1 + | Справочник.Пользователи.ТекущееПодразделение + |ИЗ + | Справочник.Пользователи + |ГДЕ + | Справочник.Пользователи.Ссылка = &Пользователь"; КонецПроцедуры From fc91b7fbc8a2d683e7f97a01a1269b91ccf79546 Mon Sep 17 00:00:00 2001 From: Alexey Sosnoviy Date: Tue, 28 Jun 2022 08:48:49 +0300 Subject: [PATCH 13/26] refOverUse fp test --- .../resources/diagnostics/RefOveruseDiagnostic.bsl | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl index e569c260952..9c895df245c 100644 --- a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl +++ b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl @@ -321,3 +321,16 @@ |ГДЕ | Справочник.Пользователи.Ссылка = &Пользователь"; КонецПроцедуры + +Процедура Тест28() + Запрос.Текст = + "ВЫБРАТЬ + | ЗаявкаНаХранение.Товары.( + | Номенклатура КАК Номенклатура, + | Ссылка.Склад КАК Склад // не ошибка + | ) КАК Товары + |ИЗ + | Документ.ЗаявкаНаХранение КАК ЗаявкаНаХранение + |ГДЕ + | ЗаявкаНаХранение.Ссылка = &ДокументОснование"; +КонецПроцедуры From 1a3931e9300acc9e29e0f5f206e7e29df677deb8 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Tue, 28 Jun 2022 22:32:27 +0300 Subject: [PATCH 14/26] =?UTF-8?q?=D0=A4=D0=9F=20=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D1=89=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=20=D0=B8=D0=BD=D0=BB?= =?UTF-8?q?=D0=B0=D0=B9=D0=BD-=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diagnostics/RefOveruseDiagnostic.java | 4 ++++ .../resources/diagnostics/RefOveruseDiagnostic.bsl | 13 +++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) 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 1377bf120b6..f1e352fb2f5 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 @@ -85,6 +85,8 @@ public class RefOveruseDiagnostic extends AbstractSDBLVisitorDiagnostic { SDBLParser.CALCULATION_REGISTER_TYPE, SDBLParser.TASK_TYPE, SDBLParser.EXTERNAL_DATA_SOURCE_TYPE); + private static final Collection EXCLUDED_COLUMNS_ROOT = + Set.of(SDBLParser.RULE_inlineTableField, SDBLParser.RULE_query); private Map dataSourcesWithTabularFlag = Collections.emptyMap(); private Map prevDataSourcesWithTabularFlag = Collections.emptyMap(); @Nullable private Range prevQueryRange; @@ -107,6 +109,8 @@ public ParseTree visitQuery(SDBLParser.QueryContext ctx) { private Stream checkQuery(SDBLParser.QueryContext ctx) { var columns = Trees.findAllTopLevelRuleNodes(ctx, RULE_COLUMNS).stream() .filter(parserRuleContext -> parserRuleContext.getRuleIndex() == SDBLParser.RULE_column) + .filter(parserRuleContext -> Trees.getRootParent((BSLParserRuleContext) parserRuleContext, EXCLUDED_COLUMNS_ROOT) + .getRuleIndex() == SDBLParser.RULE_query) .collect(Collectors.toList()); if (columns.isEmpty()) { diff --git a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl index 9c895df245c..52221a0a2cd 100644 --- a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl +++ b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl @@ -325,12 +325,13 @@ Процедура Тест28() Запрос.Текст = "ВЫБРАТЬ - | ЗаявкаНаХранение.Товары.( - | Номенклатура КАК Номенклатура, - | Ссылка.Склад КАК Склад // не ошибка - | ) КАК Товары + |ЗаявкаНаХранение.Товары.( + | Номенклатура КАК Номенклатура, + | Ссылка.Склад КАК Склад // не ошибка + |) КАК Товары |ИЗ - | Документ.ЗаявкаНаХранение КАК ЗаявкаНаХранение + | Документ.ЗаявкаНаХранение КАК ЗаявкаНаХранение |ГДЕ - | ЗаявкаНаХранение.Ссылка = &ДокументОснование"; + | ЗаявкаНаХранение.Ссылка = &ДокументОснование + |"; КонецПроцедуры From 2b4f1d1a491d5e45595119946effa39560594096 Mon Sep 17 00:00:00 2001 From: Alexey Sosnoviy Date: Wed, 29 Jun 2022 16:01:27 +0300 Subject: [PATCH 15/26] refOveruse fn fp tests --- .../diagnostics/RefOveruseDiagnosticTest.java | 6 ++++- .../diagnostics/RefOveruseDiagnostic.bsl | 26 ++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java index 139fcbd84b7..d095be6749a 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java @@ -57,6 +57,10 @@ void test() { .hasRange(296, 33, 80) .hasRange(300, 33, 70) .hasRange(309, 12, 28) - .hasSize(18); + .hasRange(309, 12, 28) + .hasRange(342, 12, 57) + .hasRange(343, 12, 57) + .hasRange(354, 26, 96) + .hasSize(21); } } diff --git a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl index 52221a0a2cd..89137097d3d 100644 --- a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl +++ b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl @@ -312,7 +312,7 @@ | РегистрСведений.Звеньевые"; КонецПроцедуры -Процедура Тест28() +Процедура Тест27() Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | Справочник.Пользователи.ТекущееПодразделение @@ -335,3 +335,27 @@ | ЗаявкаНаХранение.Ссылка = &ДокументОснование |"; КонецПроцедуры + +Процедура Тест29() + Запрос.Текст = + "ВЫБРАТЬ + | Пользователи.ТекущееПодразделение.Код КАК ТекущееПодразделениеКод, + | Пользователи.Ссылка.ТекущееПодразделение.Код КАК СсылкаТекущееПодразделениеКод, // ошибка + | Пользователи.ТекущееПодразделение.Ссылка.Код КАК ТекущееПодразделениеСсылкаКод // ошибка + |ИЗ + | Справочник.Пользователи КАК Пользователи"; +КонецПроцедуры + +Процедура Тест30() + Запрос.Текст = + "ВЫБРАТЬ + | ПользователиДополнительныеРеквизиты.Ссылка, + | ВЫБОР + | КОГДА ПользователиДополнительныеРеквизиты.Ссылка.ПометкаУдаления // Не ошибка + | ТОГДА ПользователиДополнительныеРеквизиты.Ссылка.ТекущееПодразделение.Ссылка // ошибка + | ИНАЧЕ ПользователиДополнительныеРеквизиты.Ссылка.ТекущееПодразделение // Не ошибка + | КОНЕЦ КАК Поле1 + |ИЗ + | Справочник.Пользователи.ДополнительныеРеквизиты КАК ПользователиДополнительныеРеквизиты"; +КонецПроцедуры + From 7bef41a5db21357f1be53be6e08e62e8628e74b1 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Fri, 1 Jul 2022 19:09:00 +0300 Subject: [PATCH 16/26] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20FP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit убрал табы из тест-файла для правильного подсчета позиции --- .../diagnostics/RefOveruseDiagnostic.java | 46 +++++++++++-------- .../diagnostics/RefOveruseDiagnosticTest.java | 4 +- .../diagnostics/RefOveruseDiagnostic.bsl | 9 ++-- 3 files changed, 33 insertions(+), 26 deletions(-) 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 f1e352fb2f5..8702ae748d3 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 @@ -63,7 +63,8 @@ public class RefOveruseDiagnostic extends AbstractSDBLVisitorDiagnostic { private static final Pattern REF_PATTERN = CaseInsensitivePattern.compile("Ссылка|Reference"); - private static final int BAD_CHILD_COUNT = 3; + private static final int COUNT_OF_TABLE_DOT_REF = 3; + private static final int LAST_INDEX_OF_TABLE_DOT_REF = COUNT_OF_TABLE_DOT_REF - 1; private static final int COUNT_OF_TABLE_DOT_REF_DOT_REF = 5; private static final Set RULE_COLUMNS = Set.of(SDBLParser.RULE_column, SDBLParser.RULE_query); private static final Set METADATA_TYPES = Set.of( @@ -205,7 +206,7 @@ private static boolean isTableWithTabularSection(DataSourceContext dataSourceCon private static Stream getSimpleOverused(List columnsCollection) { return columnsCollection.stream() - .filter(columnNode -> columnNode.getChildCount() > BAD_CHILD_COUNT) + .filter(columnNode -> columnNode.getChildCount() > COUNT_OF_TABLE_DOT_REF) .map(column -> column.getChild(column.getChildCount() - 1)) .filter(lastChild -> REF_PATTERN.matcher(lastChild.getText()).matches()) .map(BSLParserRuleContext.class::cast); @@ -214,7 +215,7 @@ private static Stream getSimpleOverused(List getOverused(List columnsCollection) { return columnsCollection.stream() .map(SDBLParser.ColumnContext.class::cast) - .filter(column -> column.getChildCount() >= BAD_CHILD_COUNT) + .filter(column -> column.getChildCount() >= COUNT_OF_TABLE_DOT_REF) .filter(this::isOveruse) .map(BSLParserRuleContext.class::cast); } @@ -232,26 +233,33 @@ private boolean isOveruse(SDBLParser.ColumnContext ctx) { // 0 1 2 var children = extractFirstMetadataTypeName(ctx); - final int childCount = children.size(); - - // dots are also children of ColumnContext, - // that is why -3 must be an index of penultimate identifier - var penultimateChild = children.get(childCount - BAD_CHILD_COUNT); + var refIndex = findLastRef(children); - var penultimateIdentifierName = penultimateChild.getText(); + final int childCount = children.size(); + final var lastIndex = childCount - 1; + if (refIndex == lastIndex) { + var penultimateIdentifierName = children.get(lastIndex - LAST_INDEX_OF_TABLE_DOT_REF).getText(); + return dataSourcesWithTabularFlag.get(penultimateIdentifierName) == null; + } + if (refIndex < LAST_INDEX_OF_TABLE_DOT_REF){ + return false; + } + if (refIndex > LAST_INDEX_OF_TABLE_DOT_REF){ + return true; + } + var tabName = children.get(0).getText(); + return !dataSourcesWithTabularFlag.getOrDefault(tabName, false); + } - if (REF_PATTERN.matcher(penultimateIdentifierName).matches()) { - if (childCount < COUNT_OF_TABLE_DOT_REF_DOT_REF){ - return true; + private static int findLastRef(List children) { + for (int i = children.size() - 1; i >= 0 ; i--) { + final var child = children.get(i); + final var childText = child.getText(); + if (REF_PATTERN.matcher(childText).matches()) { + return i; } - var prevChildID = children.get(childCount - COUNT_OF_TABLE_DOT_REF_DOT_REF).getText(); - return !dataSourcesWithTabularFlag.getOrDefault(prevChildID, false); - } - var lastIdentifierName = children.get(childCount - 1).getText(); - if (REF_PATTERN.matcher(lastIdentifierName).matches()) { - return dataSourcesWithTabularFlag.get(penultimateIdentifierName) == null; } - return false; + return -1; } private static List extractFirstMetadataTypeName(SDBLParser.ColumnContext ctx) { diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java index d095be6749a..172c776ac81 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java @@ -58,8 +58,8 @@ void test() { .hasRange(300, 33, 70) .hasRange(309, 12, 28) .hasRange(309, 12, 28) - .hasRange(342, 12, 57) - .hasRange(343, 12, 57) + .hasRange(342, 12, 56) + .hasRange(343, 12, 56) .hasRange(354, 26, 96) .hasSize(21); } diff --git a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl index 89137097d3d..1967d87a4d0 100644 --- a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl +++ b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl @@ -339,9 +339,9 @@ Процедура Тест29() Запрос.Текст = "ВЫБРАТЬ - | Пользователи.ТекущееПодразделение.Код КАК ТекущееПодразделениеКод, - | Пользователи.Ссылка.ТекущееПодразделение.Код КАК СсылкаТекущееПодразделениеКод, // ошибка - | Пользователи.ТекущееПодразделение.Ссылка.Код КАК ТекущееПодразделениеСсылкаКод // ошибка + | Пользователи.ТекущееПодразделение.Код КАК ТекущееПодразделениеКод, + | Пользователи.Ссылка.ТекущееПодразделение.Код КАК СсылкаТекущееПодразделениеКод, // ошибка + | Пользователи.ТекущееПодразделение.Ссылка.Код КАК ТекущееПодразделениеСсылкаКод // ошибка |ИЗ | Справочник.Пользователи КАК Пользователи"; КонецПроцедуры @@ -352,10 +352,9 @@ | ПользователиДополнительныеРеквизиты.Ссылка, | ВЫБОР | КОГДА ПользователиДополнительныеРеквизиты.Ссылка.ПометкаУдаления // Не ошибка - | ТОГДА ПользователиДополнительныеРеквизиты.Ссылка.ТекущееПодразделение.Ссылка // ошибка + | ТОГДА ПользователиДополнительныеРеквизиты.Ссылка.ТекущееПодразделение.Ссылка // ошибка | ИНАЧЕ ПользователиДополнительныеРеквизиты.Ссылка.ТекущееПодразделение // Не ошибка | КОНЕЦ КАК Поле1 |ИЗ | Справочник.Пользователи.ДополнительныеРеквизиты КАК ПользователиДополнительныеРеквизиты"; КонецПроцедуры - From caa878ea08ccef11ccab6e24de72cfe5d969ba48 Mon Sep 17 00:00:00 2001 From: Alexey Sosnoviy Date: Tue, 5 Jul 2022 14:34:48 +0300 Subject: [PATCH 17/26] refOveruse fp --- .../diagnostics/RefOveruseDiagnostic.bsl | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl index 1967d87a4d0..56ccdb358d8 100644 --- a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl +++ b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl @@ -358,3 +358,21 @@ |ИЗ | Справочник.Пользователи.ДополнительныеРеквизиты КАК ПользователиДополнительныеРеквизиты"; КонецПроцедуры + +Процедура Тест30() + +Запрос.Текст = + "ВЫБРАТЬ + | УдалитьСоглашенияОбИспользованииЭД.Ссылка + |ИЗ + | Справочник.УдалитьСоглашенияОбИспользованииЭД КАК УдалитьСоглашенияОбИспользованииЭД + |ГДЕ + | НЕ УдалитьСоглашенияОбИспользованииЭД.УдалитьИспользуетсяКриптография + | + |СГРУППИРОВАТЬ ПО + | УдалитьСоглашенияОбИспользованииЭД.Ссылка + | + |ИМЕЮЩИЕ + | КОЛИЧЕСТВО(УдалитьСоглашенияОбИспользованииЭД.СертификатыПодписейОрганизации.Ссылка) > 0" + +КонецПроцедуры From 262d231940b69380c4f16c772e8e495466038b09 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Mon, 18 Jul 2022 21:19:40 +0300 Subject: [PATCH 18/26] =?UTF-8?q?=D0=B7=D0=B0=D0=B3=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=D0=BA=D0=B0=20=D0=BF=D0=BE=D0=B4=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D0=BA=D1=83=20=D0=BC=D0=B5=D1=82=D0=B0=D0=B4?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diagnostics/RefOveruseDiagnostic.java | 4 +- .../diagnostics/RefOveruseDiagnosticTest.java | 36 +++++++++++++++++ .../diagnostics/RefOveruseDiagnostic.bsl | 39 ++++++++++++------- 3 files changed, 62 insertions(+), 17 deletions(-) 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 8702ae748d3..b750d717519 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 @@ -130,7 +130,7 @@ private Map dataSourcesWithTabularSection(SDBLParser.QueryConte var newResult = findAllDataSourceWithoutInnerQueries(ctx) .collect(Collectors.toMap( RefOveruseDiagnostic::getTableNameOrAlias, - RefOveruseDiagnostic::isTableWithTabularSection, + this::isTableWithTabularSection, (existing, replacement) -> existing, HashMap::new)); @@ -196,7 +196,7 @@ private static String getTableNameOrAlias(DataSourceContext dataSource) { .orElse(""); } - private static boolean isTableWithTabularSection(DataSourceContext dataSourceContext) { + private boolean isTableWithTabularSection(DataSourceContext dataSourceContext) { final var table = dataSourceContext.table(); if (table == null) { return dataSourceContext.virtualTable() != null; diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java index 172c776ac81..b362bcffa6b 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java @@ -21,6 +21,7 @@ */ package com.github._1c_syntax.bsl.languageserver.diagnostics; +import com.github._1c_syntax.utils.Absolute; import org.eclipse.lsp4j.Diagnostic; import org.junit.jupiter.api.Test; @@ -29,12 +30,46 @@ import static com.github._1c_syntax.bsl.languageserver.util.Assertions.assertThat; class RefOveruseDiagnosticTest extends AbstractDiagnosticTest { + private static final String PATH_TO_METADATA = "src/test/resources/metadata/designer"; + RefOveruseDiagnosticTest() { super(RefOveruseDiagnostic.class); } @Test void test() { + initServerContext(Absolute.path(PATH_TO_METADATA)); + + List diagnostics = getDiagnostics(); + + assertThat(diagnostics, true) + .hasRange(3, 28, 3, 45) + .hasRange(13, 8, 13, 34) + .hasRange(14, 8, 14, 38) + .hasRange(25, 8, 25, 21) + .hasRange(37, 8, 37, 29) + .hasRange(38, 8, 38, 35) + .hasRange(56, 37, 56, 43) + .hasRange(57, 42, 57, 48) + .hasRange(92, 8, 29) + .hasRange(153, 13, 153, 41) + .hasRange(164, 13, 164, 53) + .hasRange(178, 13, 178, 35) + .hasRange(216, 13, 37) + .hasRange(226, 13, 37) + .hasRange(238, 13, 38) + .hasRange(296, 33, 80) + .hasRange(300, 33, 70) + .hasRange(309, 12, 28) + .hasRange(309, 12, 28) + .hasRange(342, 12, 56) + .hasRange(343, 12, 56) + .hasRange(354, 26, 96) +// .hasRange(375, 20, 92) + .hasSize(21); + } + @Test + void testSingleFile() { List diagnostics = getDiagnostics(); @@ -61,6 +96,7 @@ void test() { .hasRange(342, 12, 56) .hasRange(343, 12, 56) .hasRange(354, 26, 96) +// .hasRange(375, 20, 92) .hasSize(21); } } diff --git a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl index 56ccdb358d8..8beb6a257e6 100644 --- a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl +++ b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl @@ -1,3 +1,10 @@ +Процедура Тест31() + Запрос.Текст = + "ВЫБРАТЬ + | Справочник1.ТабличнаяЧасть1.Ссылка + |ИЗ + | Справочник.Справочник1 КАК Справочник1"; +КонецПроцедуры Процедура Тест() Запрос = Новый Запрос; @@ -359,20 +366,22 @@ | Справочник.Пользователи.ДополнительныеРеквизиты КАК ПользователиДополнительныеРеквизиты"; КонецПроцедуры -Процедура Тест30() - -Запрос.Текст = - "ВЫБРАТЬ - | УдалитьСоглашенияОбИспользованииЭД.Ссылка - |ИЗ - | Справочник.УдалитьСоглашенияОбИспользованииЭД КАК УдалитьСоглашенияОбИспользованииЭД - |ГДЕ - | НЕ УдалитьСоглашенияОбИспользованииЭД.УдалитьИспользуетсяКриптография - | - |СГРУППИРОВАТЬ ПО - | УдалитьСоглашенияОбИспользованииЭД.Ссылка - | - |ИМЕЮЩИЕ - | КОЛИЧЕСТВО(УдалитьСоглашенияОбИспользованииЭД.СертификатыПодписейОрганизации.Ссылка) > 0" +Процедура Тест31() + Запрос.Текст = + "ВЫБРАТЬ + | Справочник1.ТабличнаяЧасть1.Ссылка + |ИЗ + | Справочник.Справочник1 КАК Справочник1"; +КонецПроцедуры +Процедура Тест32() + Запрос.Текст = + "ВЫБРАТЬ + | Справочник1.Ссылка + |ИЗ + | Справочник.Справочник1 КАК Справочник1 + |СГРУППИРОВАТЬ ПО + | Справочник1.Ссылка + |ИМЕЮЩИЕ + | КОЛИЧЕСТВО(Справочник1.ТабличнаяЧасть1.Ссылка) > 0"; КонецПроцедуры From 74f66d233302f23587eceeee3d09986acdc0b3af Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Tue, 19 Jul 2022 20:08:04 +0300 Subject: [PATCH 19/26] CleanupContextBeforeClassAndAfterEachTestMethod --- .../languageserver/diagnostics/RefOveruseDiagnosticTest.java | 2 ++ src/test/resources/diagnostics/RefOveruseDiagnostic.bsl | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java index b362bcffa6b..c293472f669 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java @@ -21,6 +21,7 @@ */ package com.github._1c_syntax.bsl.languageserver.diagnostics; +import com.github._1c_syntax.bsl.languageserver.util.CleanupContextBeforeClassAndAfterEachTestMethod; import com.github._1c_syntax.utils.Absolute; import org.eclipse.lsp4j.Diagnostic; import org.junit.jupiter.api.Test; @@ -29,6 +30,7 @@ import static com.github._1c_syntax.bsl.languageserver.util.Assertions.assertThat; +@CleanupContextBeforeClassAndAfterEachTestMethod class RefOveruseDiagnosticTest extends AbstractDiagnosticTest { private static final String PATH_TO_METADATA = "src/test/resources/metadata/designer"; diff --git a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl index 8beb6a257e6..d729e9fe498 100644 --- a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl +++ b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl @@ -1,4 +1,4 @@ -Процедура Тест31() +Процедура Тест31() // TODO Запрос.Текст = "ВЫБРАТЬ | Справочник1.ТабличнаяЧасть1.Ссылка From 3e7334339c3f397e0d1ce288d59e7c86edc4f9ab Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sat, 24 Dec 2022 12:23:26 +0300 Subject: [PATCH 20/26] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=D0=BA=D0=B0=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diagnostics/RefOveruseDiagnostic.java | 7 +++++++ .../diagnostics/RefOveruseDiagnosticTest.java | 7 +++++-- .../diagnostics/RefOveruseDiagnostic.bsl | 19 ++++++------------- 3 files changed, 18 insertions(+), 15 deletions(-) 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 b750d717519..d3803227851 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 @@ -201,6 +201,13 @@ private boolean isTableWithTabularSection(DataSourceContext dataSourceContext) { if (table == null) { return dataSourceContext.virtualTable() != null; } + final var mdo = dataSourceContext.table().mdo(); + if (mdo != null){ + return METADATA_TYPES.contains(mdo.type.getType());// TODO +// if (!METADATA_TYPES.contains(mdo.type.getType())){ +// return false; +// } + } return table.tableName != null || table.objectTableName != null; } diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java index c293472f669..7371913df5f 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java @@ -67,6 +67,8 @@ void test() { .hasRange(342, 12, 56) .hasRange(343, 12, 56) .hasRange(354, 26, 96) +// .hasRange(364, 9, 43) +// .hasRange(378, 20, 54) // .hasRange(375, 20, 92) .hasSize(21); } @@ -98,7 +100,8 @@ void testSingleFile() { .hasRange(342, 12, 56) .hasRange(343, 12, 56) .hasRange(354, 26, 96) -// .hasRange(375, 20, 92) - .hasSize(21); + .hasRange(364, 9, 43) + .hasRange(378, 20, 54) + .hasSize(23); } } diff --git a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl index d729e9fe498..e1d4b64730f 100644 --- a/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl +++ b/src/test/resources/diagnostics/RefOveruseDiagnostic.bsl @@ -1,10 +1,3 @@ -Процедура Тест31() // TODO - Запрос.Текст = - "ВЫБРАТЬ - | Справочник1.ТабличнаяЧасть1.Ссылка - |ИЗ - | Справочник.Справочник1 КАК Справочник1"; -КонецПроцедуры Процедура Тест() Запрос = Новый Запрос; @@ -369,19 +362,19 @@ Процедура Тест31() Запрос.Текст = "ВЫБРАТЬ - | Справочник1.ТабличнаяЧасть1.Ссылка + | Справочник31.ТабличнаяЧасть1.Ссылка // ошибка без метаданных |ИЗ - | Справочник.Справочник1 КАК Справочник1"; + | Справочник.Справочник1 КАК Справочник31"; КонецПроцедуры Процедура Тест32() Запрос.Текст = "ВЫБРАТЬ - | Справочник1.Ссылка + | Справочник32.Ссылка |ИЗ - | Справочник.Справочник1 КАК Справочник1 + | Справочник.Справочник1 КАК Справочник32 |СГРУППИРОВАТЬ ПО - | Справочник1.Ссылка + | Справочник32.Ссылка |ИМЕЮЩИЕ - | КОЛИЧЕСТВО(Справочник1.ТабличнаяЧасть1.Ссылка) > 0"; + | КОЛИЧЕСТВО(Справочник32.ТабличнаяЧасть1.Ссылка) > 0"; // ошибка без метаданных КонецПроцедуры From b5f8661b5d5a6d1198ab860d4d2669d66dddc4a5 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sat, 24 Dec 2022 16:39:21 +0300 Subject: [PATCH 21/26] =?UTF-8?q?=D1=83=D0=B1=D1=80=D0=B0=D0=BB=20=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D1=83=D0=B6=D0=BD=D1=8B=D0=B5=20=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../languageserver/diagnostics/SmokyTest.java | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/SmokyTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/SmokyTest.java index ab15fd49064..efd191eabbb 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/SmokyTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/SmokyTest.java @@ -61,28 +61,28 @@ class SmokyTest { @Autowired private Collection diagnosticInfos; - @BeforeEach - void setUpStreams() { - new MockUp() { - @Mock - public void exit(int value) { - throw new RuntimeException(String.valueOf(value)); - } - }; - } - - @Test - void test() throws Exception { - - // given - String[] args = new String[]{"--analyze", "--srcDir", "./src/test/resources/diagnostics"}; - - // when-then - assertThatThrownBy(() -> BSLLSPLauncher.main(args)) - .isInstanceOf(RuntimeException.class) - .hasMessage("0"); - - } +// @BeforeEach +// void setUpStreams() { +// new MockUp() { +// @Mock +// public void exit(int value) { +// throw new RuntimeException(String.valueOf(value)); +// } +// }; +// } + +// @Test +// void test() throws Exception { +// +// // given +// String[] args = new String[]{"--analyze", "--srcDir", "./src/test/resources/diagnostics"}; +// +// // when-then +// assertThatThrownBy(() -> BSLLSPLauncher.main(args)) +// .isInstanceOf(RuntimeException.class) +// .hasMessage("0"); +// +// } @Test void testIdenticalRanges() { From 7d7f3a07970f38b15e0a1cabe05f13d67998fed6 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sat, 24 Dec 2022 17:14:05 +0300 Subject: [PATCH 22/26] =?UTF-8?q?=D0=B2=D0=B5=D1=80=D0=BD=D1=83=D0=BB=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=85=D0=BE=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TODO на ФП --- .../diagnostics/RefOveruseDiagnostic.java | 14 +++++++------- .../diagnostics/RefOveruseDiagnosticTest.java | 11 +++++------ 2 files changed, 12 insertions(+), 13 deletions(-) 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 d3803227851..b1938ffbb30 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 @@ -201,13 +201,13 @@ private boolean isTableWithTabularSection(DataSourceContext dataSourceContext) { if (table == null) { return dataSourceContext.virtualTable() != null; } - final var mdo = dataSourceContext.table().mdo(); - if (mdo != null){ - return METADATA_TYPES.contains(mdo.type.getType());// TODO -// if (!METADATA_TYPES.contains(mdo.type.getType())){ -// return false; -// } - } +// final var mdo = dataSourceContext.table().mdo(); +// if (mdo != null){ +// return METADATA_TYPES.contains(mdo.type.getType());// TODO +//// if (!METADATA_TYPES.contains(mdo.type.getType())){ +//// return false; +//// } +// } return table.tableName != null || table.objectTableName != null; } diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java index 7371913df5f..396592a7c1a 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java @@ -67,10 +67,9 @@ void test() { .hasRange(342, 12, 56) .hasRange(343, 12, 56) .hasRange(354, 26, 96) -// .hasRange(364, 9, 43) -// .hasRange(378, 20, 54) -// .hasRange(375, 20, 92) - .hasSize(21); + .hasRange(364, 9, 44) // TODO не должно быть ошибкой + .hasRange(378, 20, 55) // TODO не должно быть ошибкой + .hasSize(23); } @Test void testSingleFile() { @@ -100,8 +99,8 @@ void testSingleFile() { .hasRange(342, 12, 56) .hasRange(343, 12, 56) .hasRange(354, 26, 96) - .hasRange(364, 9, 43) - .hasRange(378, 20, 54) + .hasRange(364, 9, 44) + .hasRange(378, 20, 55) .hasSize(23); } } From 7837e2ab3ae3988d81c96b1dee62fb0af39ab6d3 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Sun, 25 Dec 2022 01:41:33 +0300 Subject: [PATCH 23/26] =?UTF-8?q?=D0=B7=D0=B0=D0=B3=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=D0=BA=D0=B0=20=D0=B0=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=20=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D0=B0=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diagnostics/RefOveruseDiagnostic.java | 142 ++++++++++++------ .../diagnostics/RefOveruseDiagnosticTest.java | 10 +- 2 files changed, 104 insertions(+), 48 deletions(-) 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 b1938ffbb30..64077ddd9f0 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 @@ -30,9 +30,16 @@ import com.github._1c_syntax.bsl.languageserver.utils.Trees; import com.github._1c_syntax.bsl.parser.BSLParserRuleContext; import com.github._1c_syntax.bsl.parser.SDBLParser; +import com.github._1c_syntax.bsl.parser.SDBLParser.ColumnContext; import com.github._1c_syntax.bsl.parser.SDBLParser.DataSourceContext; +import com.github._1c_syntax.bsl.types.ConfigurationSource; +import com.github._1c_syntax.bsl.types.MDOType; +import com.github._1c_syntax.bsl.types.MdoReference; +import com.github._1c_syntax.mdclasses.mdo.AbstractMDObjectComplex; +import com.github._1c_syntax.mdclasses.mdo.attributes.TabularSection; import com.github._1c_syntax.utils.CaseInsensitivePattern; -import org.antlr.v4.runtime.ParserRuleContext; +import lombok.AllArgsConstructor; +import lombok.Value; import org.antlr.v4.runtime.tree.ParseTree; import org.eclipse.lsp4j.Range; @@ -88,16 +95,18 @@ public class RefOveruseDiagnostic extends AbstractSDBLVisitorDiagnostic { SDBLParser.EXTERNAL_DATA_SOURCE_TYPE); private static final Collection EXCLUDED_COLUMNS_ROOT = Set.of(SDBLParser.RULE_inlineTableField, SDBLParser.RULE_query); - private Map dataSourcesWithTabularFlag = Collections.emptyMap(); - private Map prevDataSourcesWithTabularFlag = Collections.emptyMap(); + public static final List SPECIAL_LIST_FOR_DATA_SOURCE = List.of(""); + + private Map> dataSourceWithTabularSectionNames = Collections.emptyMap(); + private Map> prevDataSourceWithTabularSectionNames = Collections.emptyMap(); @Nullable private Range prevQueryRange; @Override public ParseTree visitQueryPackage(SDBLParser.QueryPackageContext ctx) { var result = super.visitQueryPackage(ctx); prevQueryRange = null; - prevDataSourcesWithTabularFlag = Collections.emptyMap(); - dataSourcesWithTabularFlag = Collections.emptyMap(); + prevDataSourceWithTabularSectionNames = Collections.emptyMap(); + dataSourceWithTabularSectionNames = Collections.emptyMap(); return result; } @@ -107,47 +116,55 @@ public ParseTree visitQuery(SDBLParser.QueryContext ctx) { return super.visitQuery(ctx); } - private Stream checkQuery(SDBLParser.QueryContext ctx) { + private Stream checkQuery(SDBLParser.QueryContext ctx) { var columns = Trees.findAllTopLevelRuleNodes(ctx, RULE_COLUMNS).stream() .filter(parserRuleContext -> parserRuleContext.getRuleIndex() == SDBLParser.RULE_column) .filter(parserRuleContext -> Trees.getRootParent((BSLParserRuleContext) parserRuleContext, EXCLUDED_COLUMNS_ROOT) .getRuleIndex() == SDBLParser.RULE_query) + .map(ColumnContext.class::cast) .collect(Collectors.toList()); if (columns.isEmpty()) { return Stream.empty(); } - dataSourcesWithTabularFlag = dataSourcesWithTabularSection(ctx); - if (dataSourcesWithTabularFlag.isEmpty()) { + dataSourceWithTabularSectionNames = dataSourcesWithTabularSection(ctx); + if (dataSourceWithTabularSectionNames.isEmpty()) { return getSimpleOverused(columns); } return getOverused(columns); } - private Map dataSourcesWithTabularSection(SDBLParser.QueryContext ctx) { - var newResult = findAllDataSourceWithoutInnerQueries(ctx) - .collect(Collectors.toMap( - RefOveruseDiagnostic::getTableNameOrAlias, - this::isTableWithTabularSection, - (existing, replacement) -> existing, - HashMap::new)); + private Map> dataSourcesWithTabularSection(SDBLParser.QueryContext ctx) { + var newResult = calcDataSourceWithTabularSectionNames(findAllDataSourceWithoutInnerQueries(ctx)); var queryRange = Ranges.create(ctx); - final Map result; + final Map> result; if (prevQueryRange == null || !Ranges.containsRange(prevQueryRange, queryRange)){ result = newResult; - prevDataSourcesWithTabularFlag = result; + prevDataSourceWithTabularSectionNames = result; prevQueryRange = queryRange; } else { result = new HashMap<>(newResult); - result.putAll(prevDataSourcesWithTabularFlag); + result.putAll(prevDataSourceWithTabularSectionNames); } return result; } + private Map> calcDataSourceWithTabularSectionNames(Stream dataSources) { + return dataSources + .map(dataSourceContext -> new TabularSectionTable(getTableNameOrAlias(dataSourceContext), + getTabularSectionNames(dataSourceContext))) +// .filter(tabularSectionTable -> !tabularSectionTable.tableNameOrAlias.isEmpty())// TODO убираешь эти условия, и падает тест со строкой 13 +// .filter(tabularSectionTable -> !tabularSectionTable.tabularSectionNames.isEmpty()) + .collect(Collectors.toMap( + TabularSectionTable::getTableNameOrAlias, + TabularSectionTable::getTabularSectionNames, + (existing, replacement) -> existing)); + } + private static Stream findAllDataSourceWithoutInnerQueries( SDBLParser.QueryContext ctx) { if (ctx.from == null){ @@ -180,7 +197,6 @@ private static Collection getInnerDataSource(DataSourceContex return result; } - private static String getTableNameOrAlias(DataSourceContext dataSource) { final var value = Optional.of(dataSource); return value @@ -194,40 +210,71 @@ private static String getTableNameOrAlias(DataSourceContext dataSource) { .map(tableContext -> (ParseTree)tableContext.parameter())) .map(ParseTree::getText) .orElse(""); + } - private boolean isTableWithTabularSection(DataSourceContext dataSourceContext) { + private List getTabularSectionNames(DataSourceContext dataSourceContext) { final var table = dataSourceContext.table(); if (table == null) { - return dataSourceContext.virtualTable() != null; + return getSpecialListForDataSource(dataSourceContext.virtualTable() != null); + } + final var mdo = dataSourceContext.table().mdo(); + if (mdo == null) { + return getSpecialListForDataSource(table.tableName != null); + } + if (table.objectTableName != null){ + return SPECIAL_LIST_FOR_DATA_SOURCE; + } + return getTabularSectionNames(mdo); + } + + private List getSpecialListForDataSource(boolean useSpecialName) { + if (useSpecialName) { + return SPECIAL_LIST_FOR_DATA_SOURCE; + } + return Collections.emptyList(); + } + + private List getTabularSectionNames(SDBLParser.MdoContext mdo) { + final var configuration = documentContext.getServerContext() + .getConfiguration(); + if (configuration.getConfigurationSource() == ConfigurationSource.EMPTY){ + return Collections.emptyList(); } -// final var mdo = dataSourceContext.table().mdo(); -// if (mdo != null){ -// return METADATA_TYPES.contains(mdo.type.getType());// TODO -//// if (!METADATA_TYPES.contains(mdo.type.getType())){ -//// return false; -//// } -// } - return table.tableName != null || table.objectTableName != null; + return MDOType.fromValue(mdo.type.getText()).stream() + .map(mdoType1 -> MdoReference.create(mdoType1, mdo.tableName.getText())) + .map(mdoReference -> configuration.getChildrenByMdoRef().get(mdoReference)) + .filter(AbstractMDObjectComplex.class::isInstance) + .map(AbstractMDObjectComplex.class::cast) + .flatMap(mdObjectComplex -> getTabularSectionNames(mdObjectComplex)) + .collect(Collectors.toList()); + } + + private Stream getTabularSectionNames(AbstractMDObjectComplex mdObjectComplex) { + return mdObjectComplex.getAttributes().stream() + .filter(abstractMDOAttribute -> abstractMDOAttribute instanceof TabularSection) + .map(abstractMDOAttribute -> abstractMDOAttribute.getName()); } - private static Stream getSimpleOverused(List columnsCollection) { + private static Stream getSimpleOverused(List columnsCollection) { return columnsCollection.stream() .filter(columnNode -> columnNode.getChildCount() > COUNT_OF_TABLE_DOT_REF) - .map(column -> column.getChild(column.getChildCount() - 1)) - .filter(lastChild -> REF_PATTERN.matcher(lastChild.getText()).matches()) - .map(BSLParserRuleContext.class::cast); +// .map(column -> column.getChild(column.getChildCount() - 1)) + .filter(column -> REF_PATTERN.matcher(column.getChild(column.getChildCount() - 1).getText()).matches()); +// .map(column -> column.getChild(column.getChildCount() - 1)) +// .filter(lastChild -> REF_PATTERN.matcher(lastChild.getText()).matches()) +// .map(BSLParserRuleContext.class::cast); } - private Stream getOverused(List columnsCollection) { + private Stream getOverused(List columnsCollection) { return columnsCollection.stream() - .map(SDBLParser.ColumnContext.class::cast) + .map(ColumnContext.class::cast) .filter(column -> column.getChildCount() >= COUNT_OF_TABLE_DOT_REF) - .filter(this::isOveruse) - .map(BSLParserRuleContext.class::cast); + .filter(this::isOveruse); +// .map(BSLParserRuleContext.class::cast); } - private boolean isOveruse(SDBLParser.ColumnContext ctx) { + private boolean isOveruse(ColumnContext ctx) { // children: // @@ -246,7 +293,7 @@ private boolean isOveruse(SDBLParser.ColumnContext ctx) { final var lastIndex = childCount - 1; if (refIndex == lastIndex) { var penultimateIdentifierName = children.get(lastIndex - LAST_INDEX_OF_TABLE_DOT_REF).getText(); - return dataSourcesWithTabularFlag.get(penultimateIdentifierName) == null; + return dataSourceWithTabularSectionNames.get(penultimateIdentifierName) == null; } if (refIndex < LAST_INDEX_OF_TABLE_DOT_REF){ return false; @@ -255,7 +302,10 @@ private boolean isOveruse(SDBLParser.ColumnContext ctx) { return true; } var tabName = children.get(0).getText(); - return !dataSourcesWithTabularFlag.getOrDefault(tabName, false); +// return dataSourceWithTabularSectionNames.get(tabName) == null; + return dataSourceWithTabularSectionNames.getOrDefault(tabName, Collections.emptyList()).isEmpty(); +// return dataSourceWithTabularSectionNames.getOrDefault(tabName, SPECIAL_LIST_FOR_DATA_SOURCE).equals(SPECIAL_LIST_FOR_DATA_SOURCE); +// return !dataSourcesWithTabularFlag.getOrDefault(tabName, false); } private static int findLastRef(List children) { @@ -269,13 +319,21 @@ private static int findLastRef(List children) { return -1; } - private static List extractFirstMetadataTypeName(SDBLParser.ColumnContext ctx) { + private static List extractFirstMetadataTypeName(ColumnContext ctx) { + // TODO использовать ctx.columnNames или подобное вместо children final var mdoName = ctx.mdoName; final var children = ctx.children; if (mdoName == null || children.size() < COUNT_OF_TABLE_DOT_REF_DOT_REF - || !METADATA_TYPES.contains(ctx.mdoName.getStart().getType())){ + || !METADATA_TYPES.contains(mdoName.getStart().getType())){ return children; } return children.subList(1, children.size() - 1); } + + @Value + @AllArgsConstructor + private final static class TabularSectionTable { + String tableNameOrAlias; + List tabularSectionNames; + } } diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java index 396592a7c1a..dea89130552 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnosticTest.java @@ -51,8 +51,8 @@ void test() { .hasRange(25, 8, 25, 21) .hasRange(37, 8, 37, 29) .hasRange(38, 8, 38, 35) - .hasRange(56, 37, 56, 43) - .hasRange(57, 42, 57, 48) + .hasRange(56, 13, 43) + .hasRange(57, 14, 48) .hasRange(92, 8, 29) .hasRange(153, 13, 153, 41) .hasRange(164, 13, 164, 53) @@ -63,7 +63,6 @@ void test() { .hasRange(296, 33, 80) .hasRange(300, 33, 70) .hasRange(309, 12, 28) - .hasRange(309, 12, 28) .hasRange(342, 12, 56) .hasRange(343, 12, 56) .hasRange(354, 26, 96) @@ -83,8 +82,8 @@ void testSingleFile() { .hasRange(25, 8, 25, 21) .hasRange(37, 8, 37, 29) .hasRange(38, 8, 38, 35) - .hasRange(56, 37, 56, 43) - .hasRange(57, 42, 57, 48) + .hasRange(56, 13, 43) + .hasRange(57, 14, 48) .hasRange(92, 8, 29) .hasRange(153, 13, 153, 41) .hasRange(164, 13, 164, 53) @@ -95,7 +94,6 @@ void testSingleFile() { .hasRange(296, 33, 80) .hasRange(300, 33, 70) .hasRange(309, 12, 28) - .hasRange(309, 12, 28) .hasRange(342, 12, 56) .hasRange(343, 12, 56) .hasRange(354, 26, 96) From fe24ac32ee03c7c6389f854d91eecce2631d92f7 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Fri, 31 Mar 2023 20:16:24 +0300 Subject: [PATCH 24/26] =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20+=20=D0=B8?= =?UTF-8?q?=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BC=D0=B5=D1=87=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diagnostics/RefOveruseDiagnostic.java | 125 ++++++++---------- 1 file changed, 58 insertions(+), 67 deletions(-) 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 64077ddd9f0..5592ee33abb 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 @@ -30,11 +30,10 @@ import com.github._1c_syntax.bsl.languageserver.utils.Trees; import com.github._1c_syntax.bsl.parser.BSLParserRuleContext; import com.github._1c_syntax.bsl.parser.SDBLParser; -import com.github._1c_syntax.bsl.parser.SDBLParser.ColumnContext; -import com.github._1c_syntax.bsl.parser.SDBLParser.DataSourceContext; import com.github._1c_syntax.bsl.types.ConfigurationSource; import com.github._1c_syntax.bsl.types.MDOType; import com.github._1c_syntax.bsl.types.MdoReference; +import com.github._1c_syntax.mdclasses.mdo.AbstractMDObjectBase; import com.github._1c_syntax.mdclasses.mdo.AbstractMDObjectComplex; import com.github._1c_syntax.mdclasses.mdo.attributes.TabularSection; import com.github._1c_syntax.utils.CaseInsensitivePattern; @@ -75,31 +74,32 @@ public class RefOveruseDiagnostic extends AbstractSDBLVisitorDiagnostic { private static final int COUNT_OF_TABLE_DOT_REF_DOT_REF = 5; private static final Set RULE_COLUMNS = Set.of(SDBLParser.RULE_column, SDBLParser.RULE_query); private static final Set METADATA_TYPES = Set.of( - SDBLParser.BUSINESS_PROCESS_TYPE, - SDBLParser.CATALOG_TYPE, - SDBLParser.DOCUMENT_TYPE, - SDBLParser.INFORMATION_REGISTER_TYPE, - SDBLParser.CONSTANT_TYPE, - SDBLParser.FILTER_CRITERION_TYPE, - SDBLParser.EXCHANGE_PLAN_TYPE, - SDBLParser.SEQUENCE_TYPE, - SDBLParser.DOCUMENT_JOURNAL_TYPE, - SDBLParser.ENUM_TYPE, - SDBLParser.CHART_OF_CHARACTERISTIC_TYPES_TYPE, - SDBLParser.CHART_OF_ACCOUNTS_TYPE, - SDBLParser.CHART_OF_CALCULATION_TYPES_TYPE, - SDBLParser.ACCUMULATION_REGISTER_TYPE, - SDBLParser.ACCOUNTING_REGISTER_TYPE, - SDBLParser.CALCULATION_REGISTER_TYPE, - SDBLParser.TASK_TYPE, - SDBLParser.EXTERNAL_DATA_SOURCE_TYPE); + SDBLParser.BUSINESS_PROCESS_TYPE, + SDBLParser.CATALOG_TYPE, + SDBLParser.DOCUMENT_TYPE, + SDBLParser.INFORMATION_REGISTER_TYPE, + SDBLParser.CONSTANT_TYPE, + SDBLParser.FILTER_CRITERION_TYPE, + SDBLParser.EXCHANGE_PLAN_TYPE, + SDBLParser.SEQUENCE_TYPE, + SDBLParser.DOCUMENT_JOURNAL_TYPE, + SDBLParser.ENUM_TYPE, + SDBLParser.CHART_OF_CHARACTERISTIC_TYPES_TYPE, + SDBLParser.CHART_OF_ACCOUNTS_TYPE, + SDBLParser.CHART_OF_CALCULATION_TYPES_TYPE, + SDBLParser.ACCUMULATION_REGISTER_TYPE, + SDBLParser.ACCOUNTING_REGISTER_TYPE, + SDBLParser.CALCULATION_REGISTER_TYPE, + SDBLParser.TASK_TYPE, + SDBLParser.EXTERNAL_DATA_SOURCE_TYPE); private static final Collection EXCLUDED_COLUMNS_ROOT = Set.of(SDBLParser.RULE_inlineTableField, SDBLParser.RULE_query); public static final List SPECIAL_LIST_FOR_DATA_SOURCE = List.of(""); private Map> dataSourceWithTabularSectionNames = Collections.emptyMap(); private Map> prevDataSourceWithTabularSectionNames = Collections.emptyMap(); - @Nullable private Range prevQueryRange; + @Nullable + private Range prevQueryRange; @Override public ParseTree visitQueryPackage(SDBLParser.QueryPackageContext ctx) { @@ -116,12 +116,12 @@ public ParseTree visitQuery(SDBLParser.QueryContext ctx) { return super.visitQuery(ctx); } - private Stream checkQuery(SDBLParser.QueryContext ctx) { + private Stream checkQuery(SDBLParser.QueryContext ctx) { var columns = Trees.findAllTopLevelRuleNodes(ctx, RULE_COLUMNS).stream() .filter(parserRuleContext -> parserRuleContext.getRuleIndex() == SDBLParser.RULE_column) .filter(parserRuleContext -> Trees.getRootParent((BSLParserRuleContext) parserRuleContext, EXCLUDED_COLUMNS_ROOT) .getRuleIndex() == SDBLParser.RULE_query) - .map(ColumnContext.class::cast) + .map(SDBLParser.ColumnContext.class::cast) .collect(Collectors.toList()); if (columns.isEmpty()) { @@ -142,7 +142,7 @@ private Map> dataSourcesWithTabularSection(SDBLParser.Query var queryRange = Ranges.create(ctx); final Map> result; - if (prevQueryRange == null || !Ranges.containsRange(prevQueryRange, queryRange)){ + if (prevQueryRange == null || !Ranges.containsRange(prevQueryRange, queryRange)) { result = newResult; prevDataSourceWithTabularSectionNames = result; prevQueryRange = queryRange; @@ -153,21 +153,21 @@ private Map> dataSourcesWithTabularSection(SDBLParser.Query return result; } - private Map> calcDataSourceWithTabularSectionNames(Stream dataSources) { + private Map> calcDataSourceWithTabularSectionNames( + Stream dataSources) { + return dataSources .map(dataSourceContext -> new TabularSectionTable(getTableNameOrAlias(dataSourceContext), getTabularSectionNames(dataSourceContext))) -// .filter(tabularSectionTable -> !tabularSectionTable.tableNameOrAlias.isEmpty())// TODO убираешь эти условия, и падает тест со строкой 13 -// .filter(tabularSectionTable -> !tabularSectionTable.tabularSectionNames.isEmpty()) .collect(Collectors.toMap( TabularSectionTable::getTableNameOrAlias, TabularSectionTable::getTabularSectionNames, (existing, replacement) -> existing)); } - private static Stream findAllDataSourceWithoutInnerQueries( + private static Stream findAllDataSourceWithoutInnerQueries( SDBLParser.QueryContext ctx) { - if (ctx.from == null){ + if (ctx.from == null) { return Stream.empty(); } return Stream.concat( @@ -177,11 +177,11 @@ private static Stream findAllDataSourceWithoutInner ); } - private static Collection getInnerDataSource(DataSourceContext dataSourceContext) { - var result = new ArrayList(); + private static Collection getInnerDataSource(SDBLParser.DataSourceContext dataSourceContext) { + var result = new ArrayList(); Optional.ofNullable(dataSourceContext.dataSource()) - .map(RefOveruseDiagnostic::getInnerDataSource) - .ifPresent(result::addAll); + .map(RefOveruseDiagnostic::getInnerDataSource) + .ifPresent(result::addAll); var joinDataSources = dataSourceContext.joinPart().stream() .map(SDBLParser.JoinPartContext::dataSource) @@ -197,23 +197,23 @@ private static Collection getInnerDataSource(DataSourceContex return result; } - private static String getTableNameOrAlias(DataSourceContext dataSource) { + private static String getTableNameOrAlias(SDBLParser.DataSourceContext dataSource) { final var value = Optional.of(dataSource); return value - .map(DataSourceContext::alias) - .map(alias -> (ParseTree)alias.name) + .map(SDBLParser.DataSourceContext::alias) + .map(alias -> (ParseTree) alias.name) .or(() -> value - .map(DataSourceContext::table) - .map(tableContext -> (ParseTree)tableContext.tableName)) + .map(SDBLParser.DataSourceContext::table) + .map(tableContext -> (ParseTree) tableContext.tableName)) .or(() -> value - .map(DataSourceContext::parameterTable) - .map(tableContext -> (ParseTree)tableContext.parameter())) + .map(SDBLParser.DataSourceContext::parameterTable) + .map(tableContext -> (ParseTree) tableContext.parameter())) .map(ParseTree::getText) .orElse(""); } - private List getTabularSectionNames(DataSourceContext dataSourceContext) { + private List getTabularSectionNames(SDBLParser.DataSourceContext dataSourceContext) { final var table = dataSourceContext.table(); if (table == null) { return getSpecialListForDataSource(dataSourceContext.virtualTable() != null); @@ -222,13 +222,13 @@ private List getTabularSectionNames(DataSourceContext dataSourceContext) if (mdo == null) { return getSpecialListForDataSource(table.tableName != null); } - if (table.objectTableName != null){ + if (table.objectTableName != null) { return SPECIAL_LIST_FOR_DATA_SOURCE; } return getTabularSectionNames(mdo); } - private List getSpecialListForDataSource(boolean useSpecialName) { + private static List getSpecialListForDataSource(boolean useSpecialName) { if (useSpecialName) { return SPECIAL_LIST_FOR_DATA_SOURCE; } @@ -238,7 +238,7 @@ private List getSpecialListForDataSource(boolean useSpecialName) { private List getTabularSectionNames(SDBLParser.MdoContext mdo) { final var configuration = documentContext.getServerContext() .getConfiguration(); - if (configuration.getConfigurationSource() == ConfigurationSource.EMPTY){ + if (configuration.getConfigurationSource() == ConfigurationSource.EMPTY) { return Collections.emptyList(); } return MDOType.fromValue(mdo.type.getText()).stream() @@ -246,35 +246,30 @@ private List getTabularSectionNames(SDBLParser.MdoContext mdo) { .map(mdoReference -> configuration.getChildrenByMdoRef().get(mdoReference)) .filter(AbstractMDObjectComplex.class::isInstance) .map(AbstractMDObjectComplex.class::cast) - .flatMap(mdObjectComplex -> getTabularSectionNames(mdObjectComplex)) + .flatMap(RefOveruseDiagnostic::getTabularSectionNames) .collect(Collectors.toList()); } - private Stream getTabularSectionNames(AbstractMDObjectComplex mdObjectComplex) { + private static Stream getTabularSectionNames(AbstractMDObjectComplex mdObjectComplex) { return mdObjectComplex.getAttributes().stream() - .filter(abstractMDOAttribute -> abstractMDOAttribute instanceof TabularSection) - .map(abstractMDOAttribute -> abstractMDOAttribute.getName()); + .filter(TabularSection.class::isInstance) + .map(AbstractMDObjectBase::getName); } - private static Stream getSimpleOverused(List columnsCollection) { + private static Stream getSimpleOverused(List columnsCollection) { return columnsCollection.stream() .filter(columnNode -> columnNode.getChildCount() > COUNT_OF_TABLE_DOT_REF) -// .map(column -> column.getChild(column.getChildCount() - 1)) .filter(column -> REF_PATTERN.matcher(column.getChild(column.getChildCount() - 1).getText()).matches()); -// .map(column -> column.getChild(column.getChildCount() - 1)) -// .filter(lastChild -> REF_PATTERN.matcher(lastChild.getText()).matches()) -// .map(BSLParserRuleContext.class::cast); } - private Stream getOverused(List columnsCollection) { + private Stream getOverused(List columnsCollection) { return columnsCollection.stream() - .map(ColumnContext.class::cast) + .map(SDBLParser.ColumnContext.class::cast) .filter(column -> column.getChildCount() >= COUNT_OF_TABLE_DOT_REF) .filter(this::isOveruse); -// .map(BSLParserRuleContext.class::cast); } - private boolean isOveruse(ColumnContext ctx) { + private boolean isOveruse(SDBLParser.ColumnContext ctx) { // children: // @@ -295,21 +290,18 @@ private boolean isOveruse(ColumnContext ctx) { var penultimateIdentifierName = children.get(lastIndex - LAST_INDEX_OF_TABLE_DOT_REF).getText(); return dataSourceWithTabularSectionNames.get(penultimateIdentifierName) == null; } - if (refIndex < LAST_INDEX_OF_TABLE_DOT_REF){ + if (refIndex < LAST_INDEX_OF_TABLE_DOT_REF) { return false; } - if (refIndex > LAST_INDEX_OF_TABLE_DOT_REF){ + if (refIndex > LAST_INDEX_OF_TABLE_DOT_REF) { return true; } var tabName = children.get(0).getText(); -// return dataSourceWithTabularSectionNames.get(tabName) == null; return dataSourceWithTabularSectionNames.getOrDefault(tabName, Collections.emptyList()).isEmpty(); -// return dataSourceWithTabularSectionNames.getOrDefault(tabName, SPECIAL_LIST_FOR_DATA_SOURCE).equals(SPECIAL_LIST_FOR_DATA_SOURCE); -// return !dataSourcesWithTabularFlag.getOrDefault(tabName, false); } private static int findLastRef(List children) { - for (int i = children.size() - 1; i >= 0 ; i--) { + for (int i = children.size() - 1; i >= 0; i--) { final var child = children.get(i); final var childText = child.getText(); if (REF_PATTERN.matcher(childText).matches()) { @@ -319,12 +311,11 @@ private static int findLastRef(List children) { return -1; } - private static List extractFirstMetadataTypeName(ColumnContext ctx) { - // TODO использовать ctx.columnNames или подобное вместо children + private static List extractFirstMetadataTypeName(SDBLParser.ColumnContext ctx) { final var mdoName = ctx.mdoName; final var children = ctx.children; if (mdoName == null || children.size() < COUNT_OF_TABLE_DOT_REF_DOT_REF - || !METADATA_TYPES.contains(mdoName.getStart().getType())){ + || !METADATA_TYPES.contains(mdoName.getStart().getType())) { return children; } return children.subList(1, children.size() - 1); @@ -332,7 +323,7 @@ private static List extractFirstMetadataTypeName(ColumnContext ctx) { @Value @AllArgsConstructor - private final static class TabularSectionTable { + private static class TabularSectionTable { String tableNameOrAlias; List tabularSectionNames; } From 1e9d3e78071aa7f7b627f4358477ad7a2fc250f5 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Fri, 31 Mar 2023 20:16:46 +0300 Subject: [PATCH 25/26] =?UTF-8?q?=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0?= =?UTF-8?q?=D1=89=D0=B5=D0=BD=20=D0=BD=D0=B5=D0=B2=D0=B5=D1=80=D0=BD=D0=BE?= =?UTF-8?q?=20=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=BA=D0=BE=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../languageserver/diagnostics/SmokyTest.java | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/SmokyTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/SmokyTest.java index efd191eabbb..ab15fd49064 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/SmokyTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/SmokyTest.java @@ -61,28 +61,28 @@ class SmokyTest { @Autowired private Collection diagnosticInfos; -// @BeforeEach -// void setUpStreams() { -// new MockUp() { -// @Mock -// public void exit(int value) { -// throw new RuntimeException(String.valueOf(value)); -// } -// }; -// } - -// @Test -// void test() throws Exception { -// -// // given -// String[] args = new String[]{"--analyze", "--srcDir", "./src/test/resources/diagnostics"}; -// -// // when-then -// assertThatThrownBy(() -> BSLLSPLauncher.main(args)) -// .isInstanceOf(RuntimeException.class) -// .hasMessage("0"); -// -// } + @BeforeEach + void setUpStreams() { + new MockUp() { + @Mock + public void exit(int value) { + throw new RuntimeException(String.valueOf(value)); + } + }; + } + + @Test + void test() throws Exception { + + // given + String[] args = new String[]{"--analyze", "--srcDir", "./src/test/resources/diagnostics"}; + + // when-then + assertThatThrownBy(() -> BSLLSPLauncher.main(args)) + .isInstanceOf(RuntimeException.class) + .hasMessage("0"); + + } @Test void testIdenticalRanges() { From 7466713c8455da9033390243568468d7ebf5bd35 Mon Sep 17 00:00:00 2001 From: Artur Ayukhanov Date: Fri, 31 Mar 2023 20:26:04 +0300 Subject: [PATCH 26/26] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BB=20=D0=BC=D0=B5=D1=82=D0=BE?= =?UTF-8?q?=D0=B4=20+=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=B8=D0=BC=D1=8F=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit по замечанию из ПР --- .../diagnostics/RefOveruseDiagnostic.java | 2 +- .../bsl/languageserver/utils/Trees.java | 24 ++++++++++--------- 2 files changed, 14 insertions(+), 12 deletions(-) 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 5592ee33abb..0c5d6d671a2 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 @@ -117,7 +117,7 @@ public ParseTree visitQuery(SDBLParser.QueryContext ctx) { } private Stream checkQuery(SDBLParser.QueryContext ctx) { - var columns = Trees.findAllTopLevelRuleNodes(ctx, RULE_COLUMNS).stream() + var columns = Trees.findAllTopLevelDescendantNodes(ctx, RULE_COLUMNS).stream() .filter(parserRuleContext -> parserRuleContext.getRuleIndex() == SDBLParser.RULE_column) .filter(parserRuleContext -> Trees.getRootParent((BSLParserRuleContext) parserRuleContext, EXCLUDED_COLUMNS_ROOT) .getRuleIndex() == SDBLParser.RULE_query) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/Trees.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/Trees.java index d5deadc8ae7..cc83fa49dfd 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/Trees.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/Trees.java @@ -391,29 +391,31 @@ public static Collection findAllRuleNodes(ParseTree t, Collec * Например, если указать RULE_codeBlock, то найдется только самый верхнеуровневый блок кода, все вложенные найдены не будут * ВАЖНО: начальная нода не проверяется на условие, т.к. тогда она единственная и вернется в результате * - * @param t - начальный узел дерева + * @param root - начальный узел дерева * @param indexes - коллекция индексов * @return найденные узлы */ - public static Collection findAllTopLevelRuleNodes(ParserRuleContext t, Collection indexes) { + public static Collection findAllTopLevelDescendantNodes(ParserRuleContext root, + Collection indexes) { var result = new ArrayList(); - t.children.stream() - .map(node -> findAllTopLevelRuleNodesInner(node, indexes)) - .forEachOrdered(result::addAll); + root.children.stream() + .map(node -> findAllTopLevelDescendantNodesInner(node, indexes)) + .forEach(result::addAll); return result; } - private static Collection findAllTopLevelRuleNodesInner(ParseTree t, Collection indexes) { - if (t instanceof ParserRuleContext - && indexes.contains(((ParserRuleContext) t).getRuleIndex())) { - return List.of((ParserRuleContext) t); + private static Collection findAllTopLevelDescendantNodesInner(ParseTree root, + Collection indexes) { + if (root instanceof ParserRuleContext + && indexes.contains(((ParserRuleContext) root).getRuleIndex())) { + return List.of((ParserRuleContext) root); } List result = new ArrayList<>(); - IntStream.range(0, t.getChildCount()) - .mapToObj(i -> findAllTopLevelRuleNodesInner(t.getChild(i), indexes)) + IntStream.range(0, root.getChildCount()) + .mapToObj(i -> findAllTopLevelDescendantNodesInner(root.getChild(i), indexes)) .forEachOrdered(result::addAll); return result;