Skip to content

Commit 91453c1

Browse files
authored
Merge pull request #2944 from artbear/null-fix
Восстановление правила FieldsFromJoinsWithoutIsNull после изменения парсера запросов
2 parents 020ad31 + cf9a08c commit 91453c1

File tree

2 files changed

+16
-15
lines changed

2 files changed

+16
-15
lines changed

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

+16-13
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
*/
2222
package com.github._1c_syntax.bsl.languageserver.diagnostics;
2323

24-
import com.github._1c_syntax.bsl.languageserver.diagnostics.infrastructure.Disabled;
2524
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticMetadata;
2625
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticSeverity;
2726
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticTag;
@@ -47,7 +46,6 @@
4746
import java.util.stream.Collectors;
4847
import java.util.stream.Stream;
4948

50-
@Disabled
5149
@DiagnosticMetadata(
5250
type = DiagnosticType.ERROR,
5351
severity = DiagnosticSeverity.CRITICAL,
@@ -61,16 +59,21 @@
6159
)
6260
public class FieldsFromJoinsWithoutIsNullDiagnostic extends AbstractSDBLVisitorDiagnostic {
6361

64-
private static final Integer SELECT_ROOT = SDBLParser.RULE_selectedField;
65-
private static final Collection<Integer> SELECT_STATEMENTS = Set.of(SELECT_ROOT, SDBLParser.RULE_builtInFunctions,
66-
SDBLParser.RULE_isNullPredicate);
62+
// схема расчета - находится поле из соединения,
63+
// далее идет поиск вверх по родительским узлам для проверки вхождения в разных вариациях ЕСТЬNULL или ЕСТЬ NULL
64+
// для оптимизации ищем вверх не до начального узла всего дерева, а до узла, в котором искать уже нет смысла
6765

68-
private static final Integer WHERE_ROOT = SDBLParser.RULE_predicate;
69-
private static final Collection<Integer> WHERE_STATEMENTS = Set.of(WHERE_ROOT, SDBLParser.RULE_builtInFunctions,
70-
SDBLParser.RULE_isNullPredicate);
66+
private static final Integer EXCLUDED_TOP_RULE_FOR_SELECT = SDBLParser.RULE_selectedField;
67+
private static final Collection<Integer> SELECT_STATEMENTS = Set.of(EXCLUDED_TOP_RULE_FOR_SELECT,
68+
SDBLParser.RULE_builtInFunctions, SDBLParser.RULE_isNullPredicate);
7169

72-
private static final Integer JOIN_ROOT = SDBLParser.RULE_joinPart;
73-
private static final Collection<Integer> JOIN_STATEMENTS = Set.of(JOIN_ROOT, SDBLParser.RULE_builtInFunctions);
70+
private static final Integer EXCLUDED_TOP_RULE_FOR_WHERE = SDBLParser.RULE_query;
71+
private static final Collection<Integer> WHERE_STATEMENTS = Set.of(EXCLUDED_TOP_RULE_FOR_WHERE,
72+
SDBLParser.RULE_builtInFunctions, SDBLParser.RULE_isNullPredicate);
73+
74+
private static final Integer EXCLUDED_TOP_RULE_FOR_JOIN = SDBLParser.RULE_joinPart;
75+
private static final Collection<Integer> JOIN_STATEMENTS = Set.of(EXCLUDED_TOP_RULE_FOR_JOIN,
76+
SDBLParser.RULE_builtInFunctions);
7477

7578
public static final Collection<Integer> RULES_OF_PARENT_FOR_SEARCH_CONDITION = Set.of(SDBLParser.RULE_predicate,
7679
SDBLParser.RULE_query);
@@ -165,7 +168,7 @@ private static boolean haveExprNotWithParens(SDBLParser.PredicateContext ctx) {
165168
}
166169

167170
private void checkSelect(String tableName, SDBLParser.SelectedFieldsContext columns) {
168-
checkStatements(tableName, columns, SELECT_STATEMENTS, SELECT_ROOT, true);
171+
checkStatements(tableName, columns, SELECT_STATEMENTS, EXCLUDED_TOP_RULE_FOR_SELECT, true);
169172
}
170173

171174
private void checkStatements(String tableName, BSLParserRuleContext expression, Collection<Integer> statements,
@@ -223,7 +226,7 @@ private void checkWhere(String tableName, @Nullable SDBLParser.LogicalExpression
223226
Optional.ofNullable(where)
224227
.stream().flatMap(searchConditionsContext -> searchConditionsContext.condidions.stream())
225228
.forEach(searchConditionContext -> checkStatements(tableName, searchConditionContext,
226-
WHERE_STATEMENTS, WHERE_ROOT, true));
229+
WHERE_STATEMENTS, EXCLUDED_TOP_RULE_FOR_WHERE, true));
227230
}
228231

229232
private void checkAllJoins(String tableName, SDBLParser.JoinPartContext currentJoinPart) {
@@ -233,7 +236,7 @@ private void checkAllJoins(String tableName, SDBLParser.JoinPartContext currentJ
233236
.filter(joinPartContext -> joinPartContext != currentJoinPart)
234237
.map(SDBLParser.JoinPartContext::logicalExpression)
235238
.forEach(searchConditionsContext -> checkStatements(tableName, searchConditionsContext,
236-
JOIN_STATEMENTS, JOIN_ROOT, false));
239+
JOIN_STATEMENTS, EXCLUDED_TOP_RULE_FOR_JOIN, false));
237240
}
238241

239242
private List<DiagnosticRelatedInformation> getRelatedInformation(SDBLParser.JoinPartContext self) {

src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FieldsFromJoinsWithoutIsNullDiagnosticTest.java

-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import org.eclipse.lsp4j.Diagnostic;
2727
import org.eclipse.lsp4j.DiagnosticRelatedInformation;
2828
import org.eclipse.lsp4j.Range;
29-
import org.junit.jupiter.api.Disabled;
3029
import org.junit.jupiter.api.Test;
3130

3231
import java.util.Arrays;
@@ -41,7 +40,6 @@ class FieldsFromJoinsWithoutIsNullDiagnosticTest extends AbstractDiagnosticTest<
4140
}
4241

4342
@Test
44-
@Disabled
4543
void test() {
4644

4745
List<Diagnostic> diagnostics = getDiagnostics();

0 commit comments

Comments
 (0)