Make stdlib work with -Xmultifile-package-facades.

Fixed wrong owner mapping in presence of -Xmultifile-package-facades.
Fixed backing field mapping issue.
Added more tests.
This commit is contained in:
Dmitry Petrov
2015-09-11 19:14:10 +03:00
parent 838433ba8a
commit 1586a2df8e
43 changed files with 363 additions and 90 deletions
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.fileClasses
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.kotlin.load.kotlin.PackageClassUtils
import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
@@ -63,6 +64,14 @@ public object JvmFileClassUtil {
public @JvmStatic fun getHiddenPartFqName(file: JetFile, jvmFileClassAnnotations: ParsedJmvFileClassAnnotations): FqName =
file.packageFqName.child(Name.identifier(manglePartName(jvmFileClassAnnotations.name, file.name)))
public @JvmStatic fun getMultifilePackageFacadePartInfo(file: JetFile): JvmFileClassInfo {
val packageFqName = file.packageFqName
val packageFacadeFqName = PackageClassUtils.getPackageClassFqName(packageFqName)
val filePartName = manglePartName(packageFacadeFqName.shortName().asString(), file.name)
val filePartFqName = packageFqName.child(Name.identifier(filePartName))
return JvmMultifileClassPartInfo(filePartFqName, packageFacadeFqName)
}
public @JvmStatic fun manglePartName(facadeName: String, fileName: String): String =
"${facadeName}__${PackagePartClassUtils.getFilePartShortName(fileName)}"
@@ -23,28 +23,28 @@ import org.jetbrains.org.objectweb.asm.Type
public interface JvmFileClassesProvider {
public fun getFileClassInfo(file: JetFile): JvmFileClassInfo
public fun getFileClassFqName(file: JetFile): FqName =
getFileClassInfo(file).fileClassFqName
public fun getFileClassInternalName(file: JetFile): String =
getFileClassFqName(file).getInternalName()
public fun getFileClassType(file: JetFile): Type =
getFileClassFqName(file).getClassType()
public fun getFacadeClassFqName(file: JetFile): FqName =
getFileClassInfo(file).facadeClassFqName
public fun getFacadeClassInternalName(file: JetFile): String =
getFacadeClassFqName(file).getInternalName()
public fun getFacadeClassType(file: JetFile): Type =
getFacadeClassFqName(file).getClassType()
}
private fun FqName.getInternalName(): String =
public fun FqName.getInternalName(): String =
JvmClassName.byFqNameWithoutInnerClasses(this).internalName
private fun FqName.getClassType(): Type =
public fun FqName.getClassType(): Type =
Type.getObjectType(getInternalName())
public fun JvmFileClassesProvider.getFileClassFqName(file: JetFile): FqName =
getFileClassInfo(file).fileClassFqName
public fun JvmFileClassesProvider.getFileClassInternalName(file: JetFile): String =
getFileClassFqName(file).getInternalName()
public fun JvmFileClassesProvider.getFileClassType(file: JetFile): Type =
getFileClassFqName(file).getClassType()
public fun JvmFileClassesProvider.getFacadeClassFqName(file: JetFile): FqName =
getFileClassInfo(file).facadeClassFqName
public fun JvmFileClassesProvider.getFacadeClassInternalName(file: JetFile): String =
getFacadeClassFqName(file).getInternalName()
public fun JvmFileClassesProvider.getFacadeClassType(file: JetFile): Type =
getFacadeClassFqName(file).getClassType()
@@ -82,9 +82,6 @@ public object PackagePartClassUtils {
public @JvmStatic fun fileHasTopLevelCallables(file: JetFile): Boolean =
file.declarations.any { it is JetProperty || it is JetNamedFunction }
public @JvmStatic fun getFilesForPart(partFqName: FqName, files: Collection<JetFile>): List<JetFile> =
getFilesWithCallables(files).filter { getPackagePartFqName(it) == partFqName }
public @JvmStatic fun getFilePartShortName(fileName: String): String =
getPartClassName(FileUtil.getNameWithoutExtension(fileName))