From 1e4737b4b25245a9b3e493bb17940e7fe036dcf2 Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Wed, 23 May 2018 19:05:37 +0300 Subject: [PATCH] New J2K: Fix reference resolution in type mapper conversion --- .../j2k/conversions/TypeMappingConversion.kt | 21 ++++++++++++------- .../j2k/AbstractJavaToKotlinConverterTest.kt | 4 ++-- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/TypeMappingConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/TypeMappingConversion.kt index 9ae6371b320..b51f78f42dc 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/TypeMappingConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/TypeMappingConversion.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.j2k.conversions import com.intellij.psi.PsiElement -import com.intellij.psi.PsiReferenceExpression import org.jetbrains.kotlin.j2k.ConversionContext import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.tree.JKClassType @@ -20,9 +19,11 @@ import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.platform.JavaToKotlinClassMap import org.jetbrains.kotlin.psi.KtClassOrObject +import org.jetbrains.kotlin.psi.KtDotQualifiedExpression import org.jetbrains.kotlin.psi.KtPsiFactory +import org.jetbrains.kotlin.psi.analysisContext +import org.jetbrains.kotlin.psi.psiUtil.getChildOfType import org.jetbrains.kotlin.resolve.ImportPath -import org.jetbrains.kotlin.resolve.QualifiedExpressionResolver import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType class TypeMappingConversion(val context: ConversionContext) : MatchBasedConversion() { @@ -47,20 +48,24 @@ class TypeMappingConversion(val context: ConversionContext) : MatchBasedConversi } } - fun fqNameRef(classId: ClassId, element: PsiElement): PsiReferenceExpression? { - return KtPsiFactory(element) - .createExpressionCodeFragment(classId.asString(), element) - .findChildByClass(PsiReferenceExpression::class.java) + private fun resolveFqName(classId: ClassId, element: PsiElement): PsiElement? { + val importDirective = KtPsiFactory(element).createImportDirective(ImportPath(classId.asSingleFqName(), false)) + importDirective.containingKtFile.analysisContext = element.containingFile + return importDirective.getChildOfType() + ?.selectorExpression + ?.let { + it.references.mapNotNull { it.resolve() }.first() + } } - fun classTypeByFqName( + private fun classTypeByFqName( contextElement: PsiElement?, fqName: ClassId, parameters: List, nullability: Nullability = Nullability.Default ): JKType? { contextElement ?: return null - val newTarget = fqNameRef(fqName, contextElement)?.resolve() as? KtClassOrObject ?: return null + val newTarget = resolveFqName(fqName, contextElement) as? KtClassOrObject ?: return null val newSymbol = JKMultiverseKtClassSymbol(newTarget) diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/AbstractJavaToKotlinConverterTest.kt b/j2k/tests/org/jetbrains/kotlin/j2k/AbstractJavaToKotlinConverterTest.kt index cc895982b88..b5aac4ee688 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/AbstractJavaToKotlinConverterTest.kt +++ b/j2k/tests/org/jetbrains/kotlin/j2k/AbstractJavaToKotlinConverterTest.kt @@ -22,14 +22,14 @@ import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess import com.intellij.pom.java.LanguageLevel import com.intellij.testFramework.LightPlatformTestCase -import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase +import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase import org.jetbrains.kotlin.idea.test.invalidateLibraryCache import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.kotlin.idea.caches.PerModulePackageCacheService.Companion.DEBUG_LOG_ENABLE_PerModulePackageCache import java.io.File -abstract class AbstractJavaToKotlinConverterTest : LightCodeInsightFixtureTestCase() { +abstract class AbstractJavaToKotlinConverterTest : KotlinLightCodeInsightFixtureTestCase() { override fun setUp() { super.setUp()