New J2K: Fix reference resolution in type mapper conversion

This commit is contained in:
Simon Ogorodnik
2018-05-23 19:05:37 +03:00
committed by Ilya Kirillov
parent 7cccb99982
commit 1e4737b4b2
2 changed files with 15 additions and 10 deletions
@@ -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<KtDotQualifiedExpression>()
?.selectorExpression
?.let {
it.references.mapNotNull { it.resolve() }.first()
}
}
fun classTypeByFqName(
private fun classTypeByFqName(
contextElement: PsiElement?,
fqName: ClassId,
parameters: List<JKType>,
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)
@@ -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()