/** * Check whether the specified {@link Field} represents a nullable Kotlin type or not. */ public static boolean isNullable(Field field) { KProperty<?> property = ReflectJvmMapping.getKotlinProperty(field); return (property != null && property.getReturnType().isMarkedNullable()); } }
@Nullable private String[] getParameterNames(List<KParameter> parameters) { List<KParameter> filteredParameters = parameters .stream() // Extension receivers of extension methods must be included as they appear as normal method parameters in Java .filter(p -> KParameter.Kind.VALUE.equals(p.getKind()) || KParameter.Kind.EXTENSION_RECEIVER.equals(p.getKind())) .collect(Collectors.toList()); String[] parameterNames = new String[filteredParameters.size()]; for (int i = 0; i < filteredParameters.size(); i++) { KParameter parameter = filteredParameters.get(i); // extension receivers are not explicitly named, but require a name for Java interoperability // $receiver is not a valid Kotlin identifier, but valid in Java, so it can be used here String name = KParameter.Kind.EXTENSION_RECEIVER.equals(parameter.getKind()) ? "$receiver" : parameter.getName(); if (name == null) { return null; } parameterNames[i] = name; } return parameterNames; }
int index = param.getParameterIndex(); if (method != null && index == -1) { KFunction<?> function = ReflectJvmMapping.getKotlinFunction(method); return (function != null && function.getReturnType().isMarkedNullable()); Predicate<KParameter> predicate = null; if (method != null) { function = ReflectJvmMapping.getKotlinFunction(method); predicate = p -> KParameter.Kind.VALUE.equals(p.getKind()); function = ReflectJvmMapping.getKotlinFunction(ctor); predicate = p -> KParameter.Kind.VALUE.equals(p.getKind()) || KParameter.Kind.INSTANCE.equals(p.getKind()); List<KParameter> parameters = function.getParameters(); KParameter parameter = parameters .stream() .collect(Collectors.toList()) .get(index); return (parameter.getType().isMarkedNullable() || parameter.isOptional());
/** * Instantiate a Kotlin class using the provided constructor. * @param ctor the constructor of the Kotlin class to instantiate * @param args the constructor arguments to apply * (use {@code null} for unspecified parameter if needed) */ public static <T> T instantiateClass(Constructor<T> ctor, Object... args) throws IllegalAccessException, InvocationTargetException, InstantiationException { KFunction<T> kotlinConstructor = ReflectJvmMapping.getKotlinFunction(ctor); if (kotlinConstructor == null) { return ctor.newInstance(args); } List<KParameter> parameters = kotlinConstructor.getParameters(); Map<KParameter, Object> argParameters = new HashMap<>(parameters.size()); Assert.isTrue(args.length <= parameters.size(), "Number of provided arguments should be less of equals than number of constructor parameters"); for (int i = 0 ; i < args.length ; i++) { if (!(parameters.get(i).isOptional() && args[i] == null)) { argParameters.put(parameters.get(i), args[i]); } } return kotlinConstructor.callBy(argParameters); }
@Override @Nullable public String[] getParameterNames(Method method) { if (!KotlinDetector.isKotlinType(method.getDeclaringClass())) { return null; } try { KFunction<?> function = ReflectJvmMapping.getKotlinFunction(method); return (function != null ? getParameterNames(function.getParameters()) : null); } catch (UnsupportedOperationException ex) { return null; } }
static int findIndex(KFunction<?> function, String parameterName) { for (KParameter parameter : function.getParameters()) { if (parameterName.equals(parameter.getName())) { return parameter.getIndex(); } } return -1; } }
private static Stream<? extends KFunction<?>> toKFunctionStream(KCallable<?> it) { if (it instanceof KMutableProperty<?>) { KMutableProperty<?> property = (KMutableProperty<?>) it; return Stream.of(property.getGetter(), property.getSetter()); } if (it instanceof KProperty<?>) { KProperty<?> property = (KProperty<?>) it; return Stream.of(property.getGetter()); } if (it instanceof KFunction<?>) { return Stream.of((KFunction<?>) it); } return Stream.empty(); }
/** * Checks rule event condition by evaluating the defined knowledge base rule method. * * @param rule rule. * @param event event. * @return {@code true} if this condition is met. */ @Override public boolean condition(Rule rule, Event event) { return function.call(rule, event); } }
public static String createEventConditionMethodName(KFunction<Boolean> kotlinObject) { return kotlinObject.getName(); }
public static String createProcessorName(KClass<?> kclass) { return kclass.getSimpleName(); }
@Override public Object get(Object receiver1, Object receiver2) { return getGetter().call(receiver1, receiver2); } }
@Override public void set(Object receiver1, Object receiver2, Object value) { getSetter().call(receiver1, receiver2, value); } }
@Override public Object get(Object receiver) { return getGetter().call(receiver); } }
int index = param.getParameterIndex(); if (method != null && index == -1) { KFunction<?> function = ReflectJvmMapping.getKotlinFunction(method); return (function != null && function.getReturnType().isMarkedNullable()); Predicate<KParameter> predicate = null; if (method != null) { function = ReflectJvmMapping.getKotlinFunction(method); predicate = p -> KParameter.Kind.VALUE.equals(p.getKind()); function = ReflectJvmMapping.getKotlinFunction(ctor); predicate = p -> KParameter.Kind.VALUE.equals(p.getKind()) || KParameter.Kind.INSTANCE.equals(p.getKind()); List<KParameter> parameters = function.getParameters(); KParameter parameter = parameters .stream() .collect(Collectors.toList()) .get(index); return (parameter.getType().isMarkedNullable() || parameter.isOptional());
/** * Instantiate a Kotlin class using the provided constructor. * @param ctor the constructor of the Kotlin class to instantiate * @param args the constructor arguments to apply * (use {@code null} for unspecified parameter if needed) */ public static <T> T instantiateClass(Constructor<T> ctor, Object... args) throws IllegalAccessException, InvocationTargetException, InstantiationException { KFunction<T> kotlinConstructor = ReflectJvmMapping.getKotlinFunction(ctor); if (kotlinConstructor == null) { return ctor.newInstance(args); } List<KParameter> parameters = kotlinConstructor.getParameters(); Map<KParameter, Object> argParameters = new HashMap<>(parameters.size()); Assert.isTrue(args.length <= parameters.size(), "Number of provided arguments should be less of equals than number of constructor parameters"); for (int i = 0 ; i < args.length ; i++) { if (!(parameters.get(i).isOptional() && args[i] == null)) { argParameters.put(parameters.get(i), args[i]); } } return kotlinConstructor.callBy(argParameters); }
@Override @Nullable public String[] getParameterNames(Constructor<?> ctor) { if (ctor.getDeclaringClass().isEnum() || !KotlinDetector.isKotlinType(ctor.getDeclaringClass())) { return null; } try { KFunction<?> function = ReflectJvmMapping.getKotlinFunction(ctor); return (function != null ? getParameterNames(function.getParameters()) : null); } catch (UnsupportedOperationException ex) { return null; } }
@Nullable private String[] getParameterNames(List<KParameter> parameters) { List<KParameter> filteredParameters = parameters .stream() // Extension receivers of extension methods must be included as they appear as normal method parameters in Java .filter(p -> KParameter.Kind.VALUE.equals(p.getKind()) || KParameter.Kind.EXTENSION_RECEIVER.equals(p.getKind())) .collect(Collectors.toList()); String[] parameterNames = new String[filteredParameters.size()]; for (int i = 0; i < filteredParameters.size(); i++) { KParameter parameter = filteredParameters.get(i); // extension receivers are not explicitly named, but require a name for Java interoperability // $receiver is not a valid Kotlin identifier, but valid in Java, so it can be used here String name = KParameter.Kind.EXTENSION_RECEIVER.equals(parameter.getKind()) ? "$receiver" : parameter.getName(); if (name == null) { return null; } parameterNames[i] = name; } return parameterNames; }
/** * Check whether the specified {@link Field} represents a nullable Kotlin type or not. */ public static boolean isNullable(Field field) { KProperty<?> property = ReflectJvmMapping.getKotlinProperty(field); return (property != null && property.getReturnType().isMarkedNullable()); } }
@Override @Nullable public String[] getParameterNames(Method method) { if (!KotlinDetector.isKotlinType(method.getDeclaringClass())) { return null; } try { KFunction<?> function = ReflectJvmMapping.getKotlinFunction(method); return (function != null ? getParameterNames(function.getParameters()) : null); } catch (UnsupportedOperationException ex) { return null; } }
@Override @Nullable public String[] getParameterNames(Constructor<?> ctor) { if (ctor.getDeclaringClass().isEnum() || !KotlinDetector.isKotlinType(ctor.getDeclaringClass())) { return null; } try { KFunction<?> function = ReflectJvmMapping.getKotlinFunction(ctor); return (function != null ? getParameterNames(function.getParameters()) : null); } catch (UnsupportedOperationException ex) { return null; } }