1
0
mirror of https://github.com/salexdv/bsl_console.git synced 2025-02-11 13:38:35 +02:00

Простейшая реализация режима СКД

This commit is contained in:
salexdv 2021-03-20 15:04:03 +03:00
parent d3d1b1c2ae
commit f61d32bc38
5 changed files with 205 additions and 20 deletions

View File

@ -36,16 +36,20 @@ define(['vs/editor/editor.main'], function () {
};
}
actions.query_bsl = {
label: 'Конструктор запроса...',
key: monaco.KeyMod.CtrlCmd | monaco.KeyCode.KEY_D,
cmd: monaco.KeyMod.chord(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KEY_D),
order: 1.3,
callback: function (ed) {
sendEvent('EVENT_QUERY_CONSTRUCT', queryMode ? getText() : getQuery());
return null;
}
};
if (!DCSMode) {
actions.query_bsl = {
label: 'Конструктор запроса...',
key: monaco.KeyMod.CtrlCmd | monaco.KeyCode.KEY_D,
cmd: monaco.KeyMod.chord(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KEY_D),
order: 1.3,
callback: function (ed) {
sendEvent('EVENT_QUERY_CONSTRUCT', queryMode ? getText() : getQuery());
return null;
}
};
}
actions.comment_bsl = {
label: 'Добавить комментарий',
@ -69,7 +73,7 @@ define(['vs/editor/editor.main'], function () {
}
};
if (!queryMode) {
if (!queryMode && !DCSMode) {
actions.formatstr_bsl = {
label: 'Конструктор форматной строки...',

77
src/bslDCS.js Normal file
View File

@ -0,0 +1,77 @@
define([], function () {
bslDCS = {
"functions": {
"Вычислить": {
"name": "ВЫЧИСЛИТЬ",
"name_en": "EVAL",
"description": "Функция Вычислить предназначена для вычисления выражения в контексте некоторой группировки.\nФункция используется для совместимости с предыдущими версиями платформы.\nВместо неё рекомендуется использовать функцию ВычислитьВыражение.",
"returns": "Тип: Произвольный. Результат вычисления.",
"signature": {
"default": {
"СтрокаПараметров": "(Выражение, Группировка, ТипРасчета): Произвольный",
"Параметры": {
"Выражение": "Строка, содержит вычисляемое выражение",
"Группировка": "Строка, исходная дата",
"ТипРасчета": "Строка, В случае если данный параметр имеет значение ОбщийИтог, выражение будет вычисляться для всех записей группировки.\nВ случае если значение параметра Группировка, значения будут вычисляться для текущей групповой записи группировки."
}
}
}
},
"ВычислитьВыражение": {
"name": "ВЫЧИСЛИТЬВЫРАЖЕНИЕ",
"name_en": "EVALEXPRESSION",
"description": "Функция ВычислитьВыражение предназначена для вычисления выражения в контексте некоторой группировки. Функция учитывает отбор группировок, но не учитывает иерархические отборы.\nФункция не может применяться к группировке в групповом отборе этой группировки.\nСинтаксис:\nВычислитьВыражение(Выражение, Группировка, ТипРасчета, Начало, Конец, Сортировка, ИерархическаяСортировка, ОбработкаОдинаковыхЗначенийПорядка)",
"returns": "Тип: Произвольный. Результат вычисления.",
"signature": {
"default": {
"СтрокаПараметров": "(Выражение, Группировка, ТипРасчета, Начало, Конец, Сортировка, ИерархическаяСортировка, ОбработкаОдинаковыхЗначенийПорядка): Произвольный",
"Параметры": {
"Выражение": "Строка, содержит вычисляемое выражение",
"Группировка": "Строка, исходная дата",
"ТипРасчета": "Строка, тип расчета",
"Начало": "Строка, указывает, с какой записи нужно начинать фрагмент, в котором рассчитывать агрегатные функции выражения и из какой записи получать значения полей вне агрегатных функций",
"Конец": "Строка, указывает, до какой записи нужно продолжать фрагмент, в котором рассчитывать агрегатное выражение.",
"Сортировка": "Строка, в которой перечисляются выражения, разделенные запятыми, в направлении которых нужно упорядочивать последовательность.\nЕсли не указана, то упорядочивание выполняется так же как и у группировки, для которой вычисляется выражение.\nПосле каждого выражения можно указать ключевое слово Возр, для упорядочивания по возрастанию, Убыв, для упорядочивания по убывания, Автоупорядочивание, для упорядочивания ссылочных полей по полям, по которым нужно упорядочивать объект, на который выполняется ссылка.\nСлово Автоупорядочивание может использоваться как со словом Возр, так и со словом Убыв.",
"ИерархическаяСортировка": "Строка, аналогично сортировке. Применяется для упорядочивания иерархических записей.\nЕсли не указано, компоновщик макета генерирует упорядочивание в соответствии с упорядочиванием, указанным в параметре Сортировка.",
"ОбработкаОдинаковыхЗначенийПорядка": "Строка, указывает правило определения предыдущей или следующий записи, если есть несколько записей с одинаковым значением упорядочивания."
}
}
}
},
"ВычислитьВыражениеСГруппировкойМассив": {
"name": "ВЫЧИСЛИТЬВЫРАЖЕНИЕСГРУППИРОВКОЙМАССИВ",
"name_en": "EVALEXPRESSIONWITHGROUPARRAY",
"description": "Функция возвращает массив, каждый элемент которого содержит результат вычисления выражения для группировки по указанному полю.\nПример:\nМаксимум(ВычислитьВыражениеСГруппировкойМассив (\"Сумма(СуммаОборот)\", \"Контрагент\"))",
"returns": "Тип: Массив. Результат вычисления.",
"signature": {
"default": {
"СтрокаПараметров": "(Выражение, ВыраженияПолейГруппировки, ОтборЗаписей, ОтборГруппировок): Массив",
"Параметры": {
"Выражение": "Строка, выражение, которое нужно вычислить. Например, \"Сумма(СуммаОборот)\"",
"ВыраженияПолейГруппировки": "Строка, выражения полей группировки, перечисленные через запятую. Например, \"Контрагент, Партия\"",
"ОтборЗаписей": "Строка, выражение, применяемое к детальным записям. Например, \"ПометкаУдаления = Ложь\".\nЕсли в данном параметре используется агрегатная функция, то при выполнении компоновки данных возникнет ошибка",
"ОтборГруппировок": "Строка, отбор, применяемый к групповым записям. Например: \"Сумма(СуммаОборот) > &Параметр1\""
}
}
}
},
"ВычислитьВыражениеСГруппировкойТаблицаЗначений": {
"name": "ВЫЧИСЛИТЬВЫРАЖЕНИЕСГРУППИРОВКОЙТАБЛИЦАЗНАЧЕНИЙ",
"name_en": "EVALEXPRESSIONWITHGROUPVALUETABLE",
"description": "Функция возвращает таблицу значений, каждый элемент которого содержит результат вычисления выражения для группировки по указанному полю.\nПример:\nВычислитьВыражениеСГруппировкойТаблицаЗначений (\"Контрагент КАК Контрагент, Сумма(СуммаОборот) Как ОбъемПродаж\", \"Контрагент\")",
"returns": "Тип: ТаблицаЗначений. Результат вычисления.",
"signature": {
"default": {
"СтрокаПараметров": "(Выражение, ВыраженияПолейГруппировки, ОтборЗаписей, ОтборГруппировок): ТаблицаЗначений",
"Параметры": {
"Выражение": "Строка, выражение, которое нужно вычислить. Например, \"Сумма(СуммаОборот)\"",
"ВыраженияПолейГруппировки": "Строка, выражения полей группировки, перечисленные через запятую. Например, \"Контрагент, Партия\"",
"ОтборЗаписей": "Строка, выражение, применяемое к детальным записям. Например, \"ПометкаУдаления = Ложь\".\nЕсли в данном параметре используется агрегатная функция, то при выполнении компоновки данных возникнет ошибка",
"ОтборГруппировок": "Строка, отбор, применяемый к групповым записям. Например: \"Сумма(СуммаОборот) > &Параметр1\""
}
}
}
}
}
}
});

View File

@ -1667,7 +1667,7 @@ class bslHelper {
else {
if (!this.isItStringLiteral()) {
suggestions = getCodeCompletition();
suggestions = this.getCodeCompletition();
}
}
@ -2756,6 +2756,26 @@ class bslHelper {
}
/**
* Completition provider for DCS language
*
* @returns {array} array of completition
*/
getDCSCompletition() {
let suggestions = [];
this.getCommonCompletition(suggestions, bslDCS.functions, monaco.languages.CompletionItemKind.Function, true);
this.getCommonCompletition(suggestions, bslQuery.functions, monaco.languages.CompletionItemKind.Function, true);
this.getCustomObjectsCompletition(suggestions, bslMetadata.customObjects, monaco.languages.CompletionItemKind.Enum);
if (suggestions.length)
return { suggestions: suggestions }
else
return [];
}
/**
* Returns array of parametrs as described in JSON-dictionary
* for current node (method)
@ -3214,6 +3234,27 @@ class bslHelper {
}
/**
* Signature help provider for query language
*
* @returns {object} helper
*/
getDCSSigHelp() {
if (this.lastOperator != ')') {
let helper = this.getCommonSigHelp(bslDCS.functions);
if (!helper)
helper = this.getCommonSigHelp(bslQuery.functions);
if (helper)
return new SignatureHelpResult(helper);
}
}
/**
* Updates bslMetadata from JSON-string which
* was received from 1C

View File

@ -153,6 +153,11 @@ define([], function () {
'СУММА', 'SUM', 'ТОГДА', 'THEN', 'УБЫВ', 'DESC', 'ЧАС', 'HOUR',
'ЧИСЛО', 'NUMBER', 'NULL', 'КОГДА', 'WHEN'
],
DCSExp: [
'ВЫЧИСЛИТЬ', 'EVAL', 'ВЫЧИСЛИТЬВЫРАЖЕНИЕ', 'EVALEXPRESSION',
'ВЫЧИСЛИТЬВЫРАЖЕНИЕСГРУППИРОВКОЙМАССИВ', 'EVALEXPRESSIONWITHGROUPARRAY',
'ВЫЧИСЛИТЬВЫРАЖЕНИЕСГРУППИРОВКОЙТАБЛИЦАЗНАЧЕНИЙ', 'EVALEXPRESSIONWITHGROUPVALUETABLE'
],
queryOperators: /[=><+\-*\/%;,]+/,
// The main tokenizer for our languages
tokenizer: {
@ -292,7 +297,7 @@ define([], function () {
tokenPostfix: 'bsl',
ignoreCase: true,
keywords: bsl_language.rules.queryWords,
expressions: bsl_language.rules.queryExp,
expressions: bsl_language.rules.queryExp,
operators: /[=><+\-*\/%;,]+/,
tokenizer: {
root: [
@ -333,6 +338,13 @@ define([], function () {
themes: bsl_language.themes
}
let dcs_language = {
id: 'dcs_query',
rules: Object.assign({}, query_language.rules)
}
dcs_language.rules.expressions = bsl_language.rules.queryExp.concat(bsl_language.rules.DCSExp);
languages = {
bsl: {
languageDef: bsl_language,
@ -407,7 +419,39 @@ define([], function () {
provider: () => {},
resolver: () => {}
}
},
dcs: {
languageDef: dcs_language,
completionProvider: {
triggerCharacters: ['.', '('],
provideCompletionItems: function (model, position) {
let bsl = new bslHelper(model, position);
return bsl.getDCSCompletition();
}
},
foldingProvider: {
provideFoldingRanges: () => {}
},
signatureProvider: {
signatureHelpTriggerCharacters: ['(', ','],
signatureHelpRetriggerCharacters: [')'],
provideSignatureHelp: (model, position) => {
let bsl = new bslHelper(model, position);
return bsl.getDCSSigHelp();
}
},
hoverProvider: {
provideHover: () => {}
},
formatProvider: {
provideDocumentFormattingEdits: () => {}
},
codeLenses: {
provider: () => {},
resolver: () => {}
}
}
};
});

View File

@ -1,6 +1,6 @@
require.config( { 'vs/nls': { availableLanguages: { '*': "ru" } } } );
define(['bslGlobals', 'bslMetadata', 'snippets', 'bsl_language', 'vs/editor/editor.main', 'actions', 'bslQuery'], function () {
define(['bslGlobals', 'bslMetadata', 'snippets', 'bsl_language', 'vs/editor/editor.main', 'actions', 'bslQuery', 'bslDCS'], function () {
selectionText = '';
engLang = false;
@ -9,6 +9,7 @@ define(['bslGlobals', 'bslMetadata', 'snippets', 'bsl_language', 'vs/editor/edit
generateModificationEvent = false;
readOnlyMode = false;
queryMode = false;
DCSMode = false;
version1C = '';
contextActions = [];
customHovers = {};
@ -235,20 +236,24 @@ define(['bslGlobals', 'bslMetadata', 'snippets', 'bsl_language', 'vs/editor/edit
}
switchQueryMode = function() {
queryMode = !queryMode;
switchLanguageMode = function(mode) {
let queryPostfix = '-query';
let currentTheme = editor._themeService.getTheme().themeName;
if (queryMode && currentTheme.indexOf(queryPostfix) == -1)
if ((queryMode || DCSMode) && currentTheme.indexOf(queryPostfix) == -1)
currentTheme += queryPostfix;
else if (!queryMode && currentTheme.indexOf(queryPostfix) >= 0)
else if (!queryMode && !DCSMode && currentTheme.indexOf(queryPostfix) >= 0)
currentTheme = currentTheme.replace(queryPostfix, '');
if (queryMode)
if (queryMode && mode == 'query')
monaco.editor.setModelLanguage(editor.getModel(), "bsl_query");
else if (DCSMode && mode == 'dcs')
monaco.editor.setModelLanguage(editor.getModel(), "dcs_query");
else if (queryMode)
monaco.editor.setModelLanguage(editor.getModel(), "bsl_query");
else if (DCSMode)
monaco.editor.setModelLanguage(editor.getModel(), "dcs_query");
else
monaco.editor.setModelLanguage(editor.getModel(), "bsl");
@ -258,6 +263,20 @@ define(['bslGlobals', 'bslMetadata', 'snippets', 'bsl_language', 'vs/editor/edit
}
switchQueryMode = function() {
queryMode = !queryMode;
switchLanguageMode('query');
}
switchDCSMode = function() {
DCSMode = !DCSMode;
switchLanguageMode('dcs');
}
switchXMLMode = function() {
let identifier = editor.getModel().getLanguageIdentifier();