From fd5dd9e96db8eaa189668f51295e22ae84e07368 Mon Sep 17 00:00:00 2001 From: rhlin Date: Mon, 25 Dec 2023 10:09:24 -0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(monaco-editor-completion):=20=E9=9A=94?= =?UTF-8?q?=E7=A6=BB=E4=B8=8D=E5=90=8C=E4=BB=A3=E7=A0=81=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E5=99=A8=E8=87=AA=E5=8A=A8=E8=A1=A5=E5=85=A8=E7=9A=84=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=EF=BC=8C=E5=8F=98=E9=87=8F=E5=A3=B0=E6=98=8E=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E8=87=AA=E5=8A=A8=E8=A1=A5=E5=85=A8=E5=8E=BB=E6=8E=89?= =?UTF-8?q?js=E5=87=BD=E6=95=B0=E5=92=8Cstate=E5=8F=98=E9=87=8F=E7=9A=84?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E8=A1=A5=E5=85=A8=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/common/component/LifeCycles.vue | 8 ++++-- packages/common/js/completion.js | 14 ++++++++--- packages/plugins/data/src/CreateVariable.vue | 26 +++++++++++++++++--- packages/plugins/script/src/Main.vue | 5 +++- packages/plugins/script/src/js/method.js | 3 ++- 5 files changed, 45 insertions(+), 11 deletions(-) diff --git a/packages/common/component/LifeCycles.vue b/packages/common/component/LifeCycles.vue index 967efa02bc..7965f950fe 100644 --- a/packages/common/component/LifeCycles.vue +++ b/packages/common/component/LifeCycles.vue @@ -125,7 +125,8 @@ export default { bindLifeCycles: {}, editorValue: '{}', hasError: false, - linterWorker: null + linterWorker: null, + completionProvider: null }) watchEffect(() => { @@ -210,7 +211,7 @@ export default { return } // Lowcode API 提示 - initCompletion(editorRef.value.getMonaco()) + state.completionProvider = initCompletion(editorRef.value.getMonaco(), editorRef.value.getEditor()?.getModel()) // 初始化 ESLint worker state.linterWorker = initLinter(editor, editorRef.value.getMonaco(), state) @@ -226,6 +227,9 @@ export default { } onBeforeUnmount(() => { + state.completionProvider.forEach((provider) => { + provider.dispose() + }) // 终止 ESLint worker state.linterWorker?.terminate?.() }) diff --git a/packages/common/js/completion.js b/packages/common/js/completion.js index c51858cacc..3705232a9b 100644 --- a/packages/common/js/completion.js +++ b/packages/common/js/completion.js @@ -157,7 +157,7 @@ const getWords = (model, position) => { const lastWord = model.getWordUntilPosition(lastPosition).word ? model.getWordUntilPosition(lastPosition) : getCurrentChar(model, lastPosition) - if (!/[\w\.]/.test(lastWord.word)) break + if (!/[\w.]/.test(lastWord.word)) break words.push(lastWord) lastPosition.column = lastWord.startColumn } @@ -172,9 +172,14 @@ const getRange = (position, words) => ({ endColumn: words[words.length - 1].endColumn }) -export const initCompletion = (monacoInstance) => { +export const initCompletion = (monacoInstance, editorModel, conditionFn) => { const completionItemProvider = { provideCompletionItems(model, position, _context, _token) { + if (editorModel && model.id !== editorModel.id) { + return { + suggestions: [] + } + } const words = getWords(model, position) const wordContent = words.map((item) => item.word).join('') const range = getRange(position, words) @@ -185,9 +190,10 @@ export const initCompletion = (monacoInstance) => { const snippetSuggestions = getSnippetsSuggestions(monacoInstance, range, wordContent) // 用户变量数据提示 e.g. this.dataSourceMap.xxx.load() const userSuggestions = getUserSuggestions(monacoInstance, range, wordContent) - return { - suggestions: [...apiSuggestions, ...snippetSuggestions, ...userSuggestions] + suggestions: [...apiSuggestions, ...snippetSuggestions, ...userSuggestions].filter((item) => + conditionFn ? conditionFn(item) : true + ) } }, triggerCharacters: ['.'] diff --git a/packages/plugins/data/src/CreateVariable.vue b/packages/plugins/data/src/CreateVariable.vue index c91597f473..5d74c757bf 100644 --- a/packages/plugins/data/src/CreateVariable.vue +++ b/packages/plugins/data/src/CreateVariable.vue @@ -112,10 +112,11 @@