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 collection = varStack.pop();
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
var field = findField(owner, name);
} else if (descriptor.startsWith("()")) {
var method = Class.forName(owner.replace("/", ".")).getDeclaredMethod(name);
var res = new OptimizedAsmParser(method).parse();
var field = res.getAccessedFields().stream().findFirst();
if (field.isPresent()) {
var v = varStack.pop();
if (v instanceof ParameterExpression p) {

View File

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