Skip to content

Commit 0e4b396

Browse files
authored
Merge pull request #1868 from 1c-syntax/feature/queryParserMod
2 parents 244d809 + 07735b7 commit 0e4b396

File tree

7 files changed

+37
-15
lines changed

7 files changed

+37
-15
lines changed

src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/QueryComputer.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,20 @@ public class QueryComputer extends BSLParserBaseVisitor<ParseTree> implements Co
4141
* Ключевые слова для поиска потенциально запросных строк
4242
*/
4343
private static final Pattern QUERIES_ROOT_KEY = CaseInsensitivePattern.compile(
44-
"(?:[\\s\";]|^)(?:select|выбрать|drop|уничтожить)(?:\\s|$)");
44+
"(?:^|[\"\\|;][\\s\\|]*)\\s*" +
45+
"(?:(?:(?:select|выбрать)[\\s\\|]+[\\w\\W]+[\\s\\|]+" +
46+
"(?:как|as|из|from|где|where|соединение|join|объединить|union" +
47+
"|сгруппировать|group|упорядочить|order|итоги|totals)(?:\\s|$))" +
48+
"|" +
49+
"(?:(?:уничтожить|drop)[\\s\\|]*.+))");
4550

4651
private static final Pattern NON_QUERIES_START = CaseInsensitivePattern.compile(
47-
"(?:^\\s*(?:(?:\\|)|(?:\"\")))");
52+
"(?:^\\s*(?:\\||\"\"|\\/{2,}))");
4853

4954
/**
5055
* Минимальная строка для анализа
5156
*/
52-
private static final int MINIMAL_QUERY_STRING_LENGTH = 8;
57+
private static final int MINIMAL_QUERY_STRING_LENGTH = 12;
5358

5459
/**
5560
* Поиск сдвоенных кавычек
@@ -98,6 +103,7 @@ public ParseTree visitString(BSLParser.StringContext ctx) {
98103
int prevTokenLine = -1;
99104
var partString = "";
100105
var strings = new StringJoiner("\n");
106+
var stringsBuff = new StringJoiner("\n");
101107
for (Token token : ctx.getTokens()) {
102108

103109
// бывает несколько токенов строки в одной строе файла
@@ -116,9 +122,9 @@ public ParseTree visitString(BSLParser.StringContext ctx) {
116122
}
117123

118124
// проверяем подстроку на вероятность запроса
119-
if (!isQuery) {
120-
isQuery = QUERIES_ROOT_KEY.matcher(partString).find()
121-
&& !NON_QUERIES_START.matcher(partString).find();
125+
if (!isQuery && !NON_QUERIES_START.matcher(partString).find()) {
126+
stringsBuff.add(partString);
127+
isQuery = QUERIES_ROOT_KEY.matcher(stringsBuff.toString()).find();
122128
}
123129

124130
startLine = token.getLine();

src/test/java/com/github/_1c_syntax/bsl/languageserver/aop/measures/MeasuresSubsystemTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ void testMeasuresAreCollected() {
6262

6363
// when
6464
serverContext.populateContext();
65-
var documentContext = TestUtils.getDocumentContext("Запрос = Новый Запрос(\"ВЫБРАТЬ 1\");");
65+
var documentContext = TestUtils.getDocumentContext("Запрос = Новый Запрос(\"ВЫБРАТЬ 1 как а\");");
6666
documentContext.getDiagnostics();
6767

6868
// then

src/test/java/com/github/_1c_syntax/bsl/languageserver/context/computer/QueryComputerTest.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,14 @@ void compute() {
4343
//then
4444
assertThat(queries).hasSize(10);
4545
assertThat(queries.get(0).getTokens().get(1).getLine()).isEqualTo(3);
46-
assertThat(queries.get(6).getTokens().get(2).getLine()).isEqualTo(30);
47-
assertThat(queries.get(8).getTokens().get(1).getLine()).isEqualTo(45);
46+
assertThat(queries.get(1).getTokens().get(1).getLine()).isEqualTo(5);
47+
assertThat(queries.get(2).getTokens().get(1).getLine()).isEqualTo(12);
48+
assertThat(queries.get(3).getTokens().get(1).getLine()).isEqualTo(14);
49+
assertThat(queries.get(4).getTokens().get(2).getLine()).isEqualTo(21);
50+
assertThat(queries.get(5).getTokens().get(2).getLine()).isEqualTo(23);
51+
assertThat(queries.get(6).getTokens().get(1).getLine()).isEqualTo(30);
52+
assertThat(queries.get(7).getTokens().get(15).getLine()).isEqualTo(39);
4853
assertThat(queries.get(8).getTokens().get(31).getLine()).isEqualTo(50);
49-
assertThat(queries.get(9).getTokens().get(9).getLine()).isEqualTo(59);
50-
54+
assertThat(queries.get(9).getTokens().get(31).getLine()).isEqualTo(62);
5155
}
5256
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ void test() {
4040

4141
assertThat(diagnostics).hasSize(4);
4242
assertThat(diagnostics, true)
43-
.hasRange(5, 1, 6, 26)
43+
.hasRange(5, 1, 6, 30)
4444
.hasRange(9, 1, 10, 59)
4545
.hasRange(14, 1, 19, 11)
4646
.hasRange(27, 1, 28, 3)

src/test/resources/context/computer/QueryComputerTest.bsl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,10 @@
6161
| КАК Два ИЗ Справочник.Поле
6262
|АВТОУПОРЯДОЧИВАНИЕ;";
6363

64+
КонецФункции
65+
66+
Функция Тест8()
67+
68+
А = "нужно ВЫБРАТЬ РАЗРЕШЕННЫЕ Поле.Один"; // не запрос
69+
6470
КонецФункции

src/test/resources/diagnostics/QueryParseErrorDiagnostic.bsl

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
ТекстЗапросаОшибка1 =
66
"ВЫБРАТЬ
7-
|ИЗ Справочник.Контрагенты";
7+
|ИЗ Справочник.Контрагенты как";
88

99
ТекстЗапросаОшибка2 =
1010
"ВЫБРАТЬ Поле
@@ -28,3 +28,9 @@
2828
|ВЫБРАТЬ Поле
2929
|ИЗ
3030
|";
31+
32+
ТекстНеЗапроса5 =
33+
"ВЫБРАТЬ значение?";
34+
35+
ТекстНеЗапроса6 =
36+
"Вам нужно выбрать значение из списка";

src/test/resources/diagnostics/RefOveruseDiagnostic.bsl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@
5454
Процедура Тест6()
5555
Запрос = Новый Запрос;
5656
Запрос.Текст =
57-
"ВЫБРАТЬ Документ.Документ1.Файл.Ссылка, // ошибка
58-
| Справочник.Справочник1.Файл.Ссылка"; // ошибка
57+
"ВЫБРАТЬ Документ.Документ1.Файл.Ссылка как п1, // ошибка
58+
| Справочник.Справочник1.Файл.Ссылка как п2"; // ошибка
5959
КонецПроцедуры
6060

6161
Процедура Тест7()

0 commit comments

Comments
 (0)