From 111b11113d4d5b1969b3511d5203f486574c7295 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Wed, 30 Oct 2013 14:08:35 +0400 Subject: [PATCH] Load classes from Kotlin binaries --- .../resolve/java/JavaDescriptorResolver.java | 56 ++++++++++++++++++- 1 file changed, 53 insertions(+), 3 deletions(-) diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index 3aeafdc6ae7..9f242e43206 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -16,6 +16,7 @@ package org.jetbrains.jet.lang.resolve.java; +import jet.Function1; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.PlatformToKotlinClassMap; @@ -27,10 +28,14 @@ import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaClassResolver; import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaSubModule; import org.jetbrains.jet.lang.resolve.java.resolver.*; import org.jetbrains.jet.lang.resolve.java.structure.JavaClass; +import org.jetbrains.jet.lang.resolve.kotlin.DeserializedDescriptorResolver; +import org.jetbrains.jet.lang.resolve.kotlin.KotlinClassFinder; +import org.jetbrains.jet.lang.resolve.kotlin.KotlinJvmBinaryClass; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.DependencyClassByQualifiedNameResolver; import org.jetbrains.jet.storage.LockBasedStorageManager; +import org.jetbrains.jet.storage.MemoizedFunctionToNullable; import javax.inject.Inject; import java.util.Collections; @@ -45,6 +50,24 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes } public static final Name JAVA_ROOT = Name.special(""); + private final LockBasedStorageManager storageManager = new LockBasedStorageManager(); + + private final MemoizedFunctionToNullable kotlinClassesFromBinaries = storageManager.createMemoizedFunctionWithNullableValues( + new Function1() { + @Override + public ClassDescriptor invoke(FqName fqName) { + //TODO: correct scope + KotlinJvmBinaryClass kotlinClass = kotlinClassFinder.find(fqName); + if (kotlinClass != null) { + ClassDescriptor deserializedDescriptor = deserializedDescriptorResolver.resolveClass(kotlinClass); + if (deserializedDescriptor != null) { + return deserializedDescriptor; + } + } + return null; + } + } + ); private JavaClassResolver classResolver; private JavaPackageFragmentProvider packageFragmentProvider; @@ -55,6 +78,8 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes private ErrorReporter errorReporter; private MethodSignatureChecker signatureChecker; private JavaResolverCache javaResolverCache; + private DeserializedDescriptorResolver deserializedDescriptorResolver; + private KotlinClassFinder kotlinClassFinder; @Inject public void setClassResolver(JavaClassResolver classResolver) { @@ -96,22 +121,47 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes this.javaResolverCache = javaResolverCache; } + @Inject + public void setDeserializedDescriptorResolver(DeserializedDescriptorResolver deserializedDescriptorResolver) { + this.deserializedDescriptorResolver = deserializedDescriptorResolver; + } + + @Inject + public void setKotlinClassFinder(KotlinClassFinder kotlinClassFinder) { + this.kotlinClassFinder = kotlinClassFinder; + } + @NotNull private LazyJavaSubModule getSubModule() { if (subModule == null) { subModule = new LazyJavaSubModule( new GlobalJavaResolverContext( - new LockBasedStorageManager(), + storageManager, javaClassFinder, new LazyJavaClassResolver() { @Override public ClassDescriptor resolveClass(JavaClass aClass) { + FqName fqName = aClass.getFqName(); + if (fqName != null) { + return resolveClassByFqName(fqName); + } + return null; } @Override - public ClassDescriptor resolveClassByFqName(FqName name) { - return javaResolverCache.getClassResolvedFromSource(name); + public ClassDescriptor resolveClassByFqName(FqName fqName) { + ClassDescriptor kotlinClassDescriptor = javaResolverCache.getClassResolvedFromSource(fqName); + if (kotlinClassDescriptor != null) { + return kotlinClassDescriptor; + } + + ClassDescriptor classFromBinaries = kotlinClassesFromBinaries.invoke(fqName); + if (classFromBinaries != null) { + return classFromBinaries; + } + + return null; } }, externalAnnotationResolver,