Uast: type-mapper checks deeper for local classes (KT-21546, EA-100195)
This commit is contained in:
committed by
xiexed
parent
f9813e3276
commit
da98b7e07b
+3
-7
@@ -36,12 +36,11 @@ import org.jetbrains.kotlin.builtins.isBuiltinFunctionalTypeOrSubtype
|
||||
import org.jetbrains.kotlin.codegen.signature.BothSignatureWriter
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||
import org.jetbrains.kotlin.load.kotlin.TypeMappingMode
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
@@ -113,11 +112,8 @@ internal fun KotlinType.toPsiType(source: UElement, element: KtElement, boxed: B
|
||||
|
||||
private fun KotlinType.containsLocalTypes(): Boolean {
|
||||
val typeDeclarationDescriptor = this.constructor.declarationDescriptor
|
||||
if (typeDeclarationDescriptor is ClassDescriptor) {
|
||||
val containerDescriptor = typeDeclarationDescriptor.containingDeclaration
|
||||
if (containerDescriptor is PropertyDescriptor || containerDescriptor is FunctionDescriptor) {
|
||||
return true
|
||||
}
|
||||
if (typeDeclarationDescriptor is ClassDescriptor && DescriptorUtils.isLocal(typeDeclarationDescriptor)) {
|
||||
return true
|
||||
}
|
||||
|
||||
return arguments.any { !it.isStarProjection && it.type.containsLocalTypes() }
|
||||
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
fun main(args: Array<String>) { // Error
|
||||
|
||||
data class TestUsed(val parameter: CharSequence) {
|
||||
private data class Used(val parameter: Any) {
|
||||
companion object {
|
||||
fun Any.doStuff1() = Used(this)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,6 +11,7 @@ import org.jetbrains.uast.*
|
||||
import org.jetbrains.uast.kotlin.KotlinUastLanguagePlugin
|
||||
import org.jetbrains.uast.test.env.findElementByText
|
||||
import org.jetbrains.uast.test.env.findElementByTextFromPsi
|
||||
import org.jetbrains.uast.visitor.AbstractUastVisitor
|
||||
import org.junit.Assert
|
||||
import org.junit.Test
|
||||
|
||||
@@ -166,4 +167,17 @@ class KotlinUastApiTest : AbstractKotlinUastTest() {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testBrokenMethodTypeResolve() {
|
||||
doTest("BrokenMethod") { _, file ->
|
||||
|
||||
file.accept(object : AbstractUastVisitor() {
|
||||
override fun visitCallExpression(node: UCallExpression): Boolean {
|
||||
node.returnType
|
||||
return false
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user