diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java index 8cca0abad2d..ee4de236d06 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java @@ -242,7 +242,7 @@ public class KotlinTypeMapper { } @NotNull - private static ContainingClassesInfo forClassMemberOrNull(@NotNull ClassId classId) { + private static ContainingClassesInfo forClassMember(@NotNull ClassId classId) { return new ContainingClassesInfo(classId, classId); } } @@ -258,7 +258,7 @@ public class KotlinTypeMapper { } else { ClassId classId = getContainerClassIdForClassDescriptor((ClassDescriptor) parentDeclaration); - containingClassesInfo = ContainingClassesInfo.forClassMemberOrNull(classId); + containingClassesInfo = ContainingClassesInfo.forClassMember(classId); } if (containingClassesInfo == null) { throw new IllegalStateException("Couldn't find container for " + deserializedDescriptor.getName()); @@ -269,11 +269,14 @@ public class KotlinTypeMapper { @NotNull private static ClassId getContainerClassIdForClassDescriptor(@NotNull ClassDescriptor classDescriptor) { ClassId classId = DescriptorUtilsKt.getClassId(classDescriptor); + assert classId != null : "Deserialized class should have a ClassId: " + classDescriptor; + if (isInterface(classDescriptor)) { FqName relativeClassName = classId.getRelativeClassName(); //TODO test nested trait fun inlining - classId = new ClassId(classId.getPackageFqName(), Name.identifier(relativeClassName.shortName().asString() + JvmAbi.DEFAULT_IMPLS_SUFFIX)); + return new ClassId(classId.getPackageFqName(), Name.identifier(relativeClassName.shortName().asString() + JvmAbi.DEFAULT_IMPLS_SUFFIX)); } + return classId; } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/MissingDependencyClassChecker.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/MissingDependencyClassChecker.kt index 64c0b73afd1..89973134fde 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/MissingDependencyClassChecker.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/MissingDependencyClassChecker.kt @@ -42,7 +42,7 @@ class MissingDependencyClassChecker : CallChecker { fun consider(classDescriptor: ClassDescriptor) { if (classDescriptor is NotFoundClasses.MockClassDescriptor) { - result.add(classDescriptor.classId) + result.add(classDescriptor.classId!!) return } (classDescriptor.containingDeclaration as? ClassDescriptor)?.let(::consider) diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/annotationCheckers.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/annotationCheckers.kt index ead84e029e9..329a879ddff 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/annotationCheckers.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/annotationCheckers.kt @@ -73,11 +73,11 @@ object FileClassAnnotationsChecker: AdditionalAnnotationChecker { fileAnnotationsToCheck.add(Pair(entry, classDescriptor)) } - if (!fileAnnotationsToCheck.any { it.second.classId.asSingleFqName() == JvmFileClassUtil.JVM_MULTIFILE_CLASS }) return + if (!fileAnnotationsToCheck.any { it.second.classId?.asSingleFqName() == JvmFileClassUtil.JVM_MULTIFILE_CLASS }) return for ((entry, classDescriptor) in fileAnnotationsToCheck) { - val classFqName = classDescriptor.classId.asSingleFqName() - if (ALWAYS_APPLICABLE.contains(classFqName)) continue + val classFqName = classDescriptor.classId!!.asSingleFqName() + if (classFqName in ALWAYS_APPLICABLE) continue if (classDescriptor.getAnnotationRetention() != KotlinRetention.SOURCE) { trace.report(ErrorsJvm.ANNOTATION_IS_NOT_APPLICABLE_TO_MULTIFILE_CLASSES.on(entry, classFqName)) } diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt index 8e1375a92b0..a3aee0a2820 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt @@ -74,16 +74,13 @@ val ClassifierDescriptorWithTypeParameters.denotedClassDescriptor: ClassDescript else -> throw UnsupportedOperationException("Unexpected descriptor kind: $this") } -val ClassDescriptor.classId: ClassId - get() { - val owner = containingDeclaration - if (owner is PackageFragmentDescriptor) { - return ClassId(owner.fqName, name) +val ClassDescriptor.classId: ClassId? + get() = containingDeclaration.let { owner -> + when (owner) { + is PackageFragmentDescriptor -> ClassId(owner.fqName, name) + is ClassDescriptor -> owner.classId?.createNestedClassId(name) + else -> null } - else if (owner is ClassDescriptor) { - return owner.classId.createNestedClassId(name) - } - throw IllegalStateException("Illegal container: $owner") } val ClassifierDescriptorWithTypeParameters.hasCompanionObject: Boolean diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt index 866d0def049..80526c5aeb8 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt @@ -161,7 +161,7 @@ class DeserializedClassDescriptor( if (unresolved.isNotEmpty()) { c.components.errorReporter.reportIncompleteHierarchy( this@DeserializedClassDescriptor, - unresolved.map { it.classId.asSingleFqName().asString() } + unresolved.map { it.classId?.asSingleFqName()?.asString() ?: it.name.asString() } ) } diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/RuntimeTypeMapper.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/RuntimeTypeMapper.kt index c17403fc765..2016f7868d1 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/RuntimeTypeMapper.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/RuntimeTypeMapper.kt @@ -271,7 +271,7 @@ internal object RuntimeTypeMapper { val classId = klass.classId if (!classId.isLocal) { - JavaToKotlinClassMap.INSTANCE.mapJavaToKotlin(classId.asSingleFqName(), DefaultBuiltIns.Instance)?.let { return it.classId } + JavaToKotlinClassMap.INSTANCE.mapJavaToKotlin(classId.asSingleFqName(), DefaultBuiltIns.Instance)?.let { return it.classId!! } } return classId diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/util.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/util.kt index 1e63908d6c4..17f2c9cd219 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/util.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/util.kt @@ -51,7 +51,7 @@ internal fun ClassDescriptor.toJavaClass(): Class<*>? { else -> { // If this is neither a Kotlin class nor a Java class, it is either a built-in or some fake class descriptor like the one // that's created for java.io.Serializable in JvmBuiltInsSettings - val classId = JavaToKotlinClassMap.INSTANCE.mapKotlinToJava(DescriptorUtils.getFqName(this)) ?: classId + val classId = JavaToKotlinClassMap.INSTANCE.mapKotlinToJava(DescriptorUtils.getFqName(this)) ?: classId!! val packageName = classId.packageFqName.asString() val className = classId.relativeClassName.asString() // All pseudo-classes like kotlin.String.Companion must be accessible from the current class loader diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/LightMemberOriginForCompiledElement.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/LightMemberOriginForCompiledElement.kt index 46a2336e214..fa4e96f2b2c 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/LightMemberOriginForCompiledElement.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/LightMemberOriginForCompiledElement.kt @@ -81,10 +81,10 @@ private fun PsiMember.relativeClassName(): List { } private fun ClassDescriptor.relativeClassName(): List { - return classId.relativeClassName.pathSegments().drop(1).orEmpty() + return classId!!.relativeClassName.pathSegments().drop(1).orEmpty() } -private fun ClassDescriptor.desc(): String = "L" + JvmClassName.byClassId(classId).internalName + ";" +private fun ClassDescriptor.desc(): String = "L" + JvmClassName.byClassId(classId!!).internalName + ";" private object ByJvmSignatureIndexer : DecompiledTextIndexer { override fun indexDescriptor(descriptor: DeclarationDescriptor): Collection { diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializationUtil.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializationUtil.kt index 87611c2a745..a7d3918fd2d 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializationUtil.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializationUtil.kt @@ -187,7 +187,7 @@ object KotlinJavascriptSerializationUtil { } private fun getFileName(classDescriptor: ClassDescriptor): String { - return KotlinJavascriptSerializedResourcePaths.getClassMetadataPath(classDescriptor.classId) + return KotlinJavascriptSerializedResourcePaths.getClassMetadataPath(classDescriptor.classId!!) } fun toContentMap(module: ModuleDescriptor): Map {