From c79c4148596ee4f5d022a25c40d77e0ea9358ad5 Mon Sep 17 00:00:00 2001 From: DarthMooMancer <107283522+DarthMooMancer@users.noreply.github.com> Date: Thu, 17 Apr 2025 09:59:11 -0400 Subject: [PATCH] Changing how lanaguages are handled with templates --- .gitignore | 1 + lua/Polydev/configs.lua | 21 ++++--- lua/Polydev/init.lua | 40 +++++++------ lua/Polydev/languages/java.lua | 17 ------ lua/Polydev/languages/python.lua | 45 --------------- lua/Polydev/templates.lua | 99 ++++++++++++++++++++++++++++++++ 6 files changed, 136 insertions(+), 87 deletions(-) create mode 100644 lua/Polydev/templates.lua diff --git a/.gitignore b/.gitignore index 6ca104a..ccf637e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.polydev LICENSE +Lua_Annotation_CheatSheet/ diff --git a/lua/Polydev/configs.lua b/lua/Polydev/configs.lua index 386cdf5..d47b643 100644 --- a/lua/Polydev/configs.lua +++ b/lua/Polydev/configs.lua @@ -1,9 +1,10 @@ local M = {} + ---@class Keybinds ---@field [string] string --- ----@class Language ----@field project_root string +---@class ConfigsLanguage +---@field project_root? string ---@field keybinds? Keybinds -- ? makes fields optional ---@field build_attributes? string --- @@ -17,13 +18,13 @@ local M = {} ---@field relativenumber boolean --- ---@class Defaults ----@field html Language ----@field rust Language ----@field java Language ----@field python Language ----@field lua Language ----@field c Language ----@field cpp Language +---@field html ConfigsLanguage +---@field rust ConfigsLanguage +---@field java ConfigsLanguage +---@field python ConfigsLanguage +---@field lua ConfigsLanguage +---@field c ConfigsLanguage +---@field cpp ConfigsLanguage ---@field terminal Terminal ---@type Defaults @@ -87,12 +88,14 @@ M.defaults = { } } +---@type string[] M.user_config = {} function M.setup(user_opts) M.user_config = vim.tbl_deep_extend("force", {}, M.defaults, user_opts or {}) end +---@param lang string function M.get(lang) return M.user_config[lang] or {} end diff --git a/lua/Polydev/init.lua b/lua/Polydev/init.lua index 37e75af..c8148b2 100644 --- a/lua/Polydev/init.lua +++ b/lua/Polydev/init.lua @@ -1,16 +1,21 @@ +---@module "Polydev.configs" +local config = require("Polydev.configs") + +---@module "Polydev.utils" +local utils = require("Polydev.utils") + +---@module "Polydev.templates" +local templates = require("Polydev.templates") + +---@type table local M = {} +---@type table M.loaded_languages = {} -M.config = require("Polydev.configs") -M.utils = require("Polydev.utils") -M.java = require("Polydev.languages.java") -M.c = require("Polydev.languages.c") -M.cpp = require("Polydev.languages.cpp") -M.lua = require("Polydev.languages.lua") -M.python = require("Polydev.languages.python") -M.rust = require("Polydev.languages.rust") -M.html = require("Polydev.languages.html") +---@param lang string +---@param opts table? +---@return boolean function M.load_language_module(lang, opts) if M.loaded_languages[lang] then return true end @@ -25,11 +30,12 @@ function M.load_language_module(lang, opts) end function M.create_project() + local opts = {} vim.ui.input({ prompt = "Enter language for project: " }, function(lang) if not lang or lang == "" then return print("Project creation canceled.") end - - if M.load_language_module(lang) and M.loaded_languages[lang].create_project then - M.loaded_languages[lang].create_project() + opts = vim.tbl_deep_extend("force", {}, config.get(lang), opts or {}) + if M.load_language_module(lang) and templates.projects[lang] and templates.projects[lang].run then + templates.create_project(lang, opts.project_root) else print("Error: No project creation method for " .. lang) end @@ -48,13 +54,14 @@ function M.create_new_file() end) end +---@param opts table function M.setup(opts) opts = opts or {} - M.config.setup(opts) - M.utils.setup(opts) + config.setup(opts) + utils.setup(opts) for lang, user_opts in pairs(opts) do - local default = M.config.defaults[lang] or {} - M.config.user_config[lang] = vim.tbl_deep_extend("force", default, user_opts) + local default = config.defaults[lang] or {} + config.user_config[lang] = vim.tbl_deep_extend("force", default, user_opts) end vim.api.nvim_create_user_command("NewProject", M.create_project, {}) @@ -70,4 +77,5 @@ function M.setup(opts) }) end +---@return table return M diff --git a/lua/Polydev/languages/java.lua b/lua/Polydev/languages/java.lua index ededd78..b38ab1b 100644 --- a/lua/Polydev/languages/java.lua +++ b/lua/Polydev/languages/java.lua @@ -21,23 +21,6 @@ function M.setup(opts) end end -function M.create_project() - vim.ui.input({ prompt = "Enter project name: " }, function(project_name) - if not project_name or project_name == "" then return print("Project creation canceled.") end - local project_root = vim.fn.expand(M.opts.project_root) .. "/" .. project_name - for _, path in ipairs({ "/src", "/build" }) do vim.fn.mkdir(project_root .. path, "p") end - - local main_java_content = [[ -public class Main { - public static void main(String[] args) { - System.out.println("Hello, World!"); - } -} -]] - utils.write_file(project_root .. "/src/Main.java", main_java_content) - end) -end - function M.create_new_file() vim.ui.input({ prompt = "Enter class name: " }, function(class_name) if not class_name or class_name == "" then return print("Class creation canceled.") end diff --git a/lua/Polydev/languages/python.lua b/lua/Polydev/languages/python.lua index 7f5e666..30f66a9 100644 --- a/lua/Polydev/languages/python.lua +++ b/lua/Polydev/languages/python.lua @@ -42,51 +42,6 @@ function M.get_project_root() return nil end -function M.create_project() - vim.ui.input({ prompt = "Enter project name: " }, function(project_name) - if not project_name or project_name == "" then - print("Project creation canceled.") - return - end - - local project_root = vim.fn.expand(M.opts.project_root) .. "/" .. project_name - for _, path in ipairs({ "/include" }) do - vim.fn.mkdir(project_root .. path, "p") - end - - utils.write_file(project_root .. "/main.py", [[ -def main(): - print("Hello, World!") - -if __name__ == "__main__": - main() -]]) - - utils.write_file(project_root .. "/include/__init__.py", "") - utils.write_file(project_root .. "/requirements.txt", "") - utils.write_file(project_root .. "/setup.py", string.format([[ -from setuptools import setup, find_packages - -setup( - name="%s", - version="0.1.0", - packages=find_packages(), - install_requires=[], - python_requires=">=3.6", -) -]], project_name)) - - vim.cmd("edit " .. project_root .. "/main.py") - local venv_path = project_root .. "/venv" - vim.fn.system("python3 -m venv " .. venv_path) - vim.g.python3_host_prog = venv_path .. "/bin/python" - vim.fn.setenv("VIRTUAL_ENV", venv_path) - vim.fn.setenv("PATH", venv_path .. "/bin:" .. vim.fn.getenv("PATH")) - - print("Virtual environment activated for " .. project_name) - end) -end - function M.create_new_file() vim.ui.input({ prompt = "Enter file name: " }, function(file_name) if not file_name or file_name == "" then diff --git a/lua/Polydev/templates.lua b/lua/Polydev/templates.lua new file mode 100644 index 0000000..f06f46b --- /dev/null +++ b/lua/Polydev/templates.lua @@ -0,0 +1,99 @@ +---@module 'Polydev.utils' +local utils = require("Polydev.utils") +--- +---@type table +local M = {} + +---@class TemplateLanguage +---@field run fun(project_name: string, project_root: string): nil + +---@class Projects +---@field java TemplateLanguage +---@field python TemplateLanguage +---@field lua TemplateLanguage +---@alias TemplatesLanguageName "java" | "python" | "lua" + +---@type Projects +M.projects = { + java = { + run = function(project_name, project_root) + local full_project_root = vim.fn.expand(project_root) .. "/" .. project_name + for _, path in ipairs({ "/src", "/build" }) do vim.fn.mkdir(full_project_root .. path, "p") end + + local main_java_content = [[ +public class Main { + public static void main(String[] args) { + System.out.println("Hello, World!"); + } +} +]] + utils.write_file(full_project_root .. "/src/Main.java", main_java_content) + return nil + end + }, + python = { + run = function(project_name, project_root) + local full_project_root = vim.fn.expand(project_root) .. "/" .. project_name + vim.fn.mkdir(full_project_root .. "/include", "p") + + utils.write_file(full_project_root .. "/main.py", [[ +def main(): + print("Hello, World!") + +if __name__ == "__main__": + main() +]]) + + utils.write_file(full_project_root .. "/include/__init__.py", "") + utils.write_file(full_project_root .. "/requirements.txt", "") + utils.write_file(full_project_root .. "/setup.py", string.format([[ +from setuptools import setup, find_packages + +setup( + name="%s", + version="0.1.0", + packages=find_packages(), + install_requires=[], + python_requires=">=3.6", +) +]], project_name)) + + vim.cmd("edit " .. full_project_root .. "/main.py") + local venv_path = full_project_root .. "/venv" + vim.fn.system("python3 -m venv " .. venv_path) + vim.g.python3_host_prog = venv_path .. "/bin/python" + vim.fn.setenv("VIRTUAL_ENV", venv_path) + vim.fn.setenv("PATH", venv_path .. "/bin:" .. vim.fn.getenv("PATH")) + + print("Virtual environment activated for " .. project_name) + return nil + end + }, + lua = { + run = function(project_name, project_root) + local full_project_root = vim.fn.expand(project_root) .. "/" .. project_name + for _, path in ipairs({ "/lua/" .. project_name }) do vim.fn.mkdir(full_project_root .. path, "p") end + + utils.write_file(full_project_root .. "/lua/" .. project_name .. "/init.lua", [[ +local M = {} + +return M +]]) + utils.write_file(full_project_root .. "/" .. project_name .. ".polydev", "[[DO NOT REMOVE THIS FILE]]") + vim.cmd("edit " .. full_project_root .. "/lua/" .. project_name .. "/init.lua") + return nil + end + }, +} + +---@param lang TemplatesLanguageName +---@param project_root string +function M.create_project(lang, project_root) + vim.ui.input({ prompt = "Enter project name: " }, function(project_name) + if not project_name or project_name == "" then return print("Project creation canceled.") end + M.projects[lang].run(project_name, project_root) + end) +end + +---@return any +return M