From da98b7e07b11e2d1e60080736e8a9a7258a9afb0 Mon Sep 17 00:00:00 2001 From: Nicolay Mitropolsky Date: Wed, 6 Dec 2017 14:38:46 +0300 Subject: [PATCH] Uast: type-mapper checks deeper for local classes (KT-21546, EA-100195) --- .../kotlin/internal/kotlinInternalUastUtils.kt | 10 +++------- plugins/uast-kotlin/testData/BrokenMethod.kt | 10 ++++++++++ plugins/uast-kotlin/tests/KotlinUastApiTest.kt | 14 ++++++++++++++ 3 files changed, 27 insertions(+), 7 deletions(-) create mode 100644 plugins/uast-kotlin/testData/BrokenMethod.kt diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/internal/kotlinInternalUastUtils.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/internal/kotlinInternalUastUtils.kt index 60b9c66f7ce..3585c85fea4 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/internal/kotlinInternalUastUtils.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/internal/kotlinInternalUastUtils.kt @@ -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() } diff --git a/plugins/uast-kotlin/testData/BrokenMethod.kt b/plugins/uast-kotlin/testData/BrokenMethod.kt new file mode 100644 index 00000000000..df962fed1bb --- /dev/null +++ b/plugins/uast-kotlin/testData/BrokenMethod.kt @@ -0,0 +1,10 @@ +fun main(args: Array) { // Error + + data class TestUsed(val parameter: CharSequence) { + private data class Used(val parameter: Any) { + companion object { + fun Any.doStuff1() = Used(this) + } + } + } +} \ No newline at end of file diff --git a/plugins/uast-kotlin/tests/KotlinUastApiTest.kt b/plugins/uast-kotlin/tests/KotlinUastApiTest.kt index a150fca297d..91687e2afd2 100644 --- a/plugins/uast-kotlin/tests/KotlinUastApiTest.kt +++ b/plugins/uast-kotlin/tests/KotlinUastApiTest.kt @@ -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 + } + }) + } + } }