Fix exception on mapping internal types to UAST types with NI

#EA-119071 Fixed
This commit is contained in:
Mikhail Zarechenskiy
2018-04-28 15:07:27 +03:00
parent f507a26a12
commit d6405c8147
2 changed files with 25 additions and 3 deletions
@@ -34,9 +34,11 @@ import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.asJava.toLightElements
import org.jetbrains.kotlin.builtins.isBuiltinFunctionalTypeOrSubtype
import org.jetbrains.kotlin.codegen.signature.BothSignatureWriter
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor
import org.jetbrains.kotlin.idea.project.languageVersionSettings
import org.jetbrains.kotlin.load.kotlin.TypeMappingMode
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.BindingContext
@@ -46,6 +48,7 @@ import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
import org.jetbrains.kotlin.resolve.constants.IntegerValueTypeConstructor
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeApproximator
import org.jetbrains.kotlin.types.isError
import org.jetbrains.kotlin.types.typeUtil.isInterface
import org.jetbrains.uast.*
@@ -112,7 +115,8 @@ internal fun KotlinType.toPsiType(source: UElement, element: KtElement, boxed: B
val signatureWriter = BothSignatureWriter(BothSignatureWriter.Mode.TYPE)
val typeMappingMode = if (boxed) TypeMappingMode.GENERIC_ARGUMENT else TypeMappingMode.DEFAULT
typeMapper.mapType(this, signatureWriter, typeMappingMode)
val approximatedType = TypeApproximator().approximateDeclarationType(this, true, element.languageVersionSettings)
typeMapper.mapType(approximatedType, signatureWriter, typeMappingMode)
val signature = StringCharacterIterator(signatureWriter.toString())
@@ -26,12 +26,10 @@ import org.jetbrains.kotlin.idea.core.copied
import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase
import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor
import org.jetbrains.kotlin.psi.KtCallExpression
import org.jetbrains.kotlin.psi.KtClass
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtPsiFactory
import org.jetbrains.kotlin.psi.psiUtil.findDescendantOfType
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
import org.jetbrains.kotlin.test.testFramework.runWriteAction
import org.jetbrains.uast.*
import org.jetbrains.uast.test.env.findUElementByTextFromPsi
@@ -82,6 +80,26 @@ class KotlinDetachedUastTest : KotlinLightCodeInsightFixtureTestCase() {
TestCase.assertNull(uCallExpression.methodName)
}
fun testCapturedTypeInExtensionReceiverOfCall() {
val psiFile = myFixture.configureByText(
"foo.kt", """
class Foo<T>
fun <K> K.extensionFunc() {}
fun test(f: Foo<*>) {
f.extensionFunc()
}
""".trimIndent()
) as KtFile
val extensionFunctionCall = psiFile.findDescendantOfType<KtCallExpression>()!!
val uCallExpression = extensionFunctionCall.toUElementOfType<UCallExpression>()!!
TestCase.assertNotNull(uCallExpression.receiverType)
TestCase.assertNotNull(uCallExpression.methodName)
}
fun testParameterInAnnotationClassFromFactory() {
val detachedClass = KtPsiFactory(project).createClass("""