diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/JKSymbolProvider.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/JKSymbolProvider.kt index cf07c6f8dc0..0983435bb24 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/JKSymbolProvider.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/JKSymbolProvider.kt @@ -10,6 +10,7 @@ import com.intellij.openapi.project.Project import com.intellij.psi.* import org.jetbrains.kotlin.asJava.elements.KtLightDeclaration import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.FqNameUnsafe import org.jetbrains.kotlin.nj2k.conversions.JKResolver import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.impl.* @@ -112,6 +113,9 @@ class JKSymbolProvider(project: Project, module: Module, contextElement: PsiElem fun provideClassSymbol(fqName: String): JKClassSymbol = provideClassSymbol(FqName(fqName.asSafeFqNameString())) + fun provideClassSymbol(fqName: FqNameUnsafe): JKClassSymbol = + provideClassSymbol(fqName.toSafe()) + fun provideMethodSymbol(fqName: FqName): JKMethodSymbol = symbolsByFqName.getOrPutIfNotNull(fqName.asString()) { resolver.resolveMethod(fqName)?.let { diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/BuiltinMembersConversion.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/BuiltinMembersConversion.kt index 36d927add70..14b40be34dc 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/BuiltinMembersConversion.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/BuiltinMembersConversion.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.nj2k.conversions +import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.nj2k.* import org.jetbrains.kotlin.nj2k.tree.* @@ -62,6 +63,13 @@ class BuiltinMembersConversion(private val context: NewJ2kConverterContext) : Re if (conversion.filter?.invoke(this) == false) return@firstOrNull false true } + + is JKJavaNewExpression -> + conversions[classSymbol.deepestFqName()]?.firstOrNull { conversion -> + if (conversion.from !is NewExpression) return@firstOrNull false + if (conversion.filter?.invoke(this) == false) return@firstOrNull false + true + } else -> null } @@ -88,6 +96,12 @@ class BuiltinMembersConversion(private val context: NewJ2kConverterContext) : Re JKArgumentListImpl(), JKTypeArgumentListImpl() ).withNonCodeElementsFrom(from) + is JKJavaNewExpression -> + JKKtCallExpressionImpl( + context.symbolProvider.provideMethodSymbol(fqName), + argumentsProvider(from::arguments.detached()), + JKTypeArgumentListImpl() + ).withNonCodeElementsFrom(from) else -> error("Bad conversion") } } @@ -157,6 +171,7 @@ class BuiltinMembersConversion(private val context: NewJ2kConverterContext) : Re } private data class Method(override val fqName: String) : SymbolInfo + private data class NewExpression(override val fqName: String) : SymbolInfo private data class Field(override val fqName: String) : SymbolInfo private data class ExtensionMethod(override val fqName: String) : SymbolInfo private data class CustomExpression(val expressionBuilder: (JKExpression) -> JKExpression) : Info @@ -413,7 +428,17 @@ class BuiltinMembersConversion(private val context: NewJ2kConverterContext) : Re ) ) }, + Method("java.lang.String.format") convertTo CustomExpression { expression -> + JKClassAccessExpressionImpl( + context.symbolProvider.provideClassSymbol(KotlinBuiltIns.FQ_NAMES.string) + ).callOn( + context.symbolProvider.provideMethodSymbol("kotlin.text.String.format"), + (expression as JKMethodCallExpression).arguments::arguments.detached() + ) + } withReplaceType ReplaceType.REPLACE_WITH_QUALIFIER, + NewExpression("java.lang.String") convertTo Method("kotlin.text.String"), + NewExpression("kotlin.String") convertTo Method("kotlin.text.String"), Method("java.util.Collections.singletonList") convertTo Method("kotlin.collections.listOf") withReplaceType ReplaceType.REPLACE_WITH_QUALIFIER, diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/TypeMappingConversion.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/TypeMappingConversion.kt index aa39ee99f5a..b7af1d1b804 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/TypeMappingConversion.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/TypeMappingConversion.kt @@ -137,11 +137,7 @@ class TypeMappingConversion(val context: NewJ2kConverterContext) : RecursiveAppl } private fun JKClassSymbol.kotlinStandardType(): String? = - fqName.takeIf { - it !in ignoredJavaFqNames - }?.let { - JavaToKotlinClassMap.mapJavaToKotlin(FqName(it))?.asString() - } ?: fqName + JavaToKotlinClassMap.mapJavaToKotlin(FqName(fqName))?.asString() private fun JKJavaPrimitiveType.mapPrimitiveType(): JKClassType { val fqName = jvmPrimitiveType.primitiveType.typeFqName @@ -160,10 +156,4 @@ class TypeMappingConversion(val context: NewJ2kConverterContext) : RecursiveAppl else -> false } } - - companion object { - val ignoredJavaFqNames = setOf( - "java.lang.String" - ) - } } \ No newline at end of file diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/types.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/types.kt index ef8580ecc07..d00a59b5696 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/types.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/types.kt @@ -253,7 +253,11 @@ fun JKType.isCollectionType(symbolProvider: JKSymbolProvider): Boolean { } fun JKType.isStringType(): Boolean = - (this as? JKClassType)?.classReference?.name == "String" + (this as? JKClassType)?.classReference?.isStringType() == true + +fun JKClassSymbol.isStringType(): Boolean = + fqName == CommonClassNames.JAVA_LANG_STRING + || fqName == KotlinBuiltIns.FQ_NAMES.string.asString() fun JKLiteralExpression.LiteralType.toPrimitiveType(): JKJavaPrimitiveType? = when (this) { diff --git a/nj2k/testData/newJ2k/detectProperties/OverridesOfExternalCode.kt b/nj2k/testData/newJ2k/detectProperties/OverridesOfExternalCode.kt index 76ba4b495c7..70f59af6178 100644 --- a/nj2k/testData/newJ2k/detectProperties/OverridesOfExternalCode.kt +++ b/nj2k/testData/newJ2k/detectProperties/OverridesOfExternalCode.kt @@ -86,8 +86,5 @@ internal class D : JavaClassDerivedFromKotlinClassWithProperties() { return "a" } - override var someVar2: String? - get() = super.someVar2 - set(value) {} - + override fun setSomeVar2(value: String?) {} } \ No newline at end of file