properly parse getters via asm parser
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user