Minor. Move isJvmStatic* functions to backend
This commit is contained in:
+1
-2
@@ -21,7 +21,6 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
import org.jetbrains.kotlin.descriptors.*;
|
import org.jetbrains.kotlin.descriptors.*;
|
||||||
import org.jetbrains.kotlin.name.Name;
|
import org.jetbrains.kotlin.name.Name;
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils;
|
import org.jetbrains.kotlin.resolve.DescriptorUtils;
|
||||||
import org.jetbrains.kotlin.resolve.annotations.AnnotationUtilKt;
|
|
||||||
|
|
||||||
public class AccessorForFunctionDescriptor extends AbstractAccessorForFunctionDescriptor implements AccessorForCallableDescriptor<FunctionDescriptor> {
|
public class AccessorForFunctionDescriptor extends AbstractAccessorForFunctionDescriptor implements AccessorForCallableDescriptor<FunctionDescriptor> {
|
||||||
private final FunctionDescriptor calleeDescriptor;
|
private final FunctionDescriptor calleeDescriptor;
|
||||||
@@ -39,7 +38,7 @@ public class AccessorForFunctionDescriptor extends AbstractAccessorForFunctionDe
|
|||||||
this.superCallTarget = superCallTarget;
|
this.superCallTarget = superCallTarget;
|
||||||
|
|
||||||
initialize(DescriptorUtils.getReceiverParameterType(descriptor.getExtensionReceiverParameter()),
|
initialize(DescriptorUtils.getReceiverParameterType(descriptor.getExtensionReceiverParameter()),
|
||||||
descriptor instanceof ConstructorDescriptor || AnnotationUtilKt.isPlatformStaticInObjectOrClass(descriptor)
|
descriptor instanceof ConstructorDescriptor || CodegenUtilKt.isJvmStaticInObjectOrClass(descriptor)
|
||||||
? null
|
? null
|
||||||
: descriptor.getDispatchReceiverParameter(),
|
: descriptor.getDispatchReceiverParameter(),
|
||||||
copyTypeParameters(descriptor),
|
copyTypeParameters(descriptor),
|
||||||
|
|||||||
@@ -178,7 +178,7 @@ public class AsmUtil {
|
|||||||
public static boolean isStaticMethod(OwnerKind kind, CallableMemberDescriptor functionDescriptor) {
|
public static boolean isStaticMethod(OwnerKind kind, CallableMemberDescriptor functionDescriptor) {
|
||||||
return isStaticKind(kind) ||
|
return isStaticKind(kind) ||
|
||||||
KotlinTypeMapper.isStaticAccessor(functionDescriptor) ||
|
KotlinTypeMapper.isStaticAccessor(functionDescriptor) ||
|
||||||
AnnotationUtilKt.isPlatformStaticInObjectOrClass(functionDescriptor);
|
CodegenUtilKt.isJvmStaticInObjectOrClass(functionDescriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isStaticKind(OwnerKind kind) {
|
public static boolean isStaticKind(OwnerKind kind) {
|
||||||
@@ -198,7 +198,7 @@ public class AsmUtil {
|
|||||||
flags |= Opcodes.ACC_NATIVE;
|
flags |= Opcodes.ACC_NATIVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (AnnotationUtilKt.isPlatformStaticInCompanionObject(functionDescriptor)) {
|
if (CodegenUtilKt.isJvmStaticInCompanionObject(functionDescriptor)) {
|
||||||
// Native method will be a member of the class, the companion object method will be delegated to it
|
// Native method will be a member of the class, the companion object method will be delegated to it
|
||||||
flags &= ~Opcodes.ACC_NATIVE;
|
flags &= ~Opcodes.ACC_NATIVE;
|
||||||
}
|
}
|
||||||
@@ -636,7 +636,7 @@ public class AsmUtil {
|
|||||||
) {
|
) {
|
||||||
KotlinType type = parameter.getReturnType();
|
KotlinType type = parameter.getReturnType();
|
||||||
if (type == null || isNullableType(type)) return;
|
if (type == null || isNullableType(type)) return;
|
||||||
|
|
||||||
int index = frameMap.getIndex(parameter);
|
int index = frameMap.getIndex(parameter);
|
||||||
Type asmType = typeMapper.mapType(type);
|
Type asmType = typeMapper.mapType(type);
|
||||||
if (asmType.getSort() == Type.OBJECT || asmType.getSort() == Type.ARRAY) {
|
if (asmType.getSort() == Type.OBJECT || asmType.getSort() == Type.ARRAY) {
|
||||||
|
|||||||
@@ -68,7 +68,6 @@ import org.jetbrains.kotlin.resolve.BindingContext;
|
|||||||
import org.jetbrains.kotlin.resolve.BindingContextUtils;
|
import org.jetbrains.kotlin.resolve.BindingContextUtils;
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils;
|
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils;
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils;
|
import org.jetbrains.kotlin.resolve.DescriptorUtils;
|
||||||
import org.jetbrains.kotlin.resolve.annotations.AnnotationUtilKt;
|
|
||||||
import org.jetbrains.kotlin.resolve.bindingContextUtil.BindingContextUtilsKt;
|
import org.jetbrains.kotlin.resolve.bindingContextUtil.BindingContextUtilsKt;
|
||||||
import org.jetbrains.kotlin.resolve.calls.callResolverUtil.CallResolverUtilKt;
|
import org.jetbrains.kotlin.resolve.calls.callResolverUtil.CallResolverUtilKt;
|
||||||
import org.jetbrains.kotlin.resolve.calls.callUtil.CallUtilKt;
|
import org.jetbrains.kotlin.resolve.calls.callUtil.CallUtilKt;
|
||||||
@@ -3089,7 +3088,7 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
boolean isSingleton = calleeContainingClass.getKind().isSingleton();
|
boolean isSingleton = calleeContainingClass.getKind().isSingleton();
|
||||||
if (isSingleton) {
|
if (isSingleton) {
|
||||||
if (calleeContainingClass.equals(context.getThisDescriptor()) &&
|
if (calleeContainingClass.equals(context.getThisDescriptor()) &&
|
||||||
!AnnotationUtilKt.isPlatformStaticInObjectOrClass(context.getContextDescriptor())) {
|
!CodegenUtilKt.isJvmStaticInObjectOrClass(context.getContextDescriptor())) {
|
||||||
return StackValue.local(0, typeMapper.mapType(calleeContainingClass));
|
return StackValue.local(0, typeMapper.mapType(calleeContainingClass));
|
||||||
}
|
}
|
||||||
else if (isEnumEntry(calleeContainingClass)) {
|
else if (isEnumEntry(calleeContainingClass)) {
|
||||||
|
|||||||
@@ -49,7 +49,6 @@ import org.jetbrains.kotlin.psi.KtNamedFunction;
|
|||||||
import org.jetbrains.kotlin.resolve.BindingContext;
|
import org.jetbrains.kotlin.resolve.BindingContext;
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils;
|
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils;
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils;
|
import org.jetbrains.kotlin.resolve.DescriptorUtils;
|
||||||
import org.jetbrains.kotlin.resolve.annotations.AnnotationUtilKt;
|
|
||||||
import org.jetbrains.kotlin.resolve.constants.ArrayValue;
|
import org.jetbrains.kotlin.resolve.constants.ArrayValue;
|
||||||
import org.jetbrains.kotlin.resolve.constants.ConstantValue;
|
import org.jetbrains.kotlin.resolve.constants.ConstantValue;
|
||||||
import org.jetbrains.kotlin.resolve.constants.KClassValue;
|
import org.jetbrains.kotlin.resolve.constants.KClassValue;
|
||||||
@@ -202,7 +201,7 @@ public class FunctionCodegen {
|
|||||||
generateDelegateForDefaultImpl(functionDescriptor, origin.getElement());
|
generateDelegateForDefaultImpl(functionDescriptor, origin.getElement());
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean staticInCompanionObject = AnnotationUtilKt.isPlatformStaticInCompanionObject(functionDescriptor);
|
boolean staticInCompanionObject = CodegenUtilKt.isJvmStaticInCompanionObject(functionDescriptor);
|
||||||
if (staticInCompanionObject) {
|
if (staticInCompanionObject) {
|
||||||
ImplementationBodyCodegen parentBodyCodegen = (ImplementationBodyCodegen) memberCodegen.getParentCodegen();
|
ImplementationBodyCodegen parentBodyCodegen = (ImplementationBodyCodegen) memberCodegen.getParentCodegen();
|
||||||
parentBodyCodegen.addAdditionalTask(new JvmStaticGenerator(functionDescriptor, origin, state, parentBodyCodegen));
|
parentBodyCodegen.addAdditionalTask(new JvmStaticGenerator(functionDescriptor, origin, state, parentBodyCodegen));
|
||||||
|
|||||||
@@ -43,7 +43,6 @@ import org.jetbrains.kotlin.psi.*;
|
|||||||
import org.jetbrains.kotlin.resolve.BindingContext;
|
import org.jetbrains.kotlin.resolve.BindingContext;
|
||||||
import org.jetbrains.kotlin.resolve.BindingContextUtils;
|
import org.jetbrains.kotlin.resolve.BindingContextUtils;
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils;
|
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils;
|
||||||
import org.jetbrains.kotlin.resolve.annotations.AnnotationUtilKt;
|
|
||||||
import org.jetbrains.kotlin.resolve.constants.ConstantValue;
|
import org.jetbrains.kotlin.resolve.constants.ConstantValue;
|
||||||
import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator;
|
import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator;
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt;
|
import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt;
|
||||||
@@ -698,7 +697,7 @@ public abstract class MemberCodegen<T extends KtElement/* TODO: & JetDeclaration
|
|||||||
reg = 0;
|
reg = 0;
|
||||||
}
|
}
|
||||||
else if (accessorIsConstructor || (accessorDescriptor != null && KotlinTypeMapper.isAccessor(accessorDescriptor) && hasDispatchReceiver)) {
|
else if (accessorIsConstructor || (accessorDescriptor != null && KotlinTypeMapper.isAccessor(accessorDescriptor) && hasDispatchReceiver)) {
|
||||||
if (!AnnotationUtilKt.isPlatformStaticInObjectOrClass(functionDescriptor)) {
|
if (!CodegenUtilKt.isJvmStaticInObjectOrClass(functionDescriptor)) {
|
||||||
iv.load(0, OBJECT_TYPE);
|
iv.load(0, OBJECT_TYPE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,7 +39,6 @@ import org.jetbrains.kotlin.psi.ValueArgument;
|
|||||||
import org.jetbrains.kotlin.resolve.BindingContext;
|
import org.jetbrains.kotlin.resolve.BindingContext;
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils;
|
import org.jetbrains.kotlin.resolve.DescriptorUtils;
|
||||||
import org.jetbrains.kotlin.resolve.ImportedFromObjectCallableDescriptor;
|
import org.jetbrains.kotlin.resolve.ImportedFromObjectCallableDescriptor;
|
||||||
import org.jetbrains.kotlin.resolve.annotations.AnnotationUtilKt;
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.DefaultValueArgument;
|
import org.jetbrains.kotlin.resolve.calls.model.DefaultValueArgument;
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
|
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedValueArgument;
|
import org.jetbrains.kotlin.resolve.calls.model.ResolvedValueArgument;
|
||||||
@@ -572,7 +571,7 @@ public abstract class StackValue {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static StackValue platformStaticCallIfPresent(@NotNull StackValue resultReceiver, @NotNull CallableDescriptor descriptor) {
|
private static StackValue platformStaticCallIfPresent(@NotNull StackValue resultReceiver, @NotNull CallableDescriptor descriptor) {
|
||||||
if (AnnotationUtilKt.isPlatformStaticInObjectOrClass(descriptor)) {
|
if (CodegenUtilKt.isJvmStaticInObjectOrClass(descriptor)) {
|
||||||
if (resultReceiver.canHaveSideEffects()) {
|
if (resultReceiver.canHaveSideEffects()) {
|
||||||
return coercion(resultReceiver, Type.VOID_TYPE);
|
return coercion(resultReceiver, Type.VOID_TYPE);
|
||||||
}
|
}
|
||||||
@@ -1550,7 +1549,7 @@ public abstract class StackValue {
|
|||||||
else if (dispatchReceiver != null) {
|
else if (dispatchReceiver != null) {
|
||||||
CallableDescriptor descriptor = resolvedCall.getResultingDescriptor();
|
CallableDescriptor descriptor = resolvedCall.getResultingDescriptor();
|
||||||
|
|
||||||
if (AnnotationUtilKt.isPlatformStaticInObjectOrClass(descriptor)) {
|
if (CodegenUtilKt.isJvmStaticInObjectOrClass(descriptor)) {
|
||||||
return Type.VOID_TYPE;
|
return Type.VOID_TYPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,10 +24,7 @@ import org.jetbrains.kotlin.codegen.intrinsics.TypeIntrinsics
|
|||||||
import org.jetbrains.kotlin.codegen.signature.JvmSignatureWriter
|
import org.jetbrains.kotlin.codegen.signature.JvmSignatureWriter
|
||||||
import org.jetbrains.kotlin.codegen.state.GenerationState
|
import org.jetbrains.kotlin.codegen.state.GenerationState
|
||||||
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
|
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
|
||||||
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
|
||||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
|
||||||
import org.jetbrains.kotlin.diagnostics.rendering.Renderers
|
import org.jetbrains.kotlin.diagnostics.rendering.Renderers
|
||||||
import org.jetbrains.kotlin.diagnostics.rendering.RenderingContext
|
import org.jetbrains.kotlin.diagnostics.rendering.RenderingContext
|
||||||
import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature.SpecialSignatureInfo
|
import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature.SpecialSignatureInfo
|
||||||
@@ -39,6 +36,7 @@ import org.jetbrains.kotlin.psi.KtProperty
|
|||||||
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||||
|
import org.jetbrains.kotlin.resolve.annotations.hasJvmStaticAnnotation
|
||||||
import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm
|
import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm
|
||||||
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
|
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.PLATFORM_DEPENDENT_ANNOTATION_FQ_NAME
|
import org.jetbrains.kotlin.serialization.deserialization.PLATFORM_DEPENDENT_ANNOTATION_FQ_NAME
|
||||||
@@ -235,4 +233,25 @@ fun reportTarget6InheritanceErrorIfNeeded(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun CallableDescriptor.isJvmStaticInObjectOrClass(): Boolean =
|
||||||
|
isJvmStaticIn {
|
||||||
|
DescriptorUtils.isNonCompanionObject(it) ||
|
||||||
|
// This is necessary because for generation of @JvmStatic methods from companion of class A
|
||||||
|
// we create a synthesized descriptor containing in class A
|
||||||
|
DescriptorUtils.isClassOrEnumClass(it)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun CallableDescriptor.isJvmStaticInCompanionObject(): Boolean =
|
||||||
|
isJvmStaticIn { DescriptorUtils.isCompanionObject(it) }
|
||||||
|
|
||||||
|
private fun CallableDescriptor.isJvmStaticIn(predicate: (DeclarationDescriptor) -> Boolean): Boolean =
|
||||||
|
when (this) {
|
||||||
|
is PropertyAccessorDescriptor -> {
|
||||||
|
val propertyDescriptor = correspondingProperty
|
||||||
|
predicate(propertyDescriptor.containingDeclaration) &&
|
||||||
|
(hasJvmStaticAnnotation() || propertyDescriptor.hasJvmStaticAnnotation())
|
||||||
|
}
|
||||||
|
else -> predicate(containingDeclaration) && hasJvmStaticAnnotation()
|
||||||
|
}
|
||||||
|
|||||||
@@ -59,7 +59,6 @@ import org.jetbrains.kotlin.psi.KtFile;
|
|||||||
import org.jetbrains.kotlin.psi.KtFunctionLiteral;
|
import org.jetbrains.kotlin.psi.KtFunctionLiteral;
|
||||||
import org.jetbrains.kotlin.psi.KtLambdaExpression;
|
import org.jetbrains.kotlin.psi.KtLambdaExpression;
|
||||||
import org.jetbrains.kotlin.resolve.*;
|
import org.jetbrains.kotlin.resolve.*;
|
||||||
import org.jetbrains.kotlin.resolve.annotations.AnnotationUtilKt;
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.DefaultValueArgument;
|
import org.jetbrains.kotlin.resolve.calls.model.DefaultValueArgument;
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
|
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedValueArgument;
|
import org.jetbrains.kotlin.resolve.calls.model.ResolvedValueArgument;
|
||||||
@@ -683,7 +682,7 @@ public class KotlinTypeMapper {
|
|||||||
boolean isStaticInvocation = (isStaticDeclaration(functionDescriptor) &&
|
boolean isStaticInvocation = (isStaticDeclaration(functionDescriptor) &&
|
||||||
!(functionDescriptor instanceof ImportedFromObjectCallableDescriptor)) ||
|
!(functionDescriptor instanceof ImportedFromObjectCallableDescriptor)) ||
|
||||||
isStaticAccessor(functionDescriptor) ||
|
isStaticAccessor(functionDescriptor) ||
|
||||||
AnnotationUtilKt.isPlatformStaticInObjectOrClass(functionDescriptor);
|
CodegenUtilKt.isJvmStaticInObjectOrClass(functionDescriptor);
|
||||||
if (isStaticInvocation) {
|
if (isStaticInvocation) {
|
||||||
invokeOpcode = INVOKESTATIC;
|
invokeOpcode = INVOKESTATIC;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,10 +16,10 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.resolve.annotations
|
package org.jetbrains.kotlin.resolve.annotations
|
||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.MemberDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||||
import org.jetbrains.kotlin.resolve.constants.ConstantValue
|
import org.jetbrains.kotlin.resolve.constants.ConstantValue
|
||||||
@@ -44,22 +44,6 @@ private val STRICTFP_ANNOTATION_FQ_NAME = FqName("kotlin.jvm.Strictfp")
|
|||||||
fun DeclarationDescriptor.findStrictfpAnnotation() =
|
fun DeclarationDescriptor.findStrictfpAnnotation() =
|
||||||
DescriptorUtils.getAnnotationByFqName(annotations, STRICTFP_ANNOTATION_FQ_NAME)
|
DescriptorUtils.getAnnotationByFqName(annotations, STRICTFP_ANNOTATION_FQ_NAME)
|
||||||
|
|
||||||
fun CallableDescriptor.isPlatformStaticInObjectOrClass(): Boolean =
|
|
||||||
isPlatformStaticIn { DescriptorUtils.isNonCompanionObject(it) || DescriptorUtils.isClassOrEnumClass(it) }
|
|
||||||
|
|
||||||
fun CallableDescriptor.isPlatformStaticInCompanionObject(): Boolean =
|
|
||||||
isPlatformStaticIn { DescriptorUtils.isCompanionObject(it) }
|
|
||||||
|
|
||||||
private fun CallableDescriptor.isPlatformStaticIn(predicate: (DeclarationDescriptor) -> Boolean): Boolean =
|
|
||||||
when (this) {
|
|
||||||
is PropertyAccessorDescriptor -> {
|
|
||||||
val propertyDescriptor = correspondingProperty
|
|
||||||
predicate(propertyDescriptor.containingDeclaration) &&
|
|
||||||
(hasJvmStaticAnnotation() || propertyDescriptor.hasJvmStaticAnnotation())
|
|
||||||
}
|
|
||||||
else -> predicate(containingDeclaration) && hasJvmStaticAnnotation()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun AnnotationDescriptor.argumentValue(parameterName: String): Any? {
|
fun AnnotationDescriptor.argumentValue(parameterName: String): Any? {
|
||||||
val constant: ConstantValue<*>? = allValueArguments.entries
|
val constant: ConstantValue<*>? = allValueArguments.entries
|
||||||
.singleOrNull { it.key.name.asString() == parameterName }
|
.singleOrNull { it.key.name.asString() == parameterName }
|
||||||
|
|||||||
Reference in New Issue
Block a user