From b076e7e8817658fa27a982accf2896eb8b9975e2 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Wed, 28 Nov 2018 12:35:33 +0300 Subject: [PATCH] New J2K: Fix for conversion due to changing modifier types --- .../org/jetbrains/kotlin/j2k/ConversionContext.kt | 11 ++++++++++- .../org/jetbrains/kotlin/j2k/ConversionsRunner.kt | 12 ++++++------ .../org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt | 2 +- .../kotlin/j2k/conversions/ForConversion.kt | 11 +++++++---- j2k/newSrc/org/jetbrains/kotlin/j2k/expressions.kt | 5 +++-- j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt | 1 + j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt | 5 ++++- 7 files changed, 32 insertions(+), 15 deletions(-) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionContext.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionContext.kt index 37fbe646855..e587622ca49 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionContext.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionContext.kt @@ -14,6 +14,15 @@ data class ConversionContext( val converter: NewJavaToKotlinConverter, val inConversionContext: (PsiElement) -> Boolean ) { - 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) + }) } \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt index 2908f7ee6a4..93b608887e3 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt @@ -27,21 +27,20 @@ object ConversionsRunner { +JavaModifiersConversion() +InternalClassConversion(context) +ModalityConversion(context) + +AssignmentAsExpressionToAlsoConversion(context) + +AssignmentStatementValCreationConversion(context) + +AssignmentStatementOperatorConversion() + +AssignmentStatementSimplifyValConversion() + +AssignmentStatementSimplifyAlsoConversion() +OperatorExpressionConversion(context) +ThrowStatementConversion() +ArrayInitializerConversion(context) +TryStatementConversion(context) +ImplicitInitializerConversion() +DefaultArgumentsConversion(context) - +TypeMappingConversion(context) +FieldToPropertyConversion(context) +PrintlnConversion(context) +BlockToRunConversion(context) - +AssignmentAsExpressionToAlsoConversion(context) - +AssignmentStatementValCreationConversion(context) - +AssignmentStatementOperatorConversion() - +AssignmentStatementSimplifyValConversion() - +AssignmentStatementSimplifyAlsoConversion() +ConstructorConversion(context) +PrimaryConstructorDetectConversion(context) +InsertDefaultPrimaryConstructorConversion(context) @@ -55,6 +54,7 @@ object ConversionsRunner { +InstanceOfConversion() +ForConversion(context) +ForInConversion() + +TypeMappingConversion(context) //Kotlin --> Kotlin conversions +InnerClassConversion() diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt index 4ff79b46d30..d1641a18242 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt @@ -431,7 +431,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) { with(expressionTreeMapper) { typeElement.toJK() }, JKNameIdentifierImpl(this.name ?: TODO()), with(expressionTreeMapper) { initializer.toJK() }, - Mutability.UNKNOWN + if (hasModifierProperty(PsiModifier.FINAL)) Mutability.IMMUTABLE else Mutability.UNKNOWN ).also { i -> symbolProvider.provideUniverseSymbol(this, i) i.psi = this diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ForConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ForConversion.kt index 32f78cd8bbf..24fad3519dc 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ForConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ForConversion.kt @@ -37,10 +37,13 @@ class ForConversion(private val context: ConversionContext) : RecursiveApplicabl if (loopStatement.initializer is JKEmptyStatement) return whileStatement //TODO check for error conflict - return JKKtConvertedFromForLoopSyntheticWhileStatementImpl( - loopStatement::initializer.detached(), - JKWhileStatementImpl(condition, whileBody) - ) + val convertedFromForLoopSyntheticWhileStatement = + JKKtConvertedFromForLoopSyntheticWhileStatementImpl( + loopStatement::initializer.detached(), + whileStatement + ) + return if (loopStatement.parent!! is JKBlock) convertedFromForLoopSyntheticWhileStatement + else blockStatement(convertedFromForLoopSyntheticWhileStatement) } private fun createWhileBody(loopStatement: JKJavaForLoopStatement): JKStatement { diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/expressions.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/expressions.kt index f0e86a5ed9b..70fbae4fae0 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/expressions.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/expressions.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.j2k import com.intellij.psi.PsiElement 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.resolveFqName 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.psi.KtNamedFunction -fun kotlinTypeByName(name: String, symbolProvider: JKSymbolProvider): JKClassType { +fun kotlinTypeByName(name: String, symbolProvider: JKSymbolProvider, nullability: Nullability = Nullability.Nullable): JKClassType { val symbol = symbolProvider.provideDirectSymbol( resolveFqName(ClassId.fromString(name), symbolProvider.symbolsByPsi.keys.first())!! ) as JKClassSymbol - return JKClassTypeImpl(symbol, emptyList()) + return JKClassTypeImpl(symbol, emptyList(), nullability) } private fun JKType.classSymbol(symbolProvider: JKSymbolProvider) = diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt index 455b2b43f10..286e4e4396d 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt @@ -93,6 +93,7 @@ class JKParameterImpl( } class JKBlockImpl(statements: List = emptyList()) : JKBlock, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() { + constructor(vararg statements: JKStatement) : this(statements.toList()) override fun accept(visitor: JKVisitor, data: D): R = visitor.visitBlock(this, data) override var statements by children(statements) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt index cc539cfe766..4c50c14d130 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt @@ -153,4 +153,7 @@ fun JKType.updateNullability(newNullability: Nullability): JKType = is JKJavaVoidType -> this is JKJavaPrimitiveType -> this else -> TODO(this::class.toString()) - } \ No newline at end of file + } + +fun JKJavaMethod.returnTypeNullability(context: ConversionContext): Nullability = + context.typeFlavorCalculator.methodNullability(psi()!!) \ No newline at end of file