- call multifile class members (compiling against binaries)

- inline multifile class members
This commit is contained in:
Dmitry Petrov
2015-09-10 20:23:24 +03:00
parent 5f9a59d655
commit 50f83da6da
23 changed files with 296 additions and 42 deletions
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.load.java.structure.JavaClass
import org.jetbrains.kotlin.load.java.structure.JavaPackage
import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass
import org.jetbrains.kotlin.load.kotlin.PackageClassUtils
import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.SpecialNames
@@ -58,6 +59,22 @@ public class LazyJavaPackageScope(
}.filterNotNull()
}
private val partToFacade = c.storageManager.createLazyValue {
val result = hashMapOf<String, String>()
for (kotlinClass in kotlinBinaryClasses()) {
val header = kotlinClass.classHeader
if (header.kind == KotlinClassHeader.Kind.MULTIFILE_CLASS_PART) {
val partName = kotlinClass.classId.shortClassName.asString()
val facadeName = header.multifileClassName ?: ""
result[partName] = facadeName
}
}
result
}
public fun getFacadeSimpleNameForPartSimpleName(partName: String): String? =
partToFacade()[partName]
private val deserializedPackageScope = c.storageManager.createLazyValue {
if (kotlinBinaryClasses().isEmpty())
JetScope.Empty
@@ -69,7 +69,7 @@ public final class DeserializedDescriptorResolver {
@Nullable
public JetScope createKotlinPackagePartScope(@NotNull PackageFragmentDescriptor descriptor, @NotNull KotlinJvmBinaryClass kotlinClass) {
String[] data = readData(kotlinClass, KotlinClassHeader.Kind.FILE_FACADE);
String[] data = readData(kotlinClass, null);
if (data != null) {
//all classes are included in java scope
PackageData packageData = JvmProtoBufUtil.readPackageDataFrom(data);
@@ -102,12 +102,12 @@ public final class DeserializedDescriptorResolver {
}
@Nullable
public String[] readData(@NotNull KotlinJvmBinaryClass kotlinClass, @NotNull KotlinClassHeader.Kind expectedKind) {
public String[] readData(@NotNull KotlinJvmBinaryClass kotlinClass, @Nullable KotlinClassHeader.Kind expectedKind) {
KotlinClassHeader header = kotlinClass.getClassHeader();
if (!header.getIsCompatibleAbiVersion()) {
errorReporter.reportIncompatibleAbiVersion(kotlinClass.getClassId(), kotlinClass.getLocation(), header.getVersion());
}
else if (header.getKind() == expectedKind) {
else if (expectedKind == null || header.getKind() == expectedKind) {
return header.getAnnotationData();
}