From a1fc0083551c80494faa328e464fb401a581a5b9 Mon Sep 17 00:00:00 2001
From: Squibid <me@zacharyscheiman.com>
Date: Thu, 28 Nov 2024 22:33:06 -0500
Subject: revise java snippets

---
 lua/snippets/java.lua | 155 ++++++++++++++++++++++++++++++++------------------
 1 file changed, 100 insertions(+), 55 deletions(-)

(limited to 'lua')

diff --git a/lua/snippets/java.lua b/lua/snippets/java.lua
index 1227168..50fef37 100644
--- a/lua/snippets/java.lua
+++ b/lua/snippets/java.lua
@@ -1,92 +1,137 @@
 require('core.snippets.shorthands')
 require('core.snippets.functions')
 
+--- shortcut to choose between java access modifiers
+---@param idx number index of the node
+---@return table choice_node
+local function access_modifiers(idx)
+  return c(idx, {
+    t("public "),
+    t("private "),
+    t("protected "),
+    t("default "),
+  })
+end
+
+--- shortcut to choose between java modifiers
+---@param idx number index of the node
+---@return table choice_node
+local function modifiers(idx)
+  return c(idx, {
+    t(""),
+    t("abstract "),
+    t("final ")
+  })
+end
+
+--- find the current class and return its name if not available defaults to
+--- the file name
+---@return string
+local function java_class()
+  -- set the starting node to the node under the cursor
+  local node = require("nvim-treesitter.ts_utils").get_node_at_cursor()
+
+  while node do
+    -- check if we're in a class
+    if node:type() == "class_declaration" then
+      -- find the class name in the class declaration and return it
+      for i = 0, node:child_count() - 1 do
+        local child = node:child(i)
+        if child and child:type() == "identifier" then
+          return vim.treesitter.get_node_text(child, 0)
+        end
+      end
+    end
+    node = node:parent()
+  end
+
+  -- if no class can be found default to the current file name
+  return file_name()
+end
+
+
 return {
   -- method snippet
-  s("fn", {
-    c(1, {
-      t("public "),
-      t("private "),
-    }),
-    c(2, {
-      t("void"),
-      t("String"),
-      t("char"),
-      t("int"),
-      t("double"),
-      t("boolean"),
-      i(nil, "myType"),
-    }),
-    t(" "),
-    i(3, "myFunc"),
+  s({ trig = [[fn\|constr]], trigEngine = "vim" }, {
+    access_modifiers(1),
+    modifiers(2),
+    d(3, function(_, snip)
+      if snip.trigger == "constr" then
+        return sn(nil, {
+          f(java_class, {})
+        })
+      else
+        return sn(nil, {
+          c(1, {
+            t("void"),
+            t("int"),
+            t("double"),
+            t("boolean"),
+            t("String"),
+            t("char"),
+            i(nil, "myType"),
+          }),
+          t(" "),
+          i(2, "myFunc"),
+        })
+      end
+    end, {}),
     t("("),
     i(4),
     t(")"),
     c(5, {
       t(""),
-      sn(nil, {t({ "", " throws " }), i(1)}),
+      sn(nil, { t({ "", " throws " }), i(1, "Error") }),
     }),
-    t({ " {", "\t" }),
-    i(0),
-    t({ "", "}" }),
+    d(6, function(args)
+      if args[1][1] == "abstract " then
+        -- if the function is abstract do not include a body
+        return sn(nil, {
+          t(";")
+        })
+      else
+        -- if the function isn't abstract include a body
+        return sn(nil, {
+          t({ " {", "\t" }),
+          i(0),
+          t({ "", "}" })
+        })
+      end
+    end, { 2 })
   }),
 
   s("main", {
     t({ "public static void main(String[] args) {", "\t" }),
     i(0),
-    t({ "", "}" }),
-  }),
-
-  -- constructor snippet
-  s("constr", {
-    c(1, {
-      t("public "),
-      t("private "),
-      t("protected ")
-    }),
-    f(file_name, {}),
-    t("("),
-    i(2),
-    t(")"),
-    c(3, {
-      t(""),
-      sn(nil, {t({ "", " throws " }), i(1)}),
-    }),
-    t({ " {", "\t" }),
-    i(0),
-    t({ "", "}" }),
+    t({ "", "}" })
   }),
 
   -- class snippet
   s("class", {
-    c(1, {
-      t("public "),
-      t("private "),
-      t("protected "),
-      t("")
-    }),
-    c(2, {
+    access_modifiers(1),
+    modifiers(2),
+    c(3, {
       t("class "),
       t("interface ")
     }),
-    c(3, {
-      i(0, "MyClass"),
-      f(file_name, {})
-    }),
     c(4, {
+      f(file_name, {}),
+      i(0, "MyClass")
+    }),
+    c(5, {
       t(" "),
       sn(nil, { t({" implements "}), i(1), t(" ") }),
       sn(nil, { t({" extends "}), i(1), t(" ") }),
     }),
     t({ "{", "\t" }),
     i(0),
-    t({ "", "}" }),
+    t({ "", "}" })
   }),
 
-  -- pacakge snippet
+  -- pacakage snippet
   s("package", {
     t("package "),
-    f(function(args, parent, user_args)
+    f(function()
       -- get path
       local dir = vim.fn.expand("%:h")
       -- remove prefix
-- 
cgit v1.2.1