add method reference support to asm parser
This commit is contained in:
@@ -8,7 +8,6 @@
|
|||||||
- references to platform specific impls
|
- references to platform specific impls
|
||||||
|
|
||||||
## Asm
|
## Asm
|
||||||
- method references
|
|
||||||
- equals function for primitive and string + String::equalsIgnoreCase
|
- equals function for primitive and string + String::equalsIgnoreCase
|
||||||
- equals function for registered primitive conversion types
|
- equals function for registered primitive conversion types
|
||||||
- IConst0Fixer: IConst0/1 on its own => false/true
|
- IConst0Fixer: IConst0/1 on its own => false/true
|
||||||
|
|||||||
@@ -46,20 +46,17 @@ public class AsmParser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private AsmParseResult parseLambdaExpression() throws Exception {
|
private AsmParseResult parseLambdaExpression() throws Exception {
|
||||||
var cls = lambda.getClass();
|
var cls = (Class) lambda.getClass();
|
||||||
var loader = cls.getClassLoader();
|
var loader = cls.getClassLoader();
|
||||||
InputStream is;
|
|
||||||
if (cls.getName().contains("$$Lambda$")) {
|
|
||||||
is = loader.getResourceAsStream(cls.getName().split("\\$\\$")[0].replace(".", "/") + ".class");
|
|
||||||
} else {
|
|
||||||
is = loader.getResourceAsStream(cls.getName().replace(".", "/") + ".class");
|
|
||||||
}
|
|
||||||
var writeReplace = cls.getDeclaredMethod("writeReplace");
|
var writeReplace = cls.getDeclaredMethod("writeReplace");
|
||||||
writeReplace.setAccessible(true);
|
writeReplace.setAccessible(true);
|
||||||
var serlambda = (SerializedLambda) writeReplace.invoke(lambda);
|
var serlambda = (SerializedLambda) writeReplace.invoke(lambda);
|
||||||
Object[] args = IntStream.range(0, serlambda.getCapturedArgCount()).mapToObj(serlambda::getCapturedArg).toArray();
|
Object[] args = IntStream.range(0, serlambda.getCapturedArgCount()).mapToObj(serlambda::getCapturedArg).toArray();
|
||||||
|
|
||||||
|
var classname = serlambda.getImplClass();
|
||||||
var lambdaname = serlambda.getImplMethodName();
|
var lambdaname = serlambda.getImplMethodName();
|
||||||
|
cls = Class.forName(classname.replace("/", "."));
|
||||||
|
var is = loader.getResourceAsStream(cls.getName().replace(".", "/") + ".class");
|
||||||
|
|
||||||
var cr = new ClassReader(is);
|
var cr = new ClassReader(is);
|
||||||
var visiter = new FilterClassVisitor(Opcodes.ASM9, lambdaname, args);
|
var visiter = new FilterClassVisitor(Opcodes.ASM9, lambdaname, args);
|
||||||
|
|||||||
@@ -159,6 +159,13 @@ public class OptimizedAsmParserTest {
|
|||||||
Assertions.assertEquals("`i` = 1337", act);
|
Assertions.assertEquals("`i` = 1337", act);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMethodReference() throws AsmParseException {
|
||||||
|
String act;
|
||||||
|
act = new OptimizedAsmParser((SerializablePredicate<TestClass>) TestClass::isB).parse().getExpression().toString();
|
||||||
|
Assertions.assertEquals("`b`", act);
|
||||||
|
}
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
public static class TestClass extends SerializableObject {
|
public static class TestClass extends SerializableObject {
|
||||||
public int i = 1;
|
public int i = 1;
|
||||||
@@ -166,5 +173,6 @@ public class OptimizedAsmParserTest {
|
|||||||
public double d;
|
public double d;
|
||||||
public float f;
|
public float f;
|
||||||
public long l;
|
public long l;
|
||||||
|
public boolean b;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user