Lint: Fix KT-11922: ClassCastException: org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl cannot be cast to org.jetbrains.kotlin.descriptors.ClassDescriptor
This commit is contained in:
@@ -17,14 +17,9 @@
|
|||||||
package org.jetbrains.kotlin.uast
|
package org.jetbrains.kotlin.uast
|
||||||
|
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.codegen.ClassBuilderMode
|
|
||||||
import org.jetbrains.kotlin.codegen.state.IncompatibleClassTracker
|
|
||||||
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
|
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.fileClasses.NoResolveFileClassesProvider
|
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
|
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
|
||||||
import org.jetbrains.kotlin.load.java.JvmAbi
|
|
||||||
import org.jetbrains.kotlin.psi.KtClass
|
import org.jetbrains.kotlin.psi.KtClass
|
||||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||||
import org.jetbrains.kotlin.psi.KtObjectDeclaration
|
import org.jetbrains.kotlin.psi.KtObjectDeclaration
|
||||||
@@ -74,10 +69,10 @@ class KotlinUClass(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override val internalName by lz {
|
override val internalName by lz {
|
||||||
val descriptor = resolveToDescriptor() ?: return@lz null
|
val generationState = psi.getGenerationState()
|
||||||
val typeMapper = KotlinTypeMapper(BindingContext.EMPTY, ClassBuilderMode.LIGHT_CLASSES, NoResolveFileClassesProvider, null,
|
val descriptor = generationState.bindingContext[BindingContext.DECLARATION_TO_DESCRIPTOR, psi]
|
||||||
IncompatibleClassTracker.DoNothing, JvmAbi.DEFAULT_MODULE_NAME)
|
as? ClassDescriptor ?: return@lz null
|
||||||
typeMapper.mapClass(descriptor).internalName
|
generationState.typeMapper.mapClass(descriptor).internalName
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getSuperClass(context: UastContext): UClass? {
|
override fun getSuperClass(context: UastContext): UClass? {
|
||||||
|
|||||||
@@ -16,16 +16,11 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.uast
|
package org.jetbrains.kotlin.uast
|
||||||
|
|
||||||
import org.jetbrains.kotlin.codegen.ClassBuilderMode
|
|
||||||
import org.jetbrains.kotlin.codegen.state.IncompatibleClassTracker
|
|
||||||
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
|
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
import org.jetbrains.kotlin.fileClasses.NoResolveFileClassesProvider
|
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
|
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.load.java.JvmAbi
|
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||||
@@ -53,11 +48,10 @@ abstract class KotlinAbstractUFunction : KotlinAbstractUElement(), UFunction, Ps
|
|||||||
}
|
}
|
||||||
|
|
||||||
override val bytecodeDescriptor by lz {
|
override val bytecodeDescriptor by lz {
|
||||||
val bindingContext = psi.analyze(BodyResolveMode.PARTIAL)
|
val generationState = psi.getGenerationState()
|
||||||
val descriptor = bindingContext[BindingContext.DECLARATION_TO_DESCRIPTOR, psi] as? FunctionDescriptor ?: return@lz null
|
val descriptor = generationState.bindingContext[BindingContext.DECLARATION_TO_DESCRIPTOR, psi]
|
||||||
val typeMapper = KotlinTypeMapper(BindingContext.EMPTY, ClassBuilderMode.LIGHT_CLASSES, NoResolveFileClassesProvider, null,
|
as? FunctionDescriptor ?: return@lz null
|
||||||
IncompatibleClassTracker.DoNothing, JvmAbi.DEFAULT_MODULE_NAME)
|
generationState.typeMapper.mapAsmMethod(descriptor).descriptor
|
||||||
typeMapper.mapAsmMethod(descriptor).descriptor
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun hasModifier(modifier: UastModifier) = psi.hasModifier(modifier)
|
override fun hasModifier(modifier: UastModifier) = psi.hasModifier(modifier)
|
||||||
|
|||||||
+14
-1
@@ -110,4 +110,17 @@ internal fun DeclarationDescriptor.toSource() = try {
|
|||||||
null
|
null
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun <T> lz(initializer: () -> T) = lazy(LazyThreadSafetyMode.NONE, initializer)
|
internal fun <T> lz(initializer: () -> T) = lazy(LazyThreadSafetyMode.NONE, initializer)
|
||||||
|
|
||||||
|
internal fun KtElement.getGenerationState(): GenerationState {
|
||||||
|
val analysisResult = this.analyzeAndGetResult()
|
||||||
|
val file = getContainingKtFile()
|
||||||
|
val state = GenerationState(
|
||||||
|
file.project,
|
||||||
|
ClassBuilderFactories.THROW_EXCEPTION,
|
||||||
|
analysisResult.moduleDescriptor,
|
||||||
|
analysisResult.bindingContext,
|
||||||
|
listOf(file))
|
||||||
|
state.beforeCompile()
|
||||||
|
return state
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user