properly parse getters via asm parser

This commit is contained in:
wea_ondara
2022-09-10 13:00:32 +02:00
parent de17b8985a
commit 4e90b7cc90
2 changed files with 13 additions and 11 deletions

View File

@@ -114,8 +114,10 @@ class FilterMethodVisitor extends MethodVisitor {
var element = varStack.pop(); var element = varStack.pop();
var collection = varStack.pop(); var collection = varStack.pop();
varStack.push(new BinaryExpression(element, collection, BinaryExpression.Operator.IN)); varStack.push(new BinaryExpression(element, collection, BinaryExpression.Operator.IN));
} else if (name.startsWith("get") && name.length() > 3 && descriptor.startsWith("()")) { //hacky getter support, TODO replace this with proper getter eval later } else if (descriptor.startsWith("()")) {
var field = findField(owner, name); var method = Class.forName(owner.replace("/", ".")).getDeclaredMethod(name);
var res = new OptimizedAsmParser(method).parse();
var field = res.getAccessedFields().stream().findFirst();
if (field.isPresent()) { if (field.isPresent()) {
var v = varStack.pop(); var v = varStack.pop();
if (v instanceof ParameterExpression p) { if (v instanceof ParameterExpression p) {

View File

@@ -1,7 +1,7 @@
package jef.model.annotations.processors; package jef.model.annotations.processors;
import jef.asm.OptimizedAsmParser;
import jef.model.DbEntityBuilder; import jef.model.DbEntityBuilder;
import jef.model.DbField;
import jef.model.DbFieldBuilder; import jef.model.DbFieldBuilder;
import jef.model.ModelBuilder; import jef.model.ModelBuilder;
import jef.model.ModelException; import jef.model.ModelException;
@@ -13,7 +13,6 @@ import java.lang.reflect.Method;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Locale;
abstract class KeyProcessorBase<K, T extends Annotation> implements AnnotationProcessor { abstract class KeyProcessorBase<K, T extends Annotation> implements AnnotationProcessor {
private final Class<T> annotationClass; private final Class<T> annotationClass;
@@ -62,19 +61,20 @@ abstract class KeyProcessorBase<K, T extends Annotation> implements AnnotationPr
private Field getField(DbEntityBuilder<? extends SerializableObject> entity, String fieldOrGetter) { private Field getField(DbEntityBuilder<? extends SerializableObject> entity, String fieldOrGetter) {
Method getter = null; Method getter = null;
try { try {
getter = entity.type().get().getDeclaredMethod(fieldOrGetter); getter = entity.type().orElseThrow().getDeclaredMethod(fieldOrGetter);
} catch (NoSuchMethodException e) { } catch (NoSuchMethodException ignored) {
} }
Field field = null; Field field = null;
try { try {
if (getter != null && getter.getName().length() > 3 && getter.getName().startsWith("get")) { if (getter != null) {
var name = getter.getName().substring(3, 4).toLowerCase(Locale.ROOT) + getter.getName().substring(4); //TODO HACK var res = new OptimizedAsmParser(getter ).parse();
field = entity.type().get().getDeclaredField(name); var name = res.getAccessedFields().stream().findFirst().orElseThrow().getName();
field = entity.type().orElseThrow().getDeclaredField(name);
} else { } else {
field = entity.type().get().getDeclaredField(fieldOrGetter); field = entity.type().orElseThrow().getDeclaredField(fieldOrGetter);
} }
} catch (NoSuchFieldException e) { } catch (NoSuchFieldException ignored) {
} }
if (field == null) { if (field == null) {