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 package org.jetbrains.kotlin.j2k.conversions
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.PsiReferenceExpression
import org.jetbrains.kotlin.j2k.ConversionContext import org.jetbrains.kotlin.j2k.ConversionContext
import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.j2k.tree.JKClassType 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.name.FqName
import org.jetbrains.kotlin.platform.JavaToKotlinClassMap import org.jetbrains.kotlin.platform.JavaToKotlinClassMap
import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtDotQualifiedExpression
import org.jetbrains.kotlin.psi.KtPsiFactory 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.ImportPath
import org.jetbrains.kotlin.resolve.QualifiedExpressionResolver
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
class TypeMappingConversion(val context: ConversionContext) : MatchBasedConversion() { class TypeMappingConversion(val context: ConversionContext) : MatchBasedConversion() {
@@ -47,20 +48,24 @@ class TypeMappingConversion(val context: ConversionContext) : MatchBasedConversi
} }
} }
fun fqNameRef(classId: ClassId, element: PsiElement): PsiReferenceExpression? { private fun resolveFqName(classId: ClassId, element: PsiElement): PsiElement? {
return KtPsiFactory(element) val importDirective = KtPsiFactory(element).createImportDirective(ImportPath(classId.asSingleFqName(), false))
.createExpressionCodeFragment(classId.asString(), element) importDirective.containingKtFile.analysisContext = element.containingFile
.findChildByClass(PsiReferenceExpression::class.java) return importDirective.getChildOfType<KtDotQualifiedExpression>()
?.selectorExpression
?.let {
it.references.mapNotNull { it.resolve() }.first()
}
} }
fun classTypeByFqName( private fun classTypeByFqName(
contextElement: PsiElement?, contextElement: PsiElement?,
fqName: ClassId, fqName: ClassId,
parameters: List<JKType>, parameters: List<JKType>,
nullability: Nullability = Nullability.Default nullability: Nullability = Nullability.Default
): JKType? { ): JKType? {
contextElement ?: return null 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) 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.openapi.vfs.newvfs.impl.VfsRootAccess
import com.intellij.pom.java.LanguageLevel import com.intellij.pom.java.LanguageLevel
import com.intellij.testFramework.LightPlatformTestCase 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.test.invalidateLibraryCache
import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.idea.util.application.runWriteAction
import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.kotlin.test.KotlinTestUtils
import org.jetbrains.kotlin.idea.caches.PerModulePackageCacheService.Companion.DEBUG_LOG_ENABLE_PerModulePackageCache import org.jetbrains.kotlin.idea.caches.PerModulePackageCacheService.Companion.DEBUG_LOG_ENABLE_PerModulePackageCache
import java.io.File import java.io.File
abstract class AbstractJavaToKotlinConverterTest : LightCodeInsightFixtureTestCase() { abstract class AbstractJavaToKotlinConverterTest : KotlinLightCodeInsightFixtureTestCase() {
override fun setUp() { override fun setUp() {
super.setUp() super.setUp()