New J2K: Fix for conversion due to changing modifier types

This commit is contained in:
Ilya Kirillov
2018-11-28 12:35:33 +03:00
committed by Ilya Kirillov
parent 70225ac3d0
commit b076e7e881
7 changed files with 32 additions and 15 deletions
@@ -14,6 +14,15 @@ data class ConversionContext(
val converter: NewJavaToKotlinConverter, val converter: NewJavaToKotlinConverter,
val inConversionContext: (PsiElement) -> Boolean val inConversionContext: (PsiElement) -> Boolean
) { ) {
val project: Project get() = converter.project val project: Project get() = converter.project
val typeFlavorCalculator = TypeFlavorCalculator(object : TypeFlavorConverterFacade {
override val referenceSearcher: ReferenceSearcher
get() = converter.converterServices.oldServices.referenceSearcher
override val javaDataFlowAnalyzerFacade: JavaDataFlowAnalyzerFacade
get() = converter.converterServices.oldServices.javaDataFlowAnalyzerFacade
override val resolverForConverter: ResolverForConverter
get() = converter.converterServices.oldServices.resolverForConverter
override fun inConversionScope(element: PsiElement): Boolean = inConversionContext(element)
})
} }
@@ -27,21 +27,20 @@ object ConversionsRunner {
+JavaModifiersConversion() +JavaModifiersConversion()
+InternalClassConversion(context) +InternalClassConversion(context)
+ModalityConversion(context) +ModalityConversion(context)
+AssignmentAsExpressionToAlsoConversion(context)
+AssignmentStatementValCreationConversion(context)
+AssignmentStatementOperatorConversion()
+AssignmentStatementSimplifyValConversion()
+AssignmentStatementSimplifyAlsoConversion()
+OperatorExpressionConversion(context) +OperatorExpressionConversion(context)
+ThrowStatementConversion() +ThrowStatementConversion()
+ArrayInitializerConversion(context) +ArrayInitializerConversion(context)
+TryStatementConversion(context) +TryStatementConversion(context)
+ImplicitInitializerConversion() +ImplicitInitializerConversion()
+DefaultArgumentsConversion(context) +DefaultArgumentsConversion(context)
+TypeMappingConversion(context)
+FieldToPropertyConversion(context) +FieldToPropertyConversion(context)
+PrintlnConversion(context) +PrintlnConversion(context)
+BlockToRunConversion(context) +BlockToRunConversion(context)
+AssignmentAsExpressionToAlsoConversion(context)
+AssignmentStatementValCreationConversion(context)
+AssignmentStatementOperatorConversion()
+AssignmentStatementSimplifyValConversion()
+AssignmentStatementSimplifyAlsoConversion()
+ConstructorConversion(context) +ConstructorConversion(context)
+PrimaryConstructorDetectConversion(context) +PrimaryConstructorDetectConversion(context)
+InsertDefaultPrimaryConstructorConversion(context) +InsertDefaultPrimaryConstructorConversion(context)
@@ -55,6 +54,7 @@ object ConversionsRunner {
+InstanceOfConversion() +InstanceOfConversion()
+ForConversion(context) +ForConversion(context)
+ForInConversion() +ForInConversion()
+TypeMappingConversion(context)
//Kotlin --> Kotlin conversions //Kotlin --> Kotlin conversions
+InnerClassConversion() +InnerClassConversion()
@@ -431,7 +431,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
with(expressionTreeMapper) { typeElement.toJK() }, with(expressionTreeMapper) { typeElement.toJK() },
JKNameIdentifierImpl(this.name ?: TODO()), JKNameIdentifierImpl(this.name ?: TODO()),
with(expressionTreeMapper) { initializer.toJK() }, with(expressionTreeMapper) { initializer.toJK() },
Mutability.UNKNOWN if (hasModifierProperty(PsiModifier.FINAL)) Mutability.IMMUTABLE else Mutability.UNKNOWN
).also { i -> ).also { i ->
symbolProvider.provideUniverseSymbol(this, i) symbolProvider.provideUniverseSymbol(this, i)
i.psi = this i.psi = this
@@ -37,10 +37,13 @@ class ForConversion(private val context: ConversionContext) : RecursiveApplicabl
if (loopStatement.initializer is JKEmptyStatement) return whileStatement if (loopStatement.initializer is JKEmptyStatement) return whileStatement
//TODO check for error conflict //TODO check for error conflict
return JKKtConvertedFromForLoopSyntheticWhileStatementImpl( val convertedFromForLoopSyntheticWhileStatement =
loopStatement::initializer.detached(), JKKtConvertedFromForLoopSyntheticWhileStatementImpl(
JKWhileStatementImpl(condition, whileBody) loopStatement::initializer.detached(),
) whileStatement
)
return if (loopStatement.parent!! is JKBlock) convertedFromForLoopSyntheticWhileStatement
else blockStatement(convertedFromForLoopSyntheticWhileStatement)
} }
private fun createWhileBody(loopStatement: JKJavaForLoopStatement): JKStatement { private fun createWhileBody(loopStatement: JKJavaForLoopStatement): JKStatement {
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.j2k
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.j2k.conversions.multiResolveFqName import org.jetbrains.kotlin.j2k.conversions.multiResolveFqName
import org.jetbrains.kotlin.j2k.conversions.resolveFqName import org.jetbrains.kotlin.j2k.conversions.resolveFqName
import org.jetbrains.kotlin.j2k.tree.* import org.jetbrains.kotlin.j2k.tree.*
@@ -14,12 +15,12 @@ import org.jetbrains.kotlin.j2k.tree.impl.*
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtNamedFunction
fun kotlinTypeByName(name: String, symbolProvider: JKSymbolProvider): JKClassType { fun kotlinTypeByName(name: String, symbolProvider: JKSymbolProvider, nullability: Nullability = Nullability.Nullable): JKClassType {
val symbol = val symbol =
symbolProvider.provideDirectSymbol( symbolProvider.provideDirectSymbol(
resolveFqName(ClassId.fromString(name), symbolProvider.symbolsByPsi.keys.first())!! resolveFqName(ClassId.fromString(name), symbolProvider.symbolsByPsi.keys.first())!!
) as JKClassSymbol ) as JKClassSymbol
return JKClassTypeImpl(symbol, emptyList()) return JKClassTypeImpl(symbol, emptyList(), nullability)
} }
private fun JKType.classSymbol(symbolProvider: JKSymbolProvider) = private fun JKType.classSymbol(symbolProvider: JKSymbolProvider) =
@@ -93,6 +93,7 @@ class JKParameterImpl(
} }
class JKBlockImpl(statements: List<JKStatement> = emptyList()) : JKBlock, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() { class JKBlockImpl(statements: List<JKStatement> = emptyList()) : JKBlock, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() {
constructor(vararg statements: JKStatement) : this(statements.toList())
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitBlock(this, data) override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitBlock(this, data)
override var statements by children(statements) override var statements by children(statements)
@@ -153,4 +153,7 @@ fun JKType.updateNullability(newNullability: Nullability): JKType =
is JKJavaVoidType -> this is JKJavaVoidType -> this
is JKJavaPrimitiveType -> this is JKJavaPrimitiveType -> this
else -> TODO(this::class.toString()) else -> TODO(this::class.toString())
} }
fun JKJavaMethod.returnTypeNullability(context: ConversionContext): Nullability =
context.typeFlavorCalculator.methodNullability(psi()!!)