local M = {} local lazy = require("flutter-tools.lazy") local commands = lazy.require("flutter-tools.commands") ---@module "flutter-tools.commands" local config = lazy.require("flutter-tools.config") ---@module "flutter-tools.config" local dev_tools = lazy.require("flutter-tools.dev_tools") ---@module "flutter-tools.dev_tools" local dap = lazy.require("flutter-tools.dap") ---@module "flutter-tools.dap" local decorations = lazy.require("flutter-tools.decorations") ---@module "flutter-tools.decorations" local guides = lazy.require("flutter-tools.guides") ---@module "flutter-tools.guides" local log = lazy.require("flutter-tools.log") ---@module "flutter-tools.log" local lsp = lazy.require("flutter-tools.lsp") ---@module "flutter-tools.lsp" local outline = lazy.require("flutter-tools.outline") ---@module "flutter-tools.outline" local devices = lazy.require("flutter-tools.devices") ---@module "flutter-tools.devices" local utils = lazy.require("flutter-tools.utils") ---@module "flutter-tools.utils" local api = vim.api local command = function(name, callback, opts) api.nvim_create_user_command(name, callback, opts or {}) end local function setup_commands() -- Commands command("FlutterRun", function(data) commands.run_command(data.args) end, { nargs = "*" }) command("FlutterDebug", function(data) commands.run_command(data.args, true) end, { nargs = "*" }) command("FlutterLspRestart", lsp.restart) command("FlutterAttach", function(data) commands.attach(data.args) end, { nargs = "*" }) command("FlutterDetach", commands.detach) command("FlutterReload", commands.reload) command("FlutterRestart", commands.restart) command("FlutterQuit", commands.quit) command("FlutterVisualDebug", commands.visual_debug) command("FlutterChangeTargetPlatform", commands.change_target_platform) command("FlutterToggleBrightness", commands.brightness) -- Lists command("FlutterDevices", devices.list_devices) command("FlutterEmulators", devices.list_emulators) --- Outline command("FlutterOutlineOpen", outline.open) command("FlutterOutlineToggle", outline.toggle) --- Dev tools command("FlutterDevTools", dev_tools.start) command("FlutterDevToolsActivate", dev_tools.activate) command("FlutterCopyProfilerUrl", commands.copy_profiler_url) command("FlutterOpenDevTools", commands.open_dev_tools) command("FlutterInspectWidget", commands.inspect_widget) command("FlutterPubGet", commands.pub_get) command("FlutterPubUpgrade", function(data) commands.pub_upgrade_command(data.args) end, { nargs = "*", }) --- Log command("FlutterLogClear", log.clear) command("FlutterLogToggle", log.toggle) --- LSP command("FlutterSuper", lsp.dart_lsp_super) command("FlutterReanalyze", lsp.dart_reanalyze) command("FlutterRename", function() require("flutter-tools.lsp.rename").rename() end) end local _setup_started = false ---Initialise various plugin modules local function start() if not _setup_started then _setup_started = true setup_commands() dap.setup(config) if config.widget_guides.enabled then guides.setup() end if config.decorations then decorations.apply(config.decorations) end end end local AUGROUP = api.nvim_create_augroup("FlutterToolsGroup", { clear = true }) ---Create autocommands for the plugin local function setup_autocommands() local autocmd = api.nvim_create_autocmd -- delay plugin setup till we enter a dart file autocmd({ "BufEnter" }, { group = AUGROUP, pattern = { "*.dart", "pubspec.yaml" }, once = true, callback = start, }) if config.lsp.color.enabled then autocmd({ "BufEnter", "TextChanged", "InsertLeave" }, { group = AUGROUP, pattern = { "*.dart" }, callback = function() lsp.document_color() end, }) -- NOTE: we piggyback of this event to check for when the server is first initialized autocmd({ "User" }, { group = AUGROUP, pattern = utils.events.LSP_ANALYSIS_COMPLETED, once = true, callback = function() lsp.document_color() end, }) end autocmd({ "BufWritePost" }, { group = AUGROUP, pattern = { "*.dart" }, callback = function() commands.reload(true) end, }) autocmd({ "BufWritePost" }, { group = AUGROUP, pattern = { "*/pubspec.yaml" }, callback = function() commands.pub_get() end, }) autocmd({ "BufEnter" }, { group = AUGROUP, pattern = { log.filename }, callback = function() log.__resurrect() end, }) autocmd({ "VimLeavePre" }, { group = AUGROUP, pattern = { "*" }, callback = function() dev_tools.stop() end, }) end ---@param opts flutter.ProjectConfig | flutter.ProjectConfig[] Project-specific configuration function M.setup_project(opts) config.setup_project(opts) start() end ---Entry point for this plugin ---@param user_config flutter.Config Configuration options for flutter-tools function M.setup(user_config) config.set(user_config) setup_autocommands() end return M