~yerinalexey/dotfiles

a22108768860f0e3080066df742e495331747ee4 — Alexey Yerin 3 months ago 78e696a
scripts: add jnew and jimport

Tired of Java
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))