From c10cc30f40578ccd46658dc094a880e9abec7bbe Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 28 Jul 2015 19:45:42 +0300 Subject: [PATCH] Drop kotlin.jvm.internal.Intrinsic, use only one mechanism for intrinsics --- .../codegen/intrinsics/IntrinsicMethods.java | 38 ++++++++----------- .../codegen/intrinsics/IntrinsicsMap.java | 9 +++-- .../codegen/intrinsics/MonitorInstruction.kt | 9 +++-- .../resolve/CompileTimeConstantUtils.java | 17 --------- .../src/kotlin/jvm/JvmClassMapping.kt | 14 +------ .../src/kotlin/jvm/internal/Intrinsic.kt | 21 ---------- .../src/kotlin/jvm/internal/unsafe/monitor.kt | 4 -- libraries/stdlib/src/kotlin/util/JLangJVM.kt | 3 -- 8 files changed, 28 insertions(+), 87 deletions(-) delete mode 100644 core/runtime.jvm/src/kotlin/jvm/internal/Intrinsic.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IntrinsicMethods.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IntrinsicMethods.java index 1dd031955fa..b8e7b3e5e74 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IntrinsicMethods.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IntrinsicMethods.java @@ -23,14 +23,11 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.builtins.PrimitiveType; import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor; +import org.jetbrains.kotlin.name.FqName; +import org.jetbrains.kotlin.name.FqNameUnsafe; import org.jetbrains.kotlin.name.Name; -import org.jetbrains.kotlin.resolve.CompileTimeConstantUtils; import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType; import org.jetbrains.kotlin.types.expressions.OperatorConventions; -import org.jetbrains.kotlin.util.capitalizeDecapitalize.CapitalizeDecapitalizeKt; - -import java.util.HashMap; -import java.util.Map; import static org.jetbrains.kotlin.builtins.KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME; import static org.jetbrains.org.objectweb.asm.Opcodes.*; @@ -38,6 +35,9 @@ import static org.jetbrains.org.objectweb.asm.Opcodes.*; public class IntrinsicMethods { public static final String INTRINSICS_CLASS_NAME = "kotlin/jvm/internal/Intrinsics"; + private static final FqName KOTLIN_JVM = new FqName("kotlin.jvm"); + /* package */ static final FqNameUnsafe RECEIVER_PARAMETER_FQ_NAME = new FqNameUnsafe("T"); + private static final IntrinsicMethod UNARY_MINUS = new UnaryMinus(); private static final IntrinsicMethod UNARY_PLUS = new UnaryPlus(); private static final IntrinsicMethod NUMBER_CAST = new NumberCast(); @@ -57,20 +57,22 @@ public class IntrinsicMethods { private static final ToString TO_STRING = new ToString(); private static final Clone CLONE = new Clone(); - private final Map namedMethods = new HashMap(); private static final IntrinsicMethod ARRAY_ITERATOR = new ArrayIterator(); private final IntrinsicsMap intrinsicsMap = new IntrinsicsMap(); public IntrinsicMethods() { - namedMethods.put("kotlin.javaClass.function", new JavaClassFunction()); - namedMethods.put("kotlin.javaClass.property", new JavaClassProperty()); - namedMethods.put("kotlin.KClass.java.property", new KClassJavaProperty()); - namedMethods.put("kotlin.jvm.internal.unsafe.monitorEnter", MonitorInstruction.MONITOR_ENTER); - namedMethods.put("kotlin.jvm.internal.unsafe.monitorExit", MonitorInstruction.MONITOR_EXIT); - namedMethods.put("kotlin.jvm.isArrayOf", new IsArrayOf()); + intrinsicsMap.registerIntrinsic(BUILT_INS_PACKAGE_FQ_NAME, null, "javaClass", 0, new JavaClassFunction()); + intrinsicsMap.registerIntrinsic(KOTLIN_JVM, RECEIVER_PARAMETER_FQ_NAME, "javaClass", -1, new JavaClassProperty()); + intrinsicsMap.registerIntrinsic(KOTLIN_JVM, KotlinBuiltIns.FQ_NAMES.kClass, "java", -1, new KClassJavaProperty()); + intrinsicsMap.registerIntrinsic(new FqName("kotlin.jvm.internal.unsafe"), null, "monitorEnter", 1, MonitorInstruction.MONITOR_ENTER); + intrinsicsMap.registerIntrinsic(new FqName("kotlin.jvm.internal.unsafe"), null, "monitorExit", 1, MonitorInstruction.MONITOR_EXIT); + intrinsicsMap.registerIntrinsic(KOTLIN_JVM, KotlinBuiltIns.FQ_NAMES.array, "isArrayOf", 0, new IsArrayOf()); intrinsicsMap.registerIntrinsic(BUILT_INS_PACKAGE_FQ_NAME, null, "arrayOf", 1, new JavaClassArray()); + // TODO: drop when deprecated kotlin.javaClass property is gone + intrinsicsMap.registerIntrinsic(BUILT_INS_PACKAGE_FQ_NAME, RECEIVER_PARAMETER_FQ_NAME, "javaClass", -1, new JavaClassProperty()); + ImmutableList primitiveCastMethods = OperatorConventions.NUMBER_CONVERSIONS.asList(); for (Name method : primitiveCastMethods) { String methodName = method.asString(); @@ -180,16 +182,6 @@ public class IntrinsicMethods { @Nullable public IntrinsicMethod getIntrinsic(@NotNull CallableMemberDescriptor descriptor) { - IntrinsicMethod intrinsicMethod = intrinsicsMap.getIntrinsic(descriptor); - if (intrinsicMethod != null) { - return intrinsicMethod; - } - - String value = CompileTimeConstantUtils.getIntrinsicAnnotationArgument(descriptor); - if (value != null) { - return namedMethods.get(value); - } - - return null; + return intrinsicsMap.getIntrinsic(descriptor); } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IntrinsicsMap.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IntrinsicsMap.java index b05111f4804..2af69d27292 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IntrinsicsMap.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/IntrinsicsMap.java @@ -19,10 +19,7 @@ package org.jetbrains.kotlin.codegen.intrinsics; import com.google.common.collect.Maps; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor; -import org.jetbrains.kotlin.descriptors.ClassifierDescriptor; -import org.jetbrains.kotlin.descriptors.PropertyDescriptor; -import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor; +import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.FqNameUnsafe; import org.jetbrains.kotlin.resolve.DescriptorUtils; @@ -112,6 +109,10 @@ class IntrinsicsMap { ClassifierDescriptor classifier = receiverParameter.getType().getConstructor().getDeclarationDescriptor(); if (classifier == null) return null; + if (classifier instanceof TypeParameterDescriptor) { + return IntrinsicMethods.RECEIVER_PARAMETER_FQ_NAME; + } + return DescriptorUtils.getFqName(classifier); } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/MonitorInstruction.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/MonitorInstruction.kt index 8e655b60df3..fefc89a5925 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/MonitorInstruction.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/MonitorInstruction.kt @@ -23,10 +23,13 @@ import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter -public class MonitorInstruction private constructor(private val opcode: Int) : IntrinsicMethod() { +class MonitorInstruction private constructor(private val opcode: Int) : IntrinsicMethod() { companion object { - public val MONITOR_ENTER: MonitorInstruction = MonitorInstruction(Opcodes.MONITORENTER) - public val MONITOR_EXIT: MonitorInstruction = MonitorInstruction(Opcodes.MONITOREXIT) + @JvmField + val MONITOR_ENTER: MonitorInstruction = MonitorInstruction(Opcodes.MONITORENTER) + + @JvmField + val MONITOR_EXIT: MonitorInstruction = MonitorInstruction(Opcodes.MONITOREXIT) } override fun toCallable(method: CallableMethod): Callable { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/CompileTimeConstantUtils.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/CompileTimeConstantUtils.java index 25b7bbccdc5..d930f98820c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/CompileTimeConstantUtils.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/CompileTimeConstantUtils.java @@ -22,9 +22,6 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.descriptors.ClassDescriptor; import org.jetbrains.kotlin.descriptors.VariableDescriptor; -import org.jetbrains.kotlin.descriptors.annotations.Annotated; -import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor; -import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.psi.KtExpression; import org.jetbrains.kotlin.psi.KtParameter; import org.jetbrains.kotlin.psi.KtPsiUtil; @@ -39,7 +36,6 @@ import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.kotlin.types.TypeProjection; import org.jetbrains.kotlin.types.TypeUtils; -import java.util.Collection; import java.util.List; import java.util.Set; @@ -107,19 +103,6 @@ public class CompileTimeConstantUtils { return false; } - @Nullable - public static String getIntrinsicAnnotationArgument(@NotNull Annotated annotatedDescriptor) { - AnnotationDescriptor intrinsicAnnotation = - annotatedDescriptor.getAnnotations().findAnnotation(new FqName("kotlin.jvm.internal.Intrinsic")); - if (intrinsicAnnotation == null) return null; - - Collection> values = intrinsicAnnotation.getAllValueArguments().values(); - if (values.isEmpty()) return null; - - Object value = values.iterator().next().getValue(); - return value instanceof String ? (String) value : null; - } - public static boolean isArrayMethodCall(@NotNull ResolvedCall resolvedCall) { return ARRAY_CALL_NAMES.contains(DescriptorUtils.getFqName(resolvedCall.getCandidateDescriptor()).asString()); } diff --git a/core/runtime.jvm/src/kotlin/jvm/JvmClassMapping.kt b/core/runtime.jvm/src/kotlin/jvm/JvmClassMapping.kt index a9b33d44728..6d8741c38d7 100644 --- a/core/runtime.jvm/src/kotlin/jvm/JvmClassMapping.kt +++ b/core/runtime.jvm/src/kotlin/jvm/JvmClassMapping.kt @@ -13,21 +13,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@file:kotlin.jvm.JvmName("JvmClassMappingKt") -@file:Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN") +@file:JvmName("JvmClassMappingKt") +@file:Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UNCHECKED_CAST") package kotlin.jvm import kotlin.jvm.internal.ClassBasedDeclarationContainer -import kotlin.jvm.internal.Intrinsic import kotlin.jvm.internal.Reflection import kotlin.reflect.KClass /** * Returns a Java [Class] instance corresponding to the given [KClass] instance. */ -@Suppress("UNCHECKED_CAST") -@Intrinsic("kotlin.KClass.java.property") public val KClass.java: Class @JvmName("getJavaClass") get() = (this as ClassBasedDeclarationContainer).jClass as Class @@ -35,7 +32,6 @@ public val KClass.java: Class /** * Returns a Java [Class] instance representing the primitive type corresponding to the given [KClass] if it exists. */ -@Suppress("UNCHECKED_CAST") public val KClass.javaPrimitiveType: Class? get() { val thisJClass = (this as ClassBasedDeclarationContainer).jClass @@ -58,7 +54,6 @@ public val KClass.javaPrimitiveType: Class? * Returns a Java [Class] instance corresponding to the given [KClass] instance. * In case of primitive types it returns corresponding wrapper classes. */ -@Suppress("UNCHECKED_CAST", "PLATFORM_CLASS_MAPPED_TO_KOTLIN") public val KClass.javaObjectType: Class get() { val thisJClass = (this as ClassBasedDeclarationContainer).jClass @@ -80,7 +75,6 @@ public val KClass.javaObjectType: Class /** * Returns a [KClass] instance corresponding to the given Java [Class] instance. */ -@Suppress("UNCHECKED_CAST") public val Class.kotlin: KClass @JvmName("getKotlinClass") get() = Reflection.createKotlinClass(this) as KClass @@ -89,8 +83,6 @@ public val Class.kotlin: KClass /** * Returns the runtime Java class of this object. */ -@Suppress("UNCHECKED_CAST") -@Intrinsic("kotlin.javaClass.property") public val T.javaClass : Class get() = (this as java.lang.Object).getClass() as Class @@ -102,7 +94,6 @@ public val KClass.javaClass: Class> /** * Checks if array can contain element of type [T]. */ -@Intrinsic("kotlin.jvm.isArrayOf") @Suppress("REIFIED_TYPE_PARAMETER_NO_INLINE") public fun Array<*>.isArrayOf(): Boolean = T::class.java.isAssignableFrom(this.javaClass.componentType) @@ -110,6 +101,5 @@ public fun Array<*>.isArrayOf(): Boolean = /** * Returns a [KClass] instance corresponding to the annotation type of this annotation. */ -@Suppress("UNCHECKED_CAST") public val T.annotationClass: KClass get() = (this as java.lang.annotation.Annotation).annotationType().kotlin as KClass diff --git a/core/runtime.jvm/src/kotlin/jvm/internal/Intrinsic.kt b/core/runtime.jvm/src/kotlin/jvm/internal/Intrinsic.kt deleted file mode 100644 index 7fad604aaae..00000000000 --- a/core/runtime.jvm/src/kotlin/jvm/internal/Intrinsic.kt +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright 2010-2015 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package kotlin.jvm.internal - -@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY) -@Retention(AnnotationRetention.RUNTIME) -public annotation class Intrinsic(val value: String) diff --git a/libraries/stdlib/src/kotlin/jvm/internal/unsafe/monitor.kt b/libraries/stdlib/src/kotlin/jvm/internal/unsafe/monitor.kt index 4096d35ee2e..ea4e32aa11f 100644 --- a/libraries/stdlib/src/kotlin/jvm/internal/unsafe/monitor.kt +++ b/libraries/stdlib/src/kotlin/jvm/internal/unsafe/monitor.kt @@ -16,14 +16,10 @@ package kotlin.jvm.internal.unsafe -import kotlin.jvm.internal.Intrinsic - /** @suppress */ -@Intrinsic("kotlin.jvm.internal.unsafe.monitorEnter") @Deprecated("This function supports the standard library infrastructure and is not intended to be used directly from user code.", level = DeprecationLevel.ERROR) public fun monitorEnter(monitor: Any): Unit = throw UnsupportedOperationException("This function can only be used privately") /** @suppress */ -@Intrinsic("kotlin.jvm.internal.unsafe.monitorExit") @Deprecated("This function supports the standard library infrastructure and is not intended to be used directly from user code.", level = DeprecationLevel.ERROR) public fun monitorExit(monitor: Any): Unit = throw UnsupportedOperationException("This function can only be used privately") diff --git a/libraries/stdlib/src/kotlin/util/JLangJVM.kt b/libraries/stdlib/src/kotlin/util/JLangJVM.kt index 4269439999c..0cb3ff074c0 100644 --- a/libraries/stdlib/src/kotlin/util/JLangJVM.kt +++ b/libraries/stdlib/src/kotlin/util/JLangJVM.kt @@ -3,7 +3,6 @@ package kotlin import java.lang.reflect.Method -import kotlin.jvm.internal.Intrinsic import kotlin.reflect.KClass /** @@ -31,7 +30,6 @@ public annotation class throws(public vararg val exceptionClasses: KClass T.javaClass : Class get() = (this as java.lang.Object).getClass() as Class @@ -39,7 +37,6 @@ public val T.javaClass : Class /** * Returns the Java class for the specified type. */ -@Intrinsic("kotlin.javaClass.function") @Suppress("REIFIED_TYPE_PARAMETER_NO_INLINE") @Deprecated("Use the class reference and .java extension property instead: MyClass::class.java", ReplaceWith("T::class.java")) public fun javaClass(): Class = T::class.java