diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/FileBasedKotlinClass.java b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/FileBasedKotlinClass.java index 743f16ad101..386158d60f3 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/FileBasedKotlinClass.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/FileBasedKotlinClass.java @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.load.kotlin.header.ReadKotlinClassHeaderAnnotationVi import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.Name; +import org.jetbrains.kotlin.resolve.constants.ClassLiteralValue; import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType; import org.jetbrains.org.objectweb.asm.*; @@ -173,8 +174,7 @@ public abstract class FileBasedKotlinClass implements KotlinJvmBinaryClass { @Override public void visit(String name, @NotNull Object value) { if (value instanceof Type) { - ClassLiteralId classLiteralId = resolveKotlinNameByType((Type)value, innerClasses); - v.visitClassLiteral(Name.identifier(name), classLiteralId); + v.visitClassLiteral(Name.identifier(name), resolveKotlinNameByType((Type) value, innerClasses)); } else { v.visit(name == null ? null : Name.identifier(name), value); @@ -188,8 +188,7 @@ public abstract class FileBasedKotlinClass implements KotlinJvmBinaryClass { @Override public void visit(String name, @NotNull Object value) { if (value instanceof Type) { - ClassLiteralId classLiteralId = resolveKotlinNameByType((Type)value, innerClasses); - arv.visitClassLiteral(classLiteralId); + arv.visitClassLiteral(resolveKotlinNameByType((Type) value, innerClasses)); } else { arv.visit(value); @@ -282,17 +281,17 @@ public abstract class FileBasedKotlinClass implements KotlinJvmBinaryClass { } @NotNull - private static ClassLiteralId resolveKotlinNameByType(@NotNull Type type, @NotNull InnerClassesInfo innerClasses) { + private static ClassLiteralValue resolveKotlinNameByType(@NotNull Type type, @NotNull InnerClassesInfo innerClasses) { String typeDesc = type.getDescriptor(); int nestedness = typeDesc.charAt(0) == '[' ? type.getDimensions() : 0; String elementDesc = nestedness == 0 ? typeDesc : type.getElementType().getDescriptor(); JvmPrimitiveType primType = JvmPrimitiveType.getByDesc(elementDesc); if (primType != null) { - return new ClassLiteralId(ClassId.topLevel(primType.getPrimitiveType().getTypeFqName()), nestedness); + return new ClassLiteralValue(ClassId.topLevel(primType.getPrimitiveType().getTypeFqName()), nestedness); } ClassId javaClassId = resolveNameByDesc(elementDesc, innerClasses); ClassId kotlinClassId = JavaToKotlinClassMap.INSTANCE.mapJavaToKotlin(javaClassId.asSingleFqName()); - return new ClassLiteralId(kotlinClassId != null ? kotlinClassId : javaClassId, nestedness); + return new ClassLiteralValue(kotlinClassId != null ? kotlinClassId : javaClassId, nestedness); } @NotNull diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl.kt index 875bc02113b..9287e616341 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl.kt @@ -93,9 +93,9 @@ class BinaryClassAnnotationAndConstantLoaderImpl( } } - override fun visitClassLiteral(name: Name, classLiteralId: KotlinJvmBinaryClass.ClassLiteralId) { - arguments[name] = classLiteralId.toClassValue() ?: - ErrorValue.create("Error value of annotation argument: $name: class ${classLiteralId.classId.asSingleFqName()} not found") + override fun visitClassLiteral(name: Name, value: ClassLiteralValue) { + arguments[name] = value.toClassValue() ?: + ErrorValue.create("Error value of annotation argument: $name: class ${value.classId.asSingleFqName()} not found") } override fun visitEnum(name: Name, enumClassId: ClassId, enumEntryName: Name) { @@ -114,10 +114,11 @@ class BinaryClassAnnotationAndConstantLoaderImpl( elements.add(EnumValue(enumClassId, enumEntryName)) } - override fun visitClassLiteral(classLiteralId: KotlinJvmBinaryClass.ClassLiteralId) { + override fun visitClassLiteral(value: ClassLiteralValue) { elements.add( - classLiteralId.toClassValue() - ?: ErrorValue.create("Error array element value of annotation argument: $name: class ${classLiteralId.classId.asSingleFqName()} not found") + value.toClassValue() ?: ErrorValue.create( + "Error array element value of annotation argument: $name: class ${value.classId.asSingleFqName()} not found" + ) ) } @@ -152,10 +153,10 @@ class BinaryClassAnnotationAndConstantLoaderImpl( } } - private fun KotlinJvmBinaryClass.ClassLiteralId.toClassValue(): KClassValue? = - module.findClassAcrossModuleDependencies(this.classId)?.let { classDescriptor -> + private fun ClassLiteralValue.toClassValue(): KClassValue? = + module.findClassAcrossModuleDependencies(classId)?.let { classDescriptor -> var currentType = classDescriptor.defaultType - for (i in 0 until this.arrayNestedness) { + for (i in 0 until arrayNestedness) { val nextWrappedType = (if (i == 0) module.builtIns.getPrimitiveArrayKotlinTypeByPrimitiveKotlinType(currentType) else null) ?: module.builtIns.getArrayType(Variance.INVARIANT, currentType) diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/KotlinJvmBinaryClass.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/KotlinJvmBinaryClass.kt index 6bf2559cda1..ef39deac011 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/KotlinJvmBinaryClass.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/KotlinJvmBinaryClass.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.resolve.constants.ClassLiteralValue interface KotlinJvmBinaryClass { val classId: ClassId @@ -53,12 +54,10 @@ interface KotlinJvmBinaryClass { fun visitParameterAnnotation(index: Int, classId: ClassId, source: SourceElement): AnnotationArgumentVisitor? } - class ClassLiteralId(val classId: ClassId, val arrayNestedness: Int) - interface AnnotationArgumentVisitor { fun visit(name: Name?, value: Any?) - fun visitClassLiteral(name: Name, classLiteralId: ClassLiteralId) + fun visitClassLiteral(name: Name, value: ClassLiteralValue) fun visitEnum(name: Name, enumClassId: ClassId, enumEntryName: Name) @@ -74,7 +73,7 @@ interface KotlinJvmBinaryClass { fun visitEnum(enumClassId: ClassId, enumEntryName: Name) - fun visitClassLiteral(classLiteralId: ClassLiteralId) + fun visitClassLiteral(value: ClassLiteralValue) fun visitEnd() } diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor.java b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor.java index eebc7a97adc..96167db0d8d 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor.java +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor.java @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion; import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.Name; +import org.jetbrains.kotlin.resolve.constants.ClassLiteralValue; import java.util.ArrayList; import java.util.HashMap; @@ -164,7 +165,7 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor } @Override - public void visitClassLiteral(@NotNull Name name, @NotNull ClassLiteralId classLiteralId) { + public void visitClassLiteral(@NotNull Name name, @NotNull ClassLiteralValue classLiteralValue) { } @Override @@ -239,7 +240,7 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor } @Override - public void visitClassLiteral(@NotNull Name name, @NotNull ClassLiteralId classLiteralId) { + public void visitClassLiteral(@NotNull Name name, @NotNull ClassLiteralValue classLiteralValue) { } @Override @@ -311,7 +312,7 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor } @Override - public void visitClassLiteral(@NotNull ClassLiteralId classLiteralId) { + public void visitClassLiteral(@NotNull ClassLiteralValue classLiteralValue) { } @Override diff --git a/core/descriptors.runtime/src/kotlin/reflect/jvm/internal/components/ReflectKotlinClass.kt b/core/descriptors.runtime/src/kotlin/reflect/jvm/internal/components/ReflectKotlinClass.kt index 79131bc6c37..b32374c3fe9 100644 --- a/core/descriptors.runtime/src/kotlin/reflect/jvm/internal/components/ReflectKotlinClass.kt +++ b/core/descriptors.runtime/src/kotlin/reflect/jvm/internal/components/ReflectKotlinClass.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader import org.jetbrains.kotlin.load.kotlin.header.ReadKotlinClassHeaderAnnotationVisitor import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.resolve.constants.ClassLiteralValue import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType import java.lang.reflect.Constructor import java.lang.reflect.Field @@ -184,7 +185,7 @@ private object ReflectClassStructure { visitor.visitEnd() } - private fun Class<*>.classLiteralId(): KotlinJvmBinaryClass.ClassLiteralId { + private fun Class<*>.classLiteralValue(): ClassLiteralValue { var currentClass = this var nestedness = 0 while (currentClass.isArray) { @@ -194,14 +195,14 @@ private object ReflectClassStructure { val classId = if (!currentClass.isPrimitive) currentClass.classId else ClassId.topLevel(JvmPrimitiveType.get(currentClass.name).primitiveType.typeFqName) - return KotlinJvmBinaryClass.ClassLiteralId(classId, nestedness) + return ClassLiteralValue(classId, nestedness) } private fun processAnnotationArgumentValue(visitor: KotlinJvmBinaryClass.AnnotationArgumentVisitor, name: Name, value: Any) { val clazz = value::class.java when { clazz == Class::class.java -> { - visitor.visitClassLiteral(name, (value as Class<*>).classLiteralId()) + visitor.visitClassLiteral(name, (value as Class<*>).classLiteralValue()) } clazz in TYPES_ELIGIBLE_FOR_SIMPLE_VISIT -> { visitor.visit(name, value) @@ -227,7 +228,7 @@ private object ReflectClassStructure { } else if (componentType == Class::class.java) { for (element in value as Array<*>) { - v.visitClassLiteral((element as Class<*>).classLiteralId()) + v.visitClassLiteral((element as Class<*>).classLiteralValue()) } } else { diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/constants/ClassLiteralValue.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/constants/ClassLiteralValue.kt new file mode 100644 index 00000000000..d61ff98a43d --- /dev/null +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/constants/ClassLiteralValue.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.resolve.constants + +import org.jetbrains.kotlin.name.ClassId + +data class ClassLiteralValue(val classId: ClassId, val arrayNestedness: Int) { + override fun toString(): String = buildString { + repeat(arrayNestedness) { append("kotlin/Array<") } + append(classId) + repeat(arrayNestedness) { append(">") } + } +}