From f526ed4c7c90ca445b51180f3e3130d70ad59073 Mon Sep 17 00:00:00 2001 From: salexdv Date: Tue, 22 Dec 2020 21:49:47 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=B6=D0=B8=D0=BC=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=81=D0=B0:=20=D0=BF=D0=BE=D0=B4=D1=81?= =?UTF-8?q?=D0=BA=D0=B0=D0=B7=D0=BA=D0=B8=20=D0=BF=D0=BE=D0=BB=D0=B5=D0=B9?= =?UTF-8?q?=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=8B,=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=B3=D0=B4=D0=B0=20=D0=BE=D0=B1=D1=8A=D1=8F=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=8B?= =?UTF-8?q?=20=D0=BC=D0=BD=D0=BE=D0=B3=D0=BE=D1=81=D1=82=D1=80=D0=BE=D1=87?= =?UTF-8?q?=D0=BD=D0=BE=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/bsl_helper.js | 65 ++++++++++++++++++++++++++++++++++++++------- src/test_query.html | 9 ++++--- src/test_query.js | 8 ++++++ 3 files changed, 70 insertions(+), 12 deletions(-) diff --git a/src/bsl_helper.js b/src/bsl_helper.js index bb8280a..0007666 100644 --- a/src/bsl_helper.js +++ b/src/bsl_helper.js @@ -350,8 +350,8 @@ class bslHelper { */ requireQueryRef() { - let word = this.getLastSeparatedWord().toLowerCase(); - return (word == 'ссылка' || word == 'refs') && (this.lastOperator == ''); + let match = editor.getModel().findPreviousMatch('\\s+(ссылка|refs)\\s+' , editor.getPosition(), true); + return (match && match.range.startLineNumber == this.lineNumber); } @@ -1763,6 +1763,8 @@ class bslHelper { */ getQueryFieldsCompletitionForTempTable(suggestions, sourceDefinition, startPosition) { + let tableExists = false; + // Let's find definition for temporary table let intoMatch = this.model.findPreviousMatch('(?:поместить|into)\\s+' + sourceDefinition, startPosition, true); @@ -1795,6 +1797,8 @@ class bslHelper { insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet }); + tableExists = true; + } } @@ -1804,6 +1808,8 @@ class bslHelper { } } + + return tableExists; } @@ -1817,24 +1823,65 @@ class bslHelper { if (this.getLastCharacter() == '.') { // Let's find start of current query - let match = this.model.findPreviousMatch('(?:выбрать|select)', this.position, true); + let startMatch = this.model.findPreviousMatch('(?:выбрать|select)', this.position, true); - if (match) { - + if (startMatch) { + // Now we need to find lastExpression definition - let position = new monaco.Position(match.range.startLineNumber, match.range.startColumn); - match = this.model.findNextMatch('(.*)\\s+(?:как|as)\\s+' + this.lastRawExpression, position, true, false, null, true); + let position = new monaco.Position(startMatch.range.startLineNumber, startMatch.range.startColumn); + let match = this.model.findNextMatch('(.*)\\s+(?:как|as)\\s+' + this.lastRawExpression, position, true, false, null, true); - if (match) { + if (match) { let sourceDefinition = match.matches[1]; sourceDefinition = sourceDefinition.replace(/(из|левое|правое|внутреннее|внешнее|полное|from|left|right|inner|outer|full)?\s?(соединение|join)?/gi, '').trim(); if (!this.getQueryFieldsCompletitionForMetadata(suggestions, sourceDefinition)) { - this.getQueryFieldsCompletitionForTempTable(suggestions, sourceDefinition, position); + + if (!this.getQueryFieldsCompletitionForTempTable(suggestions, sourceDefinition, position)) { + + position = new monaco.Position(startMatch.range.startLineNumber, startMatch.range.startColumn); + let endMatch = this.model.findNextMatch('(?:из|from)[\\s\\S\\n]*?(?:как|as)\\s+' + this.lastRawExpression , position, true); + + if (endMatch) { + + // Searching the source + position = new monaco.Position(endMatch.range.endLineNumber, endMatch.range.endColumn); + let match = this.model.findPreviousMatch('[a-zA-Z0-9\u0410-\u044F]+\\.[a-zA-Z0-9\u0410-\u044F_]+(?:\\.[a-zA-Z0-9\u0410-\u044F]+)?', position, true, false, null, true); + + if (match) { + sourceDefinition = match.matches[0]; + this.getQueryFieldsCompletitionForMetadata(suggestions, sourceDefinition); + } + + } + + } } } + /* + let position = new monaco.Position(startMatch.range.startLineNumber, startMatch.range.startColumn); + let endMatch = this.model.findNextMatch('(?:из|from)[\\s\\S\\n]*?(?:как|as)\\s+' + this.lastRawExpression , position, true); + + if (endMatch) { + + // Searching the source + position = new monaco.Position(endMatch.range.endLineNumber, endMatch.range.endColumn); + let match = this.model.findPreviousMatch('[a-zA-Z0-9\u0410-\u044F]+\\.[a-zA-Z0-9\u0410-\u044F_]+(?:\\.[a-zA-Z0-9\u0410-\u044F]+)?', position, true, false, null, true); + + if (match) { + + let sourceDefinition = match.matches[0]; + if (!this.getQueryFieldsCompletitionForMetadata(suggestions, sourceDefinition)) { + this.getQueryFieldsCompletitionForTempTable(suggestions, sourceDefinition, position); + } + + } + + } + */ + } } diff --git a/src/test_query.html b/src/test_query.html index ab76977..357ef73 100644 --- a/src/test_query.html +++ b/src/test_query.html @@ -1110,11 +1110,14 @@ '////////////////////////////////////////////////////////////////////////////////', 'ВЫБРАТЬ', ' Товары.Ссылка КАК Ссылка,', - ' Цены.Реквизит2 КАК Цена', + ' Цены.Цена КАК Цена', 'ИЗ', ' Справочник.Товары КАК Товары', - ' ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК Цены', - ' ПО Товары.Ссылка = Цены.Реквизит1', + ' ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(', + ' &Период,', + ' Номенклатура В (&СписокНоменклатуры),', + ' ) КАК Цены', + ' ПО Товары.Ссылка = Цены.Номенклатура', 'ГДЕ', ' Товары.Ссылка <> &Товар' ].join('\n'); diff --git a/src/test_query.js b/src/test_query.js index 5e034de..c3c24dd 100644 --- a/src/test_query.js +++ b/src/test_query.js @@ -210,6 +210,14 @@ describe("Проверка автокомлита и подсказок реда }); + it("проверка подсказки полей таблицы запроса, когда объявление таблицы многострочное", function () { + bsl = helper(getCode(), 1094, 7); + let suggestions = []; + bsl.getQueryFieldsCompletition(suggestions); + expect(suggestions).to.be.an('array').that.not.is.empty; + assert.equal(suggestions.some(suggest => suggest.label === "ВидЦены"), true); + }); + switchQueryMode(); mocha.run();