feat: generate dummies for all abstract methods, not just targets

This commit is contained in:
zaaarf 2023-04-12 17:08:56 +02:00
parent 5973cf6d95
commit 527cef56e6
No known key found for this signature in database
GPG key ID: 82240E075E31FA4C
2 changed files with 19 additions and 16 deletions

View file

@ -346,7 +346,7 @@ public class LilleroProcessor extends AbstractProcessor {
.addMethod(buildStringReturnMethod("targetClass", obfuscateInjectorMetadata ? targetClass.fqnObf : targetClass.fqn)) .addMethod(buildStringReturnMethod("targetClass", obfuscateInjectorMetadata ? targetClass.fqnObf : targetClass.fqn))
.addMethod(buildStringReturnMethod("methodName", obfuscateInjectorMetadata ? target.nameObf : target.name)) .addMethod(buildStringReturnMethod("methodName", obfuscateInjectorMetadata ? target.nameObf : target.name))
.addMethod(buildStringReturnMethod("methodDesc", obfuscateInjectorMetadata ? target.descriptorObf : target.descriptor)) .addMethod(buildStringReturnMethod("methodDesc", obfuscateInjectorMetadata ? target.descriptorObf : target.descriptor))
.addMethods(generateDummies(targets)) .addMethods(generateDummies(cl))
.addMethod(generateInjector(toGenerate.get(injName), this.processingEnv)) .addMethod(generateInjector(toGenerate.get(injName), this.processingEnv))
.build(); .build();

View file

@ -13,11 +13,7 @@ import ftbsc.lll.proxies.impl.FieldProxy;
import ftbsc.lll.proxies.impl.MethodProxy; import ftbsc.lll.proxies.impl.MethodProxy;
import javax.annotation.processing.ProcessingEnvironment; import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.Element; import javax.lang.model.element.*;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.VariableElement;
import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
import static ftbsc.lll.processor.tools.ASTUtils.getProxyType; import static ftbsc.lll.processor.tools.ASTUtils.getProxyType;
@ -102,7 +98,7 @@ public class JavaPoetUtils {
con.addStatement( con.addStatement(
"$L.setModifiers($L)", "$L.setModifiers($L)",
builderName, builderName,
target == null ? 0 :mapModifiers(target.getModifiers()) target == null ? 0 : mapModifiers(target.getModifiers())
); );
//set type(s) //set type(s)
@ -121,19 +117,26 @@ public class JavaPoetUtils {
} }
/** /**
* Generates a {@link HashSet} of dummy overrides given a {@link Collection} stubs. * Generates a {@link HashSet} of dummy overrides for every abstract method in a given class,
* @param dummies the stubs * represented as a {@link TypeElement}.
* @param clazz the given class
* @return a {@link HashSet} containing the generated {@link MethodSpec}s * @return a {@link HashSet} containing the generated {@link MethodSpec}s
* @since 0.5.0 * @since 0.5.0
*/ */
public static HashSet<MethodSpec> generateDummies(Collection<ExecutableElement> dummies) { public static HashSet<MethodSpec> generateDummies(TypeElement clazz) {
HashSet<MethodSpec> specs = new HashSet<>(); HashSet<MethodSpec> specs = new HashSet<>();
for(ExecutableElement d : dummies) clazz
if(d.getModifiers().contains(Modifier.ABSTRACT)) .getEnclosedElements()
specs.add(MethodSpec.overriding(d) .stream()
.addStatement("throw new $T($S)", RuntimeException.class, "This is a stub and should not have been called") .filter(e -> e instanceof ExecutableElement)
.build() .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; return specs;
} }