From d2e14ffe8630ff1708cb5f4a7e7f7b55766c6586 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Tue, 16 Jul 2024 16:07:57 +0200 Subject: [PATCH] Lua: Cleanup Hooks Change-Id: I8e3a1d66ea6125d2cc5ee9c8f8442cca0913fec6 Reviewed-by: Reviewed-by: hjk --- .../lua-plugins/ai_asistant/ai_asistant.lua | 7 +- .../lua-plugins/ai_asistant/init.lua | 9 +- src/plugins/lua/CMakeLists.txt | 49 +----- src/plugins/lua/bindings/documents.cpp | 30 ---- src/plugins/lua/bindings/documents.h | 40 ----- src/plugins/lua/bindings/hook.cpp | 52 +------ src/plugins/lua/bindings/textdocument.cpp | 144 ++++++++++++++++++ src/plugins/lua/lua.qbs | 3 +- src/plugins/lua/luaplugin.cpp | 4 +- src/plugins/lua/meta/documents.lua | 12 -- src/plugins/lua/meta/qtc.lua | 11 +- src/plugins/lua/meta/textdocument.lua | 10 ++ 12 files changed, 181 insertions(+), 190 deletions(-) delete mode 100644 src/plugins/lua/bindings/documents.cpp delete mode 100644 src/plugins/lua/bindings/documents.h create mode 100644 src/plugins/lua/bindings/textdocument.cpp delete mode 100644 src/plugins/lua/meta/documents.lua create mode 100644 src/plugins/lua/meta/textdocument.lua diff --git a/share/qtcreator/lua-plugins/ai_asistant/ai_asistant.lua b/share/qtcreator/lua-plugins/ai_asistant/ai_asistant.lua index 6dec558fb8a..48188a00638 100644 --- a/share/qtcreator/lua-plugins/ai_asistant/ai_asistant.lua +++ b/share/qtcreator/lua-plugins/ai_asistant/ai_asistant.lua @@ -19,8 +19,11 @@ It will try to install it if it is not found. }, hooks = { editors = { - documentOpened = function(document) require 'init'.Hooks.onDocumentOpened(document) end, - documentClosed = function(document) require 'init'.Hooks.onDocumentClosed(document) end, + text = { + opened = function(document) require 'init'.Hooks.onDocumentOpened(document) end, + closed = function(document) require 'init'.Hooks.onDocumentClosed(document) end, + contentsChanged = function(document) require 'init'.Hooks.onDocumentContentsChanged(document) end, + } } }, setup = function() diff --git a/share/qtcreator/lua-plugins/ai_asistant/init.lua b/share/qtcreator/lua-plugins/ai_asistant/init.lua index 608eee50732..1b07bd0a27e 100644 --- a/share/qtcreator/lua-plugins/ai_asistant/init.lua +++ b/share/qtcreator/lua-plugins/ai_asistant/init.lua @@ -5,7 +5,7 @@ local Utils = require('Utils') local S = require('Settings') local Gui = require('Gui') local a = require('async') -local Documents = require('Documents') +local TextDocument = require('TextDocument') local function createCommand() local cmd = { Settings.binary.expandedValue:nativePath() } @@ -96,8 +96,8 @@ end Hooks = {} -local function onDocumentChanged() - print("onDocumentChanged() called") +function Hooks.onDocumentContentsChanged(document) + print("onDocumentContentsChanged() called", document) -- TODO: -- All the necessary checks before sending the request -- Create request: @@ -110,8 +110,7 @@ local function onDocumentChanged() ---Called when a document is opened. ---@param document TextDocument function Hooks.onDocumentOpened(document) - print("TextDocument found: ", document) - document:setChangedCallback(onDocumentChanged) + print("TextDocument found: ", document) end ---Called when a document is closed. diff --git a/src/plugins/lua/CMakeLists.txt b/src/plugins/lua/CMakeLists.txt index 2557c5c8fe5..38ac721aec3 100644 --- a/src/plugins/lua/CMakeLists.txt +++ b/src/plugins/lua/CMakeLists.txt @@ -1,4 +1,3 @@ - add_qtc_plugin(Lua PLUGIN_DEPENDS Core PUBLIC_DEPENDS lua546 sol2 TextEditor @@ -7,8 +6,6 @@ add_qtc_plugin(Lua bindings/action.cpp bindings/async.cpp bindings/core.cpp - bindings/documents.cpp - bindings/documents.h bindings/fetch.cpp bindings/gui.cpp bindings/hook.cpp @@ -19,6 +16,7 @@ add_qtc_plugin(Lua bindings/messagemanager.cpp bindings/qtcprocess.cpp bindings/settings.cpp + bindings/textdocument.cpp bindings/utils.cpp luaengine.cpp luaengine.h @@ -28,24 +26,6 @@ add_qtc_plugin(Lua luaqttypes.cpp luaqttypes.h luatr.h - meta/action.lua - meta/async.lua - meta/core.lua - meta/documents.lua - meta/fetch.lua - meta/gui.lua - meta/json.lua - meta/install.lua - meta/localsocket.lua - meta/lsp.lua - meta/messagemanager.lua - meta/process.lua - meta/qt.lua - meta/qtc.lua - meta/settings.lua - meta/simpletypes.lua - meta/utils.lua - meta/widgets.lua wizards/wizards.qrc # generateqtbindings.cpp # Use this if you need to generate some code. ) @@ -70,32 +50,7 @@ if (MSVC) set_property(SOURCE bindings/settings.cpp PROPERTY COMPILE_FLAGS /bigobj) endif() -set(META_FILES - meta/action.lua - meta/async.lua - meta/core.lua - meta/documents.lua - meta/fetch.lua - meta/gui.lua - meta/json.lua - meta/localsocket.lua - meta/lsp.lua - meta/messagemanager.lua - meta/process.lua - meta/qt.lua - meta/qtc.lua - meta/settings.lua - meta/simpletypes.lua - meta/utils.lua - meta/widgets.lua -) - qtc_copy_to_builddir(copy_lua_meta_files - DESTINATION ${IDE_DATA_PATH}/lua - FILES ${META_FILES} -) - -install( - FILES ${META_FILES} + DIRECTORIES meta DESTINATION ${IDE_DATA_PATH}/lua/meta ) diff --git a/src/plugins/lua/bindings/documents.cpp b/src/plugins/lua/bindings/documents.cpp deleted file mode 100644 index bad28f40339..00000000000 --- a/src/plugins/lua/bindings/documents.cpp +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (C) 2024 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#include "../luaengine.h" -#include "sol/sol.hpp" - -#include "documents.h" -#include - -namespace Lua::Internal { - -void addDocumentsModule() -{ - LuaEngine::registerProvider("Documents", [](sol::state_view lua) -> sol::object { - sol::table documents = lua.create_table(); - - documents.new_usertype( - "TextDocument", - sol::no_constructor, - "setChangedCallback", - [](LuaTextDocument &self, sol::function callback) { - self.setChangedCallback(callback); - }); - - return documents; - }); -} - -} // namespace Lua::Internal - diff --git a/src/plugins/lua/bindings/documents.h b/src/plugins/lua/bindings/documents.h deleted file mode 100644 index ecead57883d..00000000000 --- a/src/plugins/lua/bindings/documents.h +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (C) 2024 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#pragma once - -#include "sol/sol.hpp" -#include - -namespace Lua { - -class LuaTextDocument : public QObject -{ - Q_OBJECT - -public: - LuaTextDocument(TextEditor::TextDocument *document) - : m_document(document) - { - connect( - m_document, - &TextEditor::TextDocument::contentsChanged, - this, - &LuaTextDocument::contentsChanged); - return; - } - - void setChangedCallback(sol::function lua_function) { m_changedCallback = lua_function; } - - void contentsChanged() - { - if (m_changedCallback) - m_changedCallback(); - } - -private: - TextEditor::TextDocument *m_document; - sol::function m_changedCallback; -}; - -} // namespace Lua diff --git a/src/plugins/lua/bindings/hook.cpp b/src/plugins/lua/bindings/hook.cpp index b87442af729..9506c963610 100644 --- a/src/plugins/lua/bindings/hook.cpp +++ b/src/plugins/lua/bindings/hook.cpp @@ -3,61 +3,22 @@ #include "../luaengine.h" -#include "documents.h" #include #include namespace Lua { -class Hook : public QObject -{ - Q_OBJECT - -public: - Hook(QObject *source); - -signals: - void trigger(sol::table &args); -}; - -Hook::Hook(QObject *source) - : QObject(source) -{} - namespace Internal { void addHookModule() { - LuaEngine::autoRegister([](sol::state_view lua) { - auto connection - = lua.new_usertype("QMetaConnection", sol::no_constructor); - - auto hook = lua.new_usertype( - "Hook", - sol::no_constructor, - "connect", - [](Hook *hook, const sol::function &func) -> QMetaObject::Connection { - QMetaObject::Connection con - = QObject::connect(hook, &Hook::trigger, [func](sol::table args) { - auto res = LuaEngine::void_safe_call(func, args); - QTC_CHECK_EXPECTED(res); - }); - return con; - }, - "disconnect", - [](Hook *, QMetaObject::Connection con) { QObject::disconnect(con); }); - }); - LuaEngine::registerHook("editors.documentOpened", [](const sol::protected_function &func) { QObject::connect( Core::EditorManager::instance(), &Core::EditorManager::documentOpened, [func](Core::IDocument *document) { - auto text_document = qobject_cast(document); - if (text_document) { - QTC_CHECK_EXPECTED(LuaEngine::void_safe_call( - func, std::make_unique(text_document))); - } + Utils::expected_str res = LuaEngine::void_safe_call(func, document); + QTC_CHECK_EXPECTED(res); }); }); @@ -66,11 +27,8 @@ void addHookModule() Core::EditorManager::instance(), &Core::EditorManager::documentClosed, [func](Core::IDocument *document) { - auto text_document = qobject_cast(document); - if (text_document) { - QTC_CHECK_EXPECTED(LuaEngine::void_safe_call( - func, std::make_unique(text_document))); - } + Utils::expected_str res = LuaEngine::void_safe_call(func, document); + QTC_CHECK_EXPECTED(res); }); }); } @@ -78,5 +36,3 @@ void addHookModule() } // namespace Internal } // namespace Lua - -#include "hook.moc" diff --git a/src/plugins/lua/bindings/textdocument.cpp b/src/plugins/lua/bindings/textdocument.cpp new file mode 100644 index 00000000000..8188093b70a --- /dev/null +++ b/src/plugins/lua/bindings/textdocument.cpp @@ -0,0 +1,144 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include "../luaengine.h" + +#include + +#include + +#include "sol/sol.hpp" + +namespace Lua::Internal { + +class TextDocumentRegistry : public QObject +{ + Q_OBJECT + +public: + static TextDocumentRegistry *instance() + { + static TextDocumentRegistry *instance = new TextDocumentRegistry(); + return instance; + } + + TextDocumentRegistry() + { + connect( + Core::EditorManager::instance(), + &Core::EditorManager::documentOpened, + this, + &TextDocumentRegistry::onDocumentOpened); + + connect( + Core::EditorManager::instance(), + &Core::EditorManager::documentClosed, + this, + &TextDocumentRegistry::onDocumentClosed); + + connect( + Core::EditorManager::instance(), + &Core::EditorManager::currentEditorChanged, + this, + [this](Core::IEditor *editor) { + if (!editor) { + emit currentDocumentChanged(nullptr); + return; + } + auto document = editor->document(); + auto textDocument = qobject_cast(document); + if (textDocument) { + emit currentDocumentChanged(textDocument); + return; + } + emit currentDocumentChanged(nullptr); + }); + } + + void onDocumentOpened(Core::IDocument *document) + { + auto textDocument = qobject_cast(document); + if (!textDocument) + return; + + connect(textDocument, &TextEditor::TextDocument::contentsChanged, this, [this, textDocument] { + emit documentContentsChanged(textDocument); + }); + + emit documentOpened(textDocument); + } + + void onDocumentClosed(Core::IDocument *document) + { + auto textDocument = qobject_cast(document); + if (!textDocument) + return; + + document->disconnect(this); + emit documentClosed(textDocument); + } + +signals: + void documentOpened(TextEditor::TextDocument *document); + void currentDocumentChanged(TextEditor::TextDocument *document); + void documentClosed(TextEditor::TextDocument *document); + void documentContentsChanged(TextEditor::TextDocument *document); +}; + +void addTextDocumentsModule() +{ + TextDocumentRegistry::instance(); + + LuaEngine::registerProvider("TextDocument", [](sol::state_view lua) -> sol::object { + sol::table documents = lua.create_table(); + + documents.new_usertype( + "TextDocument", sol::no_constructor, "file", &TextEditor::TextDocument::filePath); + + return documents; + }); + + LuaEngine::registerHook("editors.text.opened", [](sol::function func) { + QObject::connect( + TextDocumentRegistry::instance(), + &TextDocumentRegistry::documentOpened, + [func](TextEditor::TextDocument *document) { + Utils::expected_str res = LuaEngine::void_safe_call(func, document); + QTC_CHECK_EXPECTED(res); + }); + }); + + LuaEngine::registerHook("editors.text.closed", [](sol::function func) { + QObject::connect( + TextDocumentRegistry::instance(), + &TextDocumentRegistry::documentClosed, + [func](TextEditor::TextDocument *document) { + Utils::expected_str res = LuaEngine::void_safe_call(func, document); + QTC_CHECK_EXPECTED(res); + }); + }); + + LuaEngine::registerHook("editors.text.contentsChanged", [](sol::function func) { + QObject::connect( + TextDocumentRegistry::instance(), + &TextDocumentRegistry::documentContentsChanged, + [func](TextEditor::TextDocument *document) { + Utils::expected_str res = LuaEngine::void_safe_call(func, document); + QTC_CHECK_EXPECTED(res); + }); + }); + + LuaEngine::registerHook("editors.text.currentChanged", [](sol::function func) { + QObject::connect( + TextDocumentRegistry::instance(), + &TextDocumentRegistry::currentDocumentChanged, + [func](TextEditor::TextDocument *document) { + Utils::expected_str res = LuaEngine::void_safe_call(func, document); + QTC_CHECK_EXPECTED(res); + }); + }); +} + +} // namespace Lua::Internal + +#include "textdocument.moc" diff --git a/src/plugins/lua/lua.qbs b/src/plugins/lua/lua.qbs index 1b9bdb74e04..fc4aa71ba8b 100644 --- a/src/plugins/lua/lua.qbs +++ b/src/plugins/lua/lua.qbs @@ -33,8 +33,6 @@ QtcPlugin { "action.cpp", "async.cpp", "core.cpp", - "documents.cpp", - "documents.h", "fetch.cpp", "gui.cpp", "hook.cpp", @@ -45,6 +43,7 @@ QtcPlugin { "messagemanager.cpp", "qtcprocess.cpp", "settings.cpp", + "textdocument.cpp", "utils.cpp", ] diff --git a/src/plugins/lua/luaplugin.cpp b/src/plugins/lua/luaplugin.cpp index ade60166f3e..11e60b5cbb0 100644 --- a/src/plugins/lua/luaplugin.cpp +++ b/src/plugins/lua/luaplugin.cpp @@ -35,7 +35,6 @@ namespace Lua::Internal { void addActionModule(); void addAsyncModule(); void addCoreModule(); -void addDocumentsModule(); void addFetchModule(); void addGuiModule(); void addHookModule(); @@ -46,6 +45,7 @@ void addMessageManagerModule(); void addProcessModule(); void addQtModule(); void addSettingsModule(); +void addTextDocumentsModule(); void addUtilsModule(); class LuaJsExtension : public QObject @@ -251,7 +251,6 @@ public: addActionModule(); addAsyncModule(); addCoreModule(); - addDocumentsModule(); addFetchModule(); addGuiModule(); addHookModule(); @@ -262,6 +261,7 @@ public: addProcessModule(); addQtModule(); addSettingsModule(); + addTextDocumentsModule(); addUtilsModule(); Core::JsExpander::registerGlobalObject("Lua", [] { return new LuaJsExtension(); }); diff --git a/src/plugins/lua/meta/documents.lua b/src/plugins/lua/meta/documents.lua deleted file mode 100644 index e33ef19ec7c..00000000000 --- a/src/plugins/lua/meta/documents.lua +++ /dev/null @@ -1,12 +0,0 @@ ----@meta Documents - -local documents = {} - ----@class TextDocument -local TextDocument = {} - ----Set a callback that is called when the document is changed. ----@param callback function The callback function. The callback function should not take any arguments. -function TextDocument:setChangedCallback(callback) end - -return documents diff --git a/src/plugins/lua/meta/qtc.lua b/src/plugins/lua/meta/qtc.lua index c4b1a10bea0..a5a8932dfa1 100644 --- a/src/plugins/lua/meta/qtc.lua +++ b/src/plugins/lua/meta/qtc.lua @@ -34,10 +34,17 @@ QtcPluginDependency = {} ---@class EditorHooks ----@field documentOpened function function(document) ----@field documentClosed function function(document) +---@field documentOpened? function function(document) +---@field documentClosed? function function(document) +---@field text? TextEditorHooks EditorHooks = {} +---@class TextEditorHooks +---@field opened? function function(Documents.TextDocument) +---@field closed? function function(Documents.TextDocument) +---@field currentChanged? function function(Documents.TextDocument) +---@field contentsChanged? function function(Documents.TextDocument) + ---@class Hooks ---@field editors? EditorHooks Hooks = {} diff --git a/src/plugins/lua/meta/textdocument.lua b/src/plugins/lua/meta/textdocument.lua new file mode 100644 index 00000000000..4460a7f210b --- /dev/null +++ b/src/plugins/lua/meta/textdocument.lua @@ -0,0 +1,10 @@ +---@meta TextDocument + +---@class TextDocument +local TextDocument = {} + +---Returns the file path of the document. +---@return FilePath filePath The file path of the document. +function TextDocument:file() end + +return TextDocument