aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/ftbsc/lll/processor/tools/JavaPoetUtils.java
diff options
context:
space:
mode:
author zaaarf <me@zaaarf.foo>2024-01-24 17:21:42 +0100
committer zaaarf <me@zaaarf.foo>2024-01-24 17:21:42 +0100
commitbf32e56a863e83b82efe9732c585979afb0e62c3 (patch)
tree19ffb009b3159665b6f457f5df34855a96101153 /src/main/java/ftbsc/lll/processor/tools/JavaPoetUtils.java
parent3dd86a41872585b7cbba4f6b4e1407316bf889c3 (diff)
chore: internal reorganisation
Diffstat (limited to 'src/main/java/ftbsc/lll/processor/tools/JavaPoetUtils.java')
-rw-r--r--src/main/java/ftbsc/lll/processor/tools/JavaPoetUtils.java170
1 files changed, 0 insertions, 170 deletions
diff --git a/src/main/java/ftbsc/lll/processor/tools/JavaPoetUtils.java b/src/main/java/ftbsc/lll/processor/tools/JavaPoetUtils.java
deleted file mode 100644
index 5709574..0000000
--- a/src/main/java/ftbsc/lll/processor/tools/JavaPoetUtils.java
+++ /dev/null
@@ -1,170 +0,0 @@
-package ftbsc.lll.processor.tools;
-
-import com.squareup.javapoet.*;
-import ftbsc.lll.processor.annotations.Find;
-import ftbsc.lll.processor.annotations.Target;
-import ftbsc.lll.processor.tools.containers.ClassContainer;
-import ftbsc.lll.processor.tools.containers.FieldContainer;
-import ftbsc.lll.processor.tools.containers.InjectorInfo;
-import ftbsc.lll.processor.tools.containers.MethodContainer;
-import ftbsc.lll.proxies.ProxyType;
-import ftbsc.lll.proxies.impl.FieldProxy;
-import ftbsc.lll.proxies.impl.MethodProxy;
-
-import javax.annotation.processing.ProcessingEnvironment;
-import javax.lang.model.element.*;
-import java.util.HashSet;
-
-import static ftbsc.lll.processor.tools.ASTUtils.getProxyType;
-import static ftbsc.lll.processor.tools.ASTUtils.mapModifiers;
-
-/**
- * Collection of static utils that rely on JavaPoet to function.
- */
-public class JavaPoetUtils {
- /**
- * Builds a {@link MethodSpec} for a public method whose body simply returns a {@link String}.
- * @param name the name of the method
- * @param returnString the {@link String} to return
- * @return the built {@link MethodSpec}
- */
- public static MethodSpec buildStringReturnMethod(String name, String returnString) {
- return MethodSpec.methodBuilder(name)
- .addModifiers(Modifier.PUBLIC)
- .addAnnotation(Override.class)
- .returns(String.class)
- .addStatement("return $S", returnString)
- .build();
- }
-
- /**
- * Appends to a given {@link MethodSpec.Builder} definitions for a proxy.
- * @param var the {@link VariableElement} representing the proxy
- * @param stub the stub {@link ExecutableElement} if present or relevant, null otherwise
- * @param t the {@link Target} relevant to this finder if present or relevant, null otherwise
- * @param con the {@link MethodSpec.Builder} to append to
- * @param options the {@link ProcessorOptions} to be used
- * @since 0.5.0
- */
- public static void appendMemberFinderDefinition(
- VariableElement var, ExecutableElement stub, Target t,
- MethodSpec.Builder con, ProcessorOptions options) {
- ProxyType type = getProxyType(var);
- if(type != ProxyType.METHOD && type != ProxyType.FIELD)
- return; //this method is irrelevant to everyone else
-
- //we need this stuff
- Find f = var.getAnnotation(Find.class);
- final boolean isMethod = type == ProxyType.METHOD;
- final String builderName = var.getSimpleName().toString() + "Builder";
-
- String descriptorObf, nameObf;
- ClassContainer parent;
- Element target;
-
- if(isMethod) {
- MethodContainer mc = MethodContainer.from(stub, t, f, options);
- descriptorObf = mc.descriptorObf;
- nameObf = mc.data.nameMapped;
- parent = mc.parent;
- target = mc.elem;
- } else {
- FieldContainer fc = FieldContainer.from(var, options);
- descriptorObf = fc.descriptorObf;
- nameObf = fc.data.nameMapped;
- parent = fc.parent;
- target = fc.elem;
- }
-
- //initialize builder
- con.addStatement("$T $L = $T.builder($S)",
- isMethod ? MethodProxy.Builder.class : FieldProxy.Builder.class,
- builderName, //variable name is always unique by definition
- isMethod ? MethodProxy.class : FieldProxy.class,
- nameObf
- );
-
- //set parent
- con.addStatement(
- "$L.setParent($S, $L)",
- builderName,
- parent.data.nameMapped.replace('/', '.'),
- parent.elem == null ? 0 : mapModifiers(parent.elem.getModifiers())
- );
-
- //set modifiers
- con.addStatement(
- "$L.setModifiers($L)",
- builderName,
- target == null ? 0 : mapModifiers(target.getModifiers())
- );
-
- //set type(s)
- con.addStatement(
- "$L.setDescriptor($S)",
- builderName,
- descriptorObf
- );
-
- //build and set
- con.addStatement(
- "super.$L = $L.build()",
- var.getSimpleName().toString(),
- builderName
- );
- }
-
- /**
- * Generates a {@link HashSet} of dummy overrides for every abstract method in a given class,
- * represented as a {@link TypeElement}.
- * @param clazz the given class
- * @return a {@link HashSet} containing the generated {@link MethodSpec}s
- * @since 0.5.0
- */
- public static HashSet<MethodSpec> generateDummies(TypeElement clazz) {
- HashSet<MethodSpec> specs = new HashSet<>();
- clazz
- .getEnclosedElements()
- .stream()
- .filter(e -> e instanceof ExecutableElement)
- .map(e -> (ExecutableElement) e)
- .forEach(e -> {
- if(e.getModifiers().contains(Modifier.ABSTRACT))
- specs.add(MethodSpec.overriding(e)
- .addStatement("throw new $T($S)", RuntimeException.class, "This is a stub and should not have been called")
- .build()
- );
- });
- return specs;
- }
-
- /**
- * Generates the wrapper around a certain injector.
- * @param inj the {@link InjectorInfo} carrying the information about the target injector
- * @param env the {@link ProcessingEnvironment} to perform the operation in
- * @return the generated {@link MethodSpec} for the injector
- * @since 0.6.0
- */
- public static MethodSpec generateInjector(InjectorInfo inj, ProcessingEnvironment env) {
- MethodSpec.Builder injectBuilder = MethodSpec.methodBuilder("inject")
- .addModifiers(Modifier.PUBLIC)
- .returns(void.class)
- .addAnnotation(Override.class)
- .addParameter(ParameterSpec.builder(
- TypeName.get(env
- .getElementUtils()
- .getTypeElement("org.objectweb.asm.tree.ClassNode").asType()), "clazz")
- .build())
- .addParameter(ParameterSpec.builder(
- TypeName.get(env
- .getElementUtils()
- .getTypeElement("org.objectweb.asm.tree.MethodNode").asType()), "main")
- .build());
-
- if(inj.injector.getParameters().size() == 2)
- injectBuilder.addStatement("super.$L(clazz, main)", inj.injector.getSimpleName());
- else injectBuilder.addStatement("super.$L(main)", inj.injector.getSimpleName());
-
- return injectBuilder.build();
- }
-}