Expose validity of objc stubs' descriptors

This commit is contained in:
Florian Kistner
2020-03-09 17:55:35 +01:00
committed by SvyatoslavScherbina
parent dcefc2cb31
commit 4b4bbdd02c
2 changed files with 27 additions and 6 deletions
@@ -18,7 +18,10 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier
import org.jetbrains.kotlin.psi.psiUtil.modalityModifier
import org.jetbrains.kotlin.psi.psiUtil.visibilityModifierTypeOrDefault
import org.jetbrains.kotlin.resolve.BindingTrace import org.jetbrains.kotlin.resolve.BindingTrace
import org.jetbrains.kotlin.resolve.BindingTraceContext import org.jetbrains.kotlin.resolve.BindingTraceContext
import org.jetbrains.kotlin.resolve.DescriptorResolver import org.jetbrains.kotlin.resolve.DescriptorResolver
@@ -26,7 +29,7 @@ import org.jetbrains.kotlin.resolve.TypeResolver
import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver
import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.resolve.lazy.FileScopeProvider import org.jetbrains.kotlin.resolve.lazy.FileScopeProvider
import org.jetbrains.kotlin.resolve.lazy.ResolveSession import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer
import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.LexicalScope
import org.jetbrains.kotlin.resolve.scopes.LexicalScopeKind import org.jetbrains.kotlin.resolve.scopes.LexicalScopeKind
import org.jetbrains.kotlin.resolve.scopes.LexicalWritableScope import org.jetbrains.kotlin.resolve.scopes.LexicalWritableScope
@@ -51,7 +54,7 @@ interface ObjCExportLazy {
fun createObjCExportLazy( fun createObjCExportLazy(
configuration: ObjCExportLazy.Configuration, configuration: ObjCExportLazy.Configuration,
warningCollector: ObjCExportWarningCollector, warningCollector: ObjCExportWarningCollector,
resolveSession: ResolveSession, codeAnalyzer: KotlinCodeAnalyzer,
typeResolver: TypeResolver, typeResolver: TypeResolver,
descriptorResolver: DescriptorResolver, descriptorResolver: DescriptorResolver,
fileScopeProvider: FileScopeProvider, fileScopeProvider: FileScopeProvider,
@@ -60,7 +63,7 @@ fun createObjCExportLazy(
): ObjCExportLazy = ObjCExportLazyImpl( ): ObjCExportLazy = ObjCExportLazyImpl(
configuration, configuration,
warningCollector, warningCollector,
resolveSession, codeAnalyzer,
typeResolver, typeResolver,
descriptorResolver, descriptorResolver,
fileScopeProvider, fileScopeProvider,
@@ -71,7 +74,7 @@ fun createObjCExportLazy(
internal class ObjCExportLazyImpl( internal class ObjCExportLazyImpl(
private val configuration: ObjCExportLazy.Configuration, private val configuration: ObjCExportLazy.Configuration,
warningCollector: ObjCExportWarningCollector, warningCollector: ObjCExportWarningCollector,
private val resolveSession: ResolveSession, private val codeAnalyzer: KotlinCodeAnalyzer,
private val typeResolver: TypeResolver, private val typeResolver: TypeResolver,
private val descriptorResolver: DescriptorResolver, private val descriptorResolver: DescriptorResolver,
private val fileScopeProvider: FileScopeProvider, private val fileScopeProvider: FileScopeProvider,
@@ -95,6 +98,9 @@ internal class ObjCExportLazyImpl(
objcGenerics = configuration.objcGenerics objcGenerics = configuration.objcGenerics
) )
private val isValid: Boolean
get() = codeAnalyzer.moduleDescriptor.isValid
override fun generateBase() = translator.generateBaseDeclarations() override fun generateBase() = translator.generateBaseDeclarations()
override fun translate(file: KtFile): List<ObjCTopLevel<*>> = override fun translate(file: KtFile): List<ObjCTopLevel<*>> =
@@ -203,7 +209,7 @@ internal class ObjCExportLazyImpl(
} }
private fun resolveDeclaration(ktDeclaration: KtDeclaration): DeclarationDescriptor = private fun resolveDeclaration(ktDeclaration: KtDeclaration): DeclarationDescriptor =
resolveSession.resolveToDescriptor(ktDeclaration) codeAnalyzer.resolveToDescriptor(ktDeclaration)
private fun resolve(ktClassOrObject: KtClassOrObject) = private fun resolve(ktClassOrObject: KtClassOrObject) =
resolveDeclaration(ktClassOrObject) as ClassDescriptor resolveDeclaration(ktClassOrObject) as ClassDescriptor
@@ -301,6 +307,9 @@ internal class ObjCExportLazyImpl(
) : LazyObjCProtocol(name) { ) : LazyObjCProtocol(name) {
override val descriptor: ClassDescriptor by lazy { lazy.resolve(psi) } override val descriptor: ClassDescriptor by lazy { lazy.resolve(psi) }
override val isValid: Boolean
get() = lazy.isValid
override fun computeRealStub(): ObjCProtocol = lazy.translator.translateInterface(descriptor) override fun computeRealStub(): ObjCProtocol = lazy.translator.translateInterface(descriptor)
} }
@@ -313,6 +322,9 @@ internal class ObjCExportLazyImpl(
) : LazyObjCInterface(name = name, generics = generics, categoryName = null, attributes = attributes) { ) : LazyObjCInterface(name = name, generics = generics, categoryName = null, attributes = attributes) {
override val descriptor: ClassDescriptor by lazy { lazy.resolve(psi) } override val descriptor: ClassDescriptor by lazy { lazy.resolve(psi) }
override val isValid: Boolean
get() = lazy.isValid
override fun computeRealStub(): ObjCInterface = lazy.translator.translateClass(descriptor) override fun computeRealStub(): ObjCInterface = lazy.translator.translateClass(descriptor)
} }
@@ -325,6 +337,9 @@ internal class ObjCExportLazyImpl(
override val descriptor: ClassDescriptor? override val descriptor: ClassDescriptor?
get() = null get() = null
override val isValid: Boolean
get() = lazy.isValid
override val psi: PsiElement? override val psi: PsiElement?
get() = null get() = null
@@ -348,6 +363,9 @@ internal class ObjCExportLazyImpl(
override val descriptor: ClassDescriptor? override val descriptor: ClassDescriptor?
get() = null get() = null
override val isValid: Boolean
get() = lazy.isValid
override val psi: PsiElement? override val psi: PsiElement?
get() = null get() = null
@@ -7,12 +7,15 @@ package org.jetbrains.kotlin.backend.konan.objcexport
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.resolve.source.PsiSourceElement import org.jetbrains.kotlin.resolve.source.PsiSourceElement
abstract class Stub<out D : DeclarationDescriptor>(val name: String) { abstract class Stub<out D : DeclarationDescriptor>(val name: String) {
abstract val descriptor: D? abstract val descriptor: D?
open val psi: PsiElement? open val psi: PsiElement?
get() = ((descriptor as? DeclarationDescriptorWithSource)?.source as? PsiSourceElement)?.psi get() = ((descriptor as? DeclarationDescriptorWithSource)?.source as? PsiSourceElement)?.psi
open val isValid: Boolean
get() = descriptor?.module?.isValid ?: true
} }
abstract class ObjCTopLevel<out D : DeclarationDescriptor>(name: String) : Stub<D>(name) abstract class ObjCTopLevel<out D : DeclarationDescriptor>(name: String) : Stub<D>(name)