M .gitignore => .gitignore +1 -0
@@ 12,6 12,7 @@
!fontconfig/
!foot/
!git/
+!java-templates/
!mako/
!mbsync/
!neomutt/
A java-templates/class.java => java-templates/class.java +5 -0
@@ 0,0 1,5 @@
+package {package};
+
+public class {class} {{
+ public {class}() {{ }}
+}}
A java-templates/mixin/accessor.java => java-templates/mixin/accessor.java +10 -0
@@ 0,0 1,10 @@
+package {package};
+
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Accessor;
+
+@Mixin(Example.class)
+public interface {class} {{
+ @Accessor("example")
+ public int getExample();
+}}
A java-templates/mixin/inject.java => java-templates/mixin/inject.java +12 -0
@@ 0,0 1,12 @@
+package {package};
+
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+@Mixin(Example.class)
+public abstract final class {class} {{
+ @Inject(at = @At("HEAD"), method = "")
+ private void inject(CallbackInfo info) {{ }}
+}}
A java-templates/mixin/invoker.java => java-templates/mixin/invoker.java +10 -0
@@ 0,0 1,10 @@
+package {package};
+
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Invoker;
+
+@Mixin(Example.class)
+public interface {class} {{
+ @Invoker("example")
+ public int example(int number);
+}}
A scripts/jimport => scripts/jimport +46 -0
@@ 0,0 1,46 @@
+#!/usr/bin/env python3
+
+# Generates imports for Java stuff
+
+from glob import iglob
+import os
+import sys
+import zipfile
+
+class_map = {}
+
+def list_classes(jar):
+ global class_map
+ zfile = zipfile.ZipFile(jar)
+ for member in zfile.namelist():
+ # Don't care about nested classes or non-classes
+ if member.endswith(".class") and '$' not in member:
+ components = member[:-6].split('/')
+ name = components[-1]
+ if name not in class_map:
+ class_map[name] = []
+ class_map[name].append('.'.join(components))
+
+if len(sys.argv) != 2:
+ print("Usage: jimport <class>", file=sys.stderr)
+ exit(1)
+_, class_name = sys.argv
+
+home = os.getenv('HOME')
+root = os.getcwd()
+if root == home:
+ print("Do not run this in the home directory", file=sys.stderr)
+ exit(1)
+while not os.access(os.path.join(root, ".gradle"), os.F_OK | os.R_OK):
+ if root == '/' or root == home:
+ print("Could not find '.gradle'", file=sys.stderr)
+ exit(1)
+ root, _ = os.path.split(root)
+
+for jar in iglob(os.path.join(root, ".gradle/**/*.jar"), recursive=True):
+ list_classes(jar)
+
+if class_name not in class_map:
+ print(f"No such class '{class_name}'", file=sys.stderr)
+ exit(1)
+print('\n'.join(class_map[class_name]))
A scripts/jnew => scripts/jnew +42 -0
@@ 0,0 1,42 @@
+#!/usr/bin/env python3
+
+# Generates java files from templates
+
+import os
+import sys
+
+TEMPLATES_PATH = os.path.expanduser("~/.config/java-templates")
+
+def package_path(path):
+ # FIXME: this is ugly
+ components = []
+ while path != '/':
+ path, part = os.path.split(path)
+ components.append(part)
+ components.reverse()
+ for i in range(len(components) - 3):
+ if components[i] == 'src' and components[i + 2] == 'java':
+ return '.'.join(components[i + 3:])
+ return None
+
+def render_template(file, package, class_name):
+ template = file.read()
+ return template.format(**{"package": package, "class": class_name})
+
+if len(sys.argv) != 3:
+ print("Usage: jnew <template> <class name>", file=sys.stderr)
+ exit(1)
+_, template, class_name = sys.argv
+
+package = package_path(os.getcwd())
+if not package:
+ print("Could not find src/<sourceset>/java. Is this not a Java project?", file=sys.stderr)
+ exit(1)
+
+try:
+ template_file = open(os.path.join(TEMPLATES_PATH, template + ".java"))
+except FileNotFoundError:
+ print(f"No such template '{template}'", file=sys.stderr)
+ exit(1)
+class_file = open(class_name + ".java", "w")
+class_file.write(render_template(template_file, package, class_name))