From 52e0e744af4a129b82ca8f4141f1b227d3fc9747 Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Fri, 8 Jul 2022 18:28:49 +0200 Subject: [PATCH] move JvmFileClassInfo and JvmFileClassUtil to frontend.common.jvm ^KT-53097 --- .../kotlin/codegen/PropertyCodegen.java | 6 +-- .../kotlin/fileClasses/JvmFileClassInfo.kt | 32 ++++++++++++++ .../kotlin/fileClasses/JvmFileClassUtil.kt | 41 +++--------------- .../kotlin/fileClasses/JvmFileClassInfo.kt | 43 ------------------- .../kotlin/fileClasses/JvmFileClassUtils.kt | 31 +++++++++++++ 5 files changed, 71 insertions(+), 82 deletions(-) create mode 100644 compiler/frontend.common.jvm/src/org/jetbrains/kotlin/fileClasses/JvmFileClassInfo.kt rename compiler/{frontend.java => frontend.common.jvm}/src/org/jetbrains/kotlin/fileClasses/JvmFileClassUtil.kt (79%) delete mode 100644 compiler/frontend.java/src/org/jetbrains/kotlin/fileClasses/JvmFileClassInfo.kt create mode 100644 compiler/frontend.java/src/org/jetbrains/kotlin/fileClasses/JvmFileClassUtils.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java index e35cb2fff35..71c333fd544 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2018 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -34,9 +34,9 @@ import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKt; import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodGenericSignature; import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature; import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor; +import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.kotlin.types.error.ErrorTypeKind; import org.jetbrains.kotlin.types.error.ErrorUtils; -import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.org.objectweb.asm.FieldVisitor; import org.jetbrains.org.objectweb.asm.MethodVisitor; import org.jetbrains.org.objectweb.asm.Opcodes; @@ -55,7 +55,7 @@ import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isJvmInterface; import static org.jetbrains.kotlin.codegen.binding.CodegenBinding.*; import static org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings.*; import static org.jetbrains.kotlin.diagnostics.Errors.EXPECTED_FUNCTION_SOURCE_WITH_DEFAULT_ARGUMENTS_NOT_FOUND; -import static org.jetbrains.kotlin.fileClasses.JvmFileClassUtilKt.isTopLevelInJvmMultifileClass; +import static org.jetbrains.kotlin.fileClasses.JvmFileClassUtilsKt.isTopLevelInJvmMultifileClass; import static org.jetbrains.kotlin.resolve.DescriptorUtils.isCompanionObject; import static org.jetbrains.kotlin.resolve.DescriptorUtils.isInterface; import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.K_PROPERTY_TYPE; diff --git a/compiler/frontend.common.jvm/src/org/jetbrains/kotlin/fileClasses/JvmFileClassInfo.kt b/compiler/frontend.common.jvm/src/org/jetbrains/kotlin/fileClasses/JvmFileClassInfo.kt new file mode 100644 index 00000000000..d1fb091845e --- /dev/null +++ b/compiler/frontend.common.jvm/src/org/jetbrains/kotlin/fileClasses/JvmFileClassInfo.kt @@ -0,0 +1,32 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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.fileClasses + +import org.jetbrains.kotlin.name.FqName + +interface JvmFileClassInfo { + val fileClassFqName: FqName + val facadeClassFqName: FqName + val withJvmName: Boolean + val withJvmMultifileClass: Boolean +} + +class JvmSimpleFileClassInfo( + override val fileClassFqName: FqName, + override val withJvmName: Boolean +) : JvmFileClassInfo { + override val facadeClassFqName: FqName get() = fileClassFqName + override val withJvmMultifileClass: Boolean get() = false +} + +class JvmMultifileClassPartInfo( + override val fileClassFqName: FqName, + override val facadeClassFqName: FqName +) : JvmFileClassInfo { + override val withJvmName: Boolean get() = true + override val withJvmMultifileClass: Boolean get() = true +} + diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/fileClasses/JvmFileClassUtil.kt b/compiler/frontend.common.jvm/src/org/jetbrains/kotlin/fileClasses/JvmFileClassUtil.kt similarity index 79% rename from compiler/frontend.java/src/org/jetbrains/kotlin/fileClasses/JvmFileClassUtil.kt rename to compiler/frontend.common.jvm/src/org/jetbrains/kotlin/fileClasses/JvmFileClassUtil.kt index d3eb3be014d..b558bc5d46a 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/fileClasses/JvmFileClassUtil.kt +++ b/compiler/frontend.common.jvm/src/org/jetbrains/kotlin/fileClasses/JvmFileClassUtil.kt @@ -1,17 +1,6 @@ /* - * 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. + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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.fileClasses @@ -19,19 +8,14 @@ package org.jetbrains.kotlin.fileClasses import com.intellij.openapi.diagnostic.Logger import com.intellij.psi.util.CachedValueProvider import com.intellij.psi.util.CachedValuesManager -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.load.java.descriptors.getImplClassNameForDeserialized -import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.JvmNames.JVM_MULTIFILE_CLASS_SHORT -import org.jetbrains.kotlin.name.JvmNames.JVM_NAME_SHORT import org.jetbrains.kotlin.name.JvmNames.JVM_PACKAGE_NAME_SHORT import org.jetbrains.kotlin.name.JvmNames.MULTIFILE_PART_NAME_DELIMITER import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.jvm.JvmClassName import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedMemberDescriptor import org.jetbrains.kotlin.utils.addToStdlib.safeAs @@ -68,9 +52,11 @@ object JvmFileClassUtil { fileClassFqName = packageFqName.child(Name.identifier(manglePartName(simpleName, file.name))), facadeClassFqName = facadeClassFqName ) + else -> JvmSimpleFileClassInfo(facadeClassFqName, true) } } + else -> JvmSimpleFileClassInfo(PackagePartClassUtils.getPackagePartFqName(packageFqName, file.name), false) } } @@ -102,6 +88,7 @@ object JvmFileClassUtil { else -> getArgumentExpression().safeAs() } } ?: return null + val singleEntry = stringTemplateExpression.entries.singleOrNull() as? KtLiteralStringTemplateEntry ?: return null return singleEntry.text } @@ -136,23 +123,5 @@ private val LOG = Logger.getInstance("JvmFileClassUtil") fun KtDeclaration.isInsideJvmMultifileClassFile() = JvmFileClassUtil.findAnnotationEntryOnFileNoResolve(containingKtFile, JVM_MULTIFILE_CLASS_SHORT) != null -fun DeclarationDescriptor.isTopLevelInJvmMultifileClass(): Boolean { - if (containingDeclaration !is PackageFragmentDescriptor) return false - - val declaration = DescriptorToSourceUtils.descriptorToDeclaration(this) - if (declaration is KtDeclaration) { - return declaration.isInsideJvmMultifileClassFile() - } - - if (this is DeserializedMemberDescriptor) { - val containerSource = containerSource - if (containerSource is JvmPackagePartSource && containerSource.facadeClassName != null) { - return true - } - } - - return false -} - val FqName.internalNameWithoutInnerClasses: String get() = JvmClassName.byFqNameWithoutInnerClasses(this).internalName diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/fileClasses/JvmFileClassInfo.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/fileClasses/JvmFileClassInfo.kt deleted file mode 100644 index 1fa9d77c214..00000000000 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/fileClasses/JvmFileClassInfo.kt +++ /dev/null @@ -1,43 +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 org.jetbrains.kotlin.fileClasses - -import org.jetbrains.kotlin.name.FqName - -interface JvmFileClassInfo { - val fileClassFqName: FqName - val facadeClassFqName: FqName - val withJvmName: Boolean - val withJvmMultifileClass: Boolean -} - -class JvmSimpleFileClassInfo( - override val fileClassFqName: FqName, - override val withJvmName: Boolean -) : JvmFileClassInfo { - override val facadeClassFqName: FqName get() = fileClassFqName - override val withJvmMultifileClass: Boolean get() = false -} - -class JvmMultifileClassPartInfo( - override val fileClassFqName: FqName, - override val facadeClassFqName: FqName -) : JvmFileClassInfo { - override val withJvmName: Boolean get() = true - override val withJvmMultifileClass: Boolean get() = true -} - diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/fileClasses/JvmFileClassUtils.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/fileClasses/JvmFileClassUtils.kt new file mode 100644 index 00000000000..81717e64b16 --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/fileClasses/JvmFileClassUtils.kt @@ -0,0 +1,31 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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.fileClasses + +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor +import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource +import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils +import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedMemberDescriptor + +fun DeclarationDescriptor.isTopLevelInJvmMultifileClass(): Boolean { + if (containingDeclaration !is PackageFragmentDescriptor) return false + + val declaration = DescriptorToSourceUtils.descriptorToDeclaration(this) + if (declaration is KtDeclaration) { + return declaration.isInsideJvmMultifileClassFile() + } + + if (this is DeserializedMemberDescriptor) { + val containerSource = containerSource + if (containerSource is JvmPackagePartSource && containerSource.facadeClassName != null) { + return true + } + } + + return false +} \ No newline at end of file