Manually set up built-ins for decompiler

This commit is contained in:
Denis Zharkov
2016-04-01 12:50:07 +03:00
parent c4a899d9a4
commit 7f860fa051
5 changed files with 16 additions and 6 deletions
@@ -20,6 +20,8 @@ import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.builtins.BuiltInSerializerProtocol import org.jetbrains.kotlin.builtins.BuiltInSerializerProtocol
import org.jetbrains.kotlin.builtins.BuiltInsClassDataFinder import org.jetbrains.kotlin.builtins.BuiltInsClassDataFinder
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.idea.decompiler.textBuilder.DeserializerForDecompilerBase import org.jetbrains.kotlin.idea.decompiler.textBuilder.DeserializerForDecompilerBase
import org.jetbrains.kotlin.idea.decompiler.textBuilder.LoggingErrorReporter import org.jetbrains.kotlin.idea.decompiler.textBuilder.LoggingErrorReporter
@@ -39,6 +41,7 @@ class KotlinBuiltInDeserializerForDecompiler(
private val nameResolver: NameResolver private val nameResolver: NameResolver
) : DeserializerForDecompilerBase(packageDirectory, packageFqName) { ) : DeserializerForDecompilerBase(packageDirectory, packageFqName) {
override val targetPlatform: TargetPlatform get() = TargetPlatform.Default override val targetPlatform: TargetPlatform get() = TargetPlatform.Default
override val builtIns: KotlinBuiltIns get() = DefaultBuiltIns.Instance
override val deserializationComponents: DeserializationComponents override val deserializationComponents: DeserializationComponents
@@ -48,7 +51,7 @@ class KotlinBuiltInDeserializerForDecompiler(
deserializationComponents = DeserializationComponents( deserializationComponents = DeserializationComponents(
storageManager, moduleDescriptor, BuiltInsClassDataFinder(proto, nameResolver), storageManager, moduleDescriptor, BuiltInsClassDataFinder(proto, nameResolver),
AnnotationAndConstantLoaderImpl(moduleDescriptor, notFoundClasses, BuiltInSerializerProtocol), packageFragmentProvider, AnnotationAndConstantLoaderImpl(moduleDescriptor, notFoundClasses, BuiltInSerializerProtocol), packageFragmentProvider,
ResolveEverythingToKotlinAnyLocalClassResolver(targetPlatform.builtIns), LoggingErrorReporter(LOG), ResolveEverythingToKotlinAnyLocalClassResolver(builtIns), LoggingErrorReporter(LOG),
LookupTracker.DO_NOTHING, FlexibleTypeFactory.ThrowException, ClassDescriptorFactory.EMPTY, LookupTracker.DO_NOTHING, FlexibleTypeFactory.ThrowException, ClassDescriptorFactory.EMPTY,
notFoundClasses notFoundClasses
) )
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.idea.decompiler.classFile
import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.idea.caches.IDEKotlinBinaryClassCache import org.jetbrains.kotlin.idea.caches.IDEKotlinBinaryClassCache
import org.jetbrains.kotlin.idea.decompiler.textBuilder.DeserializerForDecompilerBase import org.jetbrains.kotlin.idea.decompiler.textBuilder.DeserializerForDecompilerBase
@@ -29,6 +30,7 @@ import org.jetbrains.kotlin.load.java.structure.JavaClass
import org.jetbrains.kotlin.load.kotlin.* import org.jetbrains.kotlin.load.kotlin.*
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.platform.JvmBuiltIns
import org.jetbrains.kotlin.resolve.TargetPlatform import org.jetbrains.kotlin.resolve.TargetPlatform
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
import org.jetbrains.kotlin.serialization.ClassDataWithSource import org.jetbrains.kotlin.serialization.ClassDataWithSource
@@ -51,6 +53,7 @@ class DeserializerForClassfileDecompiler(
directoryPackageFqName: FqName directoryPackageFqName: FqName
) : DeserializerForDecompilerBase(packageDirectory, directoryPackageFqName) { ) : DeserializerForDecompilerBase(packageDirectory, directoryPackageFqName) {
override val targetPlatform: TargetPlatform get() = JvmPlatform override val targetPlatform: TargetPlatform get() = JvmPlatform
override val builtIns: KotlinBuiltIns get() = JvmBuiltIns.Instance
private val classFinder = DirectoryBasedClassFinder(packageDirectory, directoryPackageFqName) private val classFinder = DirectoryBasedClassFinder(packageDirectory, directoryPackageFqName)
@@ -64,7 +67,7 @@ class DeserializerForClassfileDecompiler(
deserializationComponents = DeserializationComponents( deserializationComponents = DeserializationComponents(
storageManager, moduleDescriptor, classDataFinder, annotationAndConstantLoader, packageFragmentProvider, storageManager, moduleDescriptor, classDataFinder, annotationAndConstantLoader, packageFragmentProvider,
ResolveEverythingToKotlinAnyLocalClassResolver(targetPlatform.builtIns), LoggingErrorReporter(LOG), ResolveEverythingToKotlinAnyLocalClassResolver(builtIns), LoggingErrorReporter(LOG),
LookupTracker.DO_NOTHING, FlexibleJavaClassifierTypeFactory, ClassDescriptorFactory.EMPTY, notFoundClasses LookupTracker.DO_NOTHING, FlexibleJavaClassifierTypeFactory, ClassDescriptorFactory.EMPTY, notFoundClasses
) )
} }
@@ -18,6 +18,8 @@ package org.jetbrains.kotlin.idea.decompiler.js
import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.idea.decompiler.textBuilder.DeserializerForDecompilerBase import org.jetbrains.kotlin.idea.decompiler.textBuilder.DeserializerForDecompilerBase
import org.jetbrains.kotlin.idea.decompiler.textBuilder.LoggingErrorReporter import org.jetbrains.kotlin.idea.decompiler.textBuilder.LoggingErrorReporter
@@ -48,6 +50,7 @@ class KotlinJavaScriptDeserializerForDecompiler(
} }
override val targetPlatform: TargetPlatform get() = JsPlatform override val targetPlatform: TargetPlatform get() = JsPlatform
override val builtIns: KotlinBuiltIns get() = DefaultBuiltIns.Instance
private val classDataFinder = KotlinJavascriptClassDataFinder(nameResolver) { path -> private val classDataFinder = KotlinJavascriptClassDataFinder(nameResolver) { path ->
packageDirectory.findChild(path.substringAfterLast("/"))?.inputStream packageDirectory.findChild(path.substringAfterLast("/"))?.inputStream
@@ -61,7 +64,7 @@ class KotlinJavaScriptDeserializerForDecompiler(
deserializationComponents = DeserializationComponents( deserializationComponents = DeserializationComponents(
storageManager, moduleDescriptor, classDataFinder, annotationAndConstantLoader, packageFragmentProvider, storageManager, moduleDescriptor, classDataFinder, annotationAndConstantLoader, packageFragmentProvider,
ResolveEverythingToKotlinAnyLocalClassResolver(targetPlatform.builtIns), LoggingErrorReporter(LOG), ResolveEverythingToKotlinAnyLocalClassResolver(builtIns), LoggingErrorReporter(LOG),
LookupTracker.DO_NOTHING, DynamicTypeFactory, ClassDescriptorFactory.EMPTY, LookupTracker.DO_NOTHING, DynamicTypeFactory, ClassDescriptorFactory.EMPTY,
notFoundClasses notFoundClasses
) )
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.idea.decompiler.navigation
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.idea.decompiler.KtDecompiledFile import org.jetbrains.kotlin.idea.decompiler.KtDecompiledFile
import org.jetbrains.kotlin.idea.decompiler.textBuilder.DecompiledTextIndexer import org.jetbrains.kotlin.idea.decompiler.textBuilder.DecompiledTextIndexer
@@ -33,7 +34,6 @@ import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.renderer.DescriptorRenderer
import org.jetbrains.kotlin.renderer.DescriptorRendererModifier import org.jetbrains.kotlin.renderer.DescriptorRendererModifier
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.TargetPlatform
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
import org.jetbrains.kotlin.resolve.descriptorUtil.resolveTopLevelClass import org.jetbrains.kotlin.resolve.descriptorUtil.resolveTopLevelClass
import org.jetbrains.kotlin.types.ErrorUtils import org.jetbrains.kotlin.types.ErrorUtils
@@ -126,7 +126,7 @@ object ByDescriptorIndexer : DecompiledTextIndexer<String> {
val classFqName = descriptor.fqNameSafe val classFqName = descriptor.fqNameSafe
if (BuiltInClassesAreSerializableOnJvm.isSerializableInJava(classFqName)) { if (BuiltInClassesAreSerializableOnJvm.isSerializableInJava(classFqName)) {
val builtInDescriptor = TargetPlatform.Default.builtIns.builtInsModule.resolveTopLevelClass(classFqName, NoLookupLocation.FROM_IDE) val builtInDescriptor = DefaultBuiltIns.Instance.builtInsModule.resolveTopLevelClass(classFqName, NoLookupLocation.FROM_IDE)
return builtInDescriptor?.let { file.getDeclaration(this, it.toStringKey()) } return builtInDescriptor?.let { file.getDeclaration(this, it.toStringKey()) }
} }
return null return null
@@ -40,6 +40,7 @@ abstract class DeserializerForDecompilerBase(
protected abstract val deserializationComponents: DeserializationComponents protected abstract val deserializationComponents: DeserializationComponents
protected abstract val targetPlatform: TargetPlatform protected abstract val targetPlatform: TargetPlatform
protected abstract val builtIns: KotlinBuiltIns
protected val storageManager: StorageManager = LockBasedStorageManager.NO_LOCKS protected val storageManager: StorageManager = LockBasedStorageManager.NO_LOCKS
@@ -60,7 +61,7 @@ abstract class DeserializerForDecompilerBase(
protected fun createDummyPackageFragment(fqName: FqName): MutablePackageFragmentDescriptor = protected fun createDummyPackageFragment(fqName: FqName): MutablePackageFragmentDescriptor =
MutablePackageFragmentDescriptor(moduleDescriptor, fqName) MutablePackageFragmentDescriptor(moduleDescriptor, fqName)
private fun createDummyModule(name: String) = ModuleDescriptorImpl(Name.special("<$name>"), storageManager, ModuleParameters.Empty, targetPlatform.builtIns) private fun createDummyModule(name: String) = ModuleDescriptorImpl(Name.special("<$name>"), storageManager, ModuleParameters.Empty, builtIns)
init { init {
moduleDescriptor.initialize(packageFragmentProvider) moduleDescriptor.initialize(packageFragmentProvider)