From e10a81a94277c64bcd6be1fb629d536bcbd2213e Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Thu, 1 Nov 2018 16:35:52 +0300 Subject: [PATCH] New J2K: Use JKDeclaration instead of ValIdentifier in ForLoop --- .../org/jetbrains/kotlin/j2k/NewCodeBuilder.kt | 18 ++++++++++-------- .../kotlin/j2k/conversions/ForConversion.kt | 10 +++++++++- .../org/jetbrains/kotlin/j2k/tree/impl/jk.kt | 4 ++++ .../org/jetbrains/kotlin/j2k/tree/impl/k.kt | 7 +++---- j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt | 2 +- .../org/jetbrains/kotlin/j2k/tree/markers.kt | 4 ++++ 6 files changed, 31 insertions(+), 14 deletions(-) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt index f4d69e98194..b36cc546461 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt @@ -47,7 +47,7 @@ class NewCodeBuilder { override fun visitKtForInStatement(ktForInStatement: JKKtForInStatement) { printer.printWithNoIndent("for (") - printer.printWithNoIndent(ktForInStatement.variableIdentifier.value) + ktForInStatement.declaration.accept(this) printer.printWithNoIndent(" in ") ktForInStatement.iterationExpression.accept(this) printer.printWithNoIndent(") ") @@ -190,7 +190,6 @@ class NewCodeBuilder { printer.printWithNoIndent(" = ") ktProperty.initializer.accept(this) } - printer.printlnWithNoIndent() } override fun visitKtInitDeclaration(ktInitDeclaration: JKKtInitDeclaration) { @@ -369,6 +368,7 @@ class NewCodeBuilder { override fun visitDeclarationStatement(declarationStatement: JKDeclarationStatement) { declarationStatement.declaredStatements.forEach { it.accept(this) + printer.printlnWithNoIndent() } } @@ -386,14 +386,16 @@ class NewCodeBuilder { } override fun visitLocalVariable(localVariable: JKLocalVariable) { - if (localVariable.modifierList.modality == JKModalityModifier.Modality.FINAL) { - printer.print("val") - } else { - printer.print("var") + if (localVariable.parent !is JKKtForInStatement) { + if (localVariable.modifierList.modality == JKModalityModifier.Modality.FINAL) { + printer.print("val") + } else { + printer.print("var") + } } printer.printWithNoIndent(" ", localVariable.name.value) - if (localVariable.type.type != JKContextType) { + if (localVariable.type.type != JKContextType && localVariable.type.type !is JKNoTypeImpl) { printer.printWithNoIndent(": ") localVariable.type.accept(this) } @@ -401,7 +403,6 @@ class NewCodeBuilder { printer.printWithNoIndent(" = ") localVariable.initializer.accept(this) } - printer.printlnWithNoIndent() } override fun visitKtConvertedFromForLoopSyntheticWhileStatement( @@ -413,6 +414,7 @@ class NewCodeBuilder { } private fun renderType(type: JKType) { + if (type is JKNoTypeImpl) return when (type) { is JKClassType -> type.classReference.fqName?.let { printer.printWithNoIndent(FqName(it).shortName().asString()) } is JKUnresolvedClassType -> printer.printWithNoIndent(type.name) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ForConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ForConversion.kt index ad0e684c0b2..86048e9c20e 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ForConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ForConversion.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.j2k.conversions import com.intellij.psi.* import org.jetbrains.kotlin.j2k.* +import org.jetbrains.kotlin.j2k.ast.Mutability import org.jetbrains.kotlin.j2k.tree.* import org.jetbrains.kotlin.j2k.tree.impl.* import org.jetbrains.kotlin.lexer.KtTokens @@ -118,8 +119,15 @@ class ForConversion(private val context: ConversionContext) : RecursiveApplicabl // val explicitType = if (context.converter.settings.specifyLocalVariableTypeByDefault) // JKJavaPrimitiveTypeImpl.INT // else null + val loopVarDeclaration = + JKLocalVariableImpl( + JKModifierListImpl(JKModalityModifierImpl(JKModalityModifier.Modality.FINAL)), + JKTypeElementImpl(JKNoTypeImpl), + loopVar::name.detached(), + JKStubExpressionImpl() + ) return JKKtForInStatementImpl( - loopVar::name.detached(), + loopVarDeclaration, range, loopStatement::body.detached() ) 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 29655960521..e43ee25a281 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt @@ -196,6 +196,10 @@ class JKClassTypeImpl( override val nullability: Nullability = Nullability.Default ) : JKClassType +object JKNoTypeImpl: JKNoType { + override val nullability: Nullability = Nullability.NotNull +} + class JKStarProjectionTypeImpl : JKStarProjectionType class JKUnresolvedClassType( diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt index f2a8d6f847e..e8b02238dc8 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt @@ -234,10 +234,9 @@ fun JKClass.getOrCreateInitDeclaration(): JKKtInitDeclaration { return newDeclaration } -class JKKtForInStatementImpl(variableIdentifier: JKNameIdentifier, iterationExpression: JKExpression, body: JKStatement) : - JKKtForInStatement, - JKBranchElementBase() { - override var variableIdentifier: JKNameIdentifier by child(variableIdentifier) +class JKKtForInStatementImpl(declaration: JKDeclaration, iterationExpression: JKExpression, body: JKStatement) : + JKKtForInStatement, JKBranchElementBase() { + override var declaration: JKDeclaration by child(declaration) override var iterationExpression: JKExpression by child(iterationExpression) override var body: JKStatement by child(body) override fun accept(visitor: JKVisitor, data: D): R = visitor.visitKtForInStatement(this, data) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt index 7bc74f0ee73..8d708b0f46c 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt @@ -79,7 +79,7 @@ interface JKKtInitDeclaration : JKDeclaration { } interface JKKtForInStatement : JKStatement { - var variableIdentifier: JKNameIdentifier + var declaration: JKDeclaration var iterationExpression: JKExpression var body: JKStatement } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt index ab657716839..aef3d4206c0 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt @@ -60,6 +60,8 @@ interface JKType { val nullability: Nullability } +interface JKNoType : JKType + interface JKParametrizedType : JKType { val parameters: List } @@ -108,3 +110,5 @@ fun KProperty0.detached(): T = fun KProperty0>.detached(): List = get().also { list -> list.forEach { detach(it) } } +fun T.detached(from: JKElement): T = + also { it.detach(from) } \ No newline at end of file