Make function references compiled with old compiler work with new runtime

This commit is contained in:
Alexander Udalov
2015-07-14 21:19:44 +03:00
parent 0295b13cc7
commit 2b541a560e
@@ -16,6 +16,7 @@
package kotlin.reflect.jvm.internal;
import kotlin.jvm.KotlinReflectionNotSupportedError;
import kotlin.jvm.internal.*;
import kotlin.reflect.*;
@@ -43,7 +44,19 @@ public class ReflectionFactoryImpl extends ReflectionFactory {
@Override
public KFunction function(FunctionReference f) {
return new KFunctionFromReferenceImpl(f);
try {
return new KFunctionFromReferenceImpl(f);
}
catch (KotlinReflectionNotSupportedError e) {
// If this function reference is compiled with an older compiler, it doesn't have the newer methods
// (getName(), getOwner(), getSignature()), so the default implementation from FunctionReference will be invoked
// and KotlinReflectionNotSupportedError will be thrown.
// Instead it's much better to use the reference as a KFunction. Yes, it will throw "no kotlin-reflect.jar was found"
// exceptions even if it exists in the classpath. However, at least it can be used as a function (invoke() will work).
// Moreover, old function references were not supposed to be introspected anyway because there was no reflection API back then.
// TODO: drop after M13
return f;
}
}
// Properties