org.jetbrains.kotlin.analysis.decompiler.psi.DeserializerForDecompilerBase.kt Maven / Gradle / Ivy
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.kotlin.analysis.decompiler.psi
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.kotlin.descriptors.PackageFragmentProvider
import org.jetbrains.kotlin.descriptors.PackageFragmentProviderOptimized
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.descriptors.impl.MutablePackageFragmentDescriptor
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.deserialization.DeserializationComponents
import org.jetbrains.kotlin.serialization.deserialization.LocalClassifierTypeSettings
import org.jetbrains.kotlin.storage.LockBasedStorageManager
import org.jetbrains.kotlin.storage.StorageManager
import org.jetbrains.kotlin.types.SimpleType
abstract class DeserializerForDecompilerBase(val directoryPackageFqName: FqName) : ResolverForDecompiler {
protected abstract val deserializationComponents: DeserializationComponents
protected abstract val builtIns: KotlinBuiltIns
protected val storageManager: StorageManager = LockBasedStorageManager.NO_LOCKS
protected val moduleDescriptor: ModuleDescriptorImpl = createDummyModule("module for building decompiled sources")
protected val packageFragmentProvider: PackageFragmentProvider = object : PackageFragmentProviderOptimized {
override fun collectPackageFragments(fqName: FqName, packageFragments: MutableCollection) {
packageFragments.add(createDummyPackageFragment(fqName))
}
override fun isEmpty(fqName: FqName): Boolean = false
@Suppress("OVERRIDE_DEPRECATION")
override fun getPackageFragments(fqName: FqName): List {
return listOf(createDummyPackageFragment(fqName))
}
override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection {
throw UnsupportedOperationException("This method is not supposed to be called.")
}
}
override fun resolveTopLevelClass(classId: ClassId) = deserializationComponents.deserializeClass(classId)
protected fun createDummyPackageFragment(fqName: FqName): MutablePackageFragmentDescriptor =
MutablePackageFragmentDescriptor(moduleDescriptor, fqName)
private fun createDummyModule(name: String) = ModuleDescriptorImpl(Name.special("<$name>"), storageManager, builtIns)
init {
moduleDescriptor.initialize(packageFragmentProvider)
moduleDescriptor.setDependencies(moduleDescriptor, moduleDescriptor.builtIns.builtInsModule)
}
}
class ResolveEverythingToKotlinAnyLocalClassifierResolver(private val builtIns: KotlinBuiltIns) : LocalClassifierTypeSettings {
override val replacementTypeForLocalClassifiers: SimpleType?
get() = builtIns.anyType
}