Uast: type-mapper checks deeper for local classes (KT-21546, EA-100195)

This commit is contained in:
Nicolay Mitropolsky
2017-12-06 14:38:46 +03:00
committed by xiexed
parent f9813e3276
commit da98b7e07b
3 changed files with 27 additions and 7 deletions
@@ -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
View File
@@ -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
}
})
}
}
}