From 753070b6c764df49ee302e3252498e1ed4da1c8c Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Thu, 1 Nov 2018 12:12:13 +0300 Subject: [PATCH] New J2K: Refactor code --- .../jetbrains/kotlin/j2k/ConversionsRunner.kt | 2 +- .../jetbrains/kotlin/j2k/NewCodeBuilder.kt | 6 +-- .../kotlin/j2k/conversions/ForConversion.kt | 2 +- .../j2k/conversions/InstanceOfConversion.kt | 40 +++++++++++++++++ .../j2k/conversions/InstanceofConversion.kt | 45 ------------------- .../org/jetbrains/kotlin/j2k/tree/impl/j.kt | 12 ++--- .../org/jetbrains/kotlin/j2k/tree/impl/k.kt | 12 +++-- .../jetbrains/kotlin/j2k/tree/impl/symbols.kt | 10 ++--- .../org/jetbrains/kotlin/j2k/tree/types.kt | 6 +-- 9 files changed, 61 insertions(+), 74 deletions(-) create mode 100644 j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/InstanceOfConversion.kt delete mode 100644 j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/InstanceofConversion.kt diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt index e2842bf11b9..f01acaba4ed 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt @@ -49,7 +49,7 @@ object ConversionsRunner { +ClassToObjectPromotionConversion() +PolyadicExpressionConversion() +SwitchStatementConversion(context) - +InstanceofConversion() + +InstanceOfConversion() +ForConversion(context) +LabeledStatementConversion() } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt index 9dd4548db86..f4d69e98194 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt @@ -437,10 +437,8 @@ class NewCodeBuilder { override fun visitJavaNewExpression(javaNewExpression: JKJavaNewExpression) { printer.printWithNoIndent(FqName(javaNewExpression.constructorSymbol.fqName).shortName())//TODO import name somehow? printer.printWithNoIndent("(") - //TODO use new sequence generator in future - for ((index, argument) in javaNewExpression.arguments.expressions.withIndex()) { - if (index > 0) printer.printWithNoIndent(", ") - argument.accept(this) + renderList(javaNewExpression.arguments.expressions, ", ") { + it.accept(this) } printer.printWithNoIndent(")") } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ForConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ForConversion.kt index 1579865e3e2..194dd778a5d 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ForConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ForConversion.kt @@ -97,7 +97,7 @@ class ForConversion(private val context: ConversionContext) : RecursiveApplicabl val start = loopVar.initializer val operationType = (loopStatement.updater as? JKExpressionStatement)?.expression?.isVariableIncrementOrDecrement(loopVar) - val reversed = when ((operationType as? JKJavaOperatorImpl)?.token?.token) { + val reversed = when ((operationType as? JKJavaOperatorImpl)?.token?.psiToken) { JavaTokenType.PLUSPLUS -> false JavaTokenType.MINUSMINUS -> true else -> return null diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/InstanceOfConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/InstanceOfConversion.kt new file mode 100644 index 00000000000..d70b5f74f72 --- /dev/null +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/InstanceOfConversion.kt @@ -0,0 +1,40 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.j2k.conversions + +import com.intellij.psi.PsiClass +import org.jetbrains.kotlin.j2k.tree.JKBinaryExpression +import org.jetbrains.kotlin.j2k.tree.JKClassType +import org.jetbrains.kotlin.j2k.tree.JKJavaInstanceOfExpression +import org.jetbrains.kotlin.j2k.tree.JKTreeElement +import org.jetbrains.kotlin.j2k.tree.impl.* +import org.jetbrains.kotlin.psi.KtClass + + +class InstanceOfConversion : RecursiveApplicableConversionBase() { + override fun applyToElement(element: JKTreeElement): JKTreeElement { + if (element !is JKJavaInstanceOfExpression) return recurse(element) + val checkingType = element.type.type + val type = + if (checkingType is JKClassType && checkingType.parameters.isEmpty()) { + val resolvedClass = checkingType.classReference?.target + val parametersCount = + when (resolvedClass) { + is PsiClass -> resolvedClass.typeParameters.size + is KtClass -> resolvedClass.typeParameters.size + else -> 0 + } + val typeParameters = List(parametersCount) { JKStarProjectionTypeImpl() } + JKClassTypeImpl( + checkingType.classReference as JKClassSymbol, + typeParameters, + checkingType.nullability + ) + + } else checkingType + return recurse(JKKtIsExpressionImpl(element.expression.also { it.detach(it.parent!!) }, JKTypeElementImpl(type))) + } +} \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/InstanceofConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/InstanceofConversion.kt deleted file mode 100644 index ca3cf322b6a..00000000000 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/InstanceofConversion.kt +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license - * that can be found in the license/LICENSE.txt file. - */ - -package org.jetbrains.kotlin.j2k.conversions - -import com.intellij.psi.PsiClass -import org.jetbrains.kotlin.j2k.tree.JKBinaryExpression -import org.jetbrains.kotlin.j2k.tree.JKClassType -import org.jetbrains.kotlin.j2k.tree.JKJavaInstanceOfExpression -import org.jetbrains.kotlin.j2k.tree.JKTreeElement -import org.jetbrains.kotlin.j2k.tree.impl.* -import org.jetbrains.kotlin.psi.KtClass - - -class InstanceofConversion : RecursiveApplicableConversionBase() { - override fun applyToElement(element: JKTreeElement): JKTreeElement { - if (element is JKJavaInstanceOfExpression) { - val checkingType = element.type.type - val type = - when (checkingType) { - is JKClassType -> { - if (checkingType.parameters.isEmpty()) { - val resolvedClass = checkingType.classReference?.target - val parametersCount = - when (resolvedClass) { - is PsiClass -> resolvedClass.typeParameters.size - is KtClass -> resolvedClass.typeParameters.size - else -> 0 - } - val typeParameters = List(parametersCount) { JKStarProjectionTypeImpl() } - JKClassTypeImpl(checkingType.classReference as JKClassSymbol, - typeParameters, - checkingType.nullability) - - } else checkingType - } - else -> checkingType - } - return recurse(JKKtIsExpressionImpl(element.expression.also { it.detach(it.parent!!) }, JKTypeElementImpl(type))) - } - return recurse(element) - } -} \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt index 5cadf7111d0..020298ac91d 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt @@ -64,9 +64,9 @@ class JKJavaModifierImpl(override val type: JKJavaModifier.JavaModifierType) : J override fun accept(visitor: JKVisitor, data: D): R = visitor.visitJavaModifier(this, data) } -class JKJavaOperatorToken(val token: IElementType) : JKOperatorToken { +class JKJavaOperatorToken(val psiToken: IElementType) : JKOperatorToken { override val text: String - get() = when (token) { + get() = when (psiToken) { JavaTokenType.EQ -> "=" JavaTokenType.EQEQ -> "==" JavaTokenType.NE -> "!=" @@ -101,12 +101,12 @@ class JKJavaOperatorToken(val token: IElementType) : JKOperatorToken { JavaTokenType.GTGTGTEQ -> "ushr" JavaTokenType.PLUSPLUS -> "++" JavaTokenType.MINUSMINUS -> "--" - else -> TODO(token.toString()) + else -> TODO(psiToken.toString()) } } fun JKJavaOperatorToken.toKtToken(): JKKtOperatorToken = - when (this.token) { + when (this.psiToken) { JavaTokenType.DIV -> JKKtSingleValueOperatorToken(KtTokens.DIV) JavaTokenType.MINUS -> JKKtSingleValueOperatorToken(KtTokens.MINUS) JavaTokenType.ANDAND -> JKKtSingleValueOperatorToken(KtTokens.ANDAND) @@ -138,7 +138,7 @@ fun JKJavaOperatorToken.toKtToken(): JKKtOperatorToken = JavaTokenType.GTGTGTEQ -> JKKtWordOperatorToken("ushr") JavaTokenType.XOREQ -> JKKtWordOperatorToken("xor") - else -> TODO(this.token.toString()) + else -> TODO(this.psiToken.toString()) } @@ -146,7 +146,7 @@ class JKJavaOperatorImpl private constructor(psiToken: IElementType) : JKOperato override val token: JKJavaOperatorToken = JKJavaOperatorToken(psiToken) override val precedence: Int - get() = when (token.token) { + get() = when (token.psiToken) { JavaTokenType.ASTERISK, JavaTokenType.DIV, JavaTokenType.PERC -> 3 JavaTokenType.PLUS, JavaTokenType.MINUS -> 4 KtTokens.ELVIS -> 7 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 e313c8ad906..f2a8d6f847e 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt @@ -22,9 +22,7 @@ import com.intellij.psi.tree.IElementType import org.jetbrains.kotlin.j2k.tree.* import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor import org.jetbrains.kotlin.lexer.KtSingleValueToken -import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.types.expressions.OperatorConventions -import org.jetbrains.kotlin.utils.addToStdlib.assertedCast import org.jetbrains.kotlin.utils.addToStdlib.cast class JKKtPropertyImpl( @@ -85,12 +83,12 @@ class JKKtLiteralExpressionImpl( override fun accept(visitor: JKVisitor, data: D): R = visitor.visitKtLiteralExpression(this, data) } -class JKKtSingleValueOperatorToken(val token: KtSingleValueToken) : JKKtOperatorToken { +class JKKtSingleValueOperatorToken(val psiToken: KtSingleValueToken) : JKKtOperatorToken { override val operatorName: String - get() = OperatorConventions.getNameForOperationSymbol(token, true, true)?.identifier - ?: OperatorConventions.BOOLEAN_OPERATIONS[token]?.identifier - ?: TODO(token.value) - override val text: String = token.value + get() = OperatorConventions.getNameForOperationSymbol(psiToken, true, true)?.identifier + ?: OperatorConventions.BOOLEAN_OPERATIONS[psiToken]?.identifier + ?: TODO(psiToken.value) + override val text: String = psiToken.value } class JKKtWordOperatorToken(override val text: String) : JKKtOperatorToken { diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/symbols.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/symbols.kt index 79524cde8ab..a6a5d4f9916 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/symbols.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/symbols.kt @@ -48,7 +48,7 @@ interface JKMethodSymbol : JKNamedSymbol { interface JKFieldSymbol : JKNamedSymbol { override val fqName: String - val filedType: JKType + val fieldType: JKType } class JKUniverseClassSymbol : JKClassSymbol, JKUniverseSymbol { @@ -133,7 +133,7 @@ class JKMultiverseFunctionSymbol(override val target: KtNamedFunction, private v } class JKUniverseFieldSymbol : JKFieldSymbol, JKUniverseSymbol { - override val filedType: JKType + override val fieldType: JKType get() = target.type.type override val name: String get() = target.name.value @@ -145,7 +145,7 @@ class JKUniverseFieldSymbol : JKFieldSymbol, JKUniverseSymbol { } class JKMultiverseFieldSymbol(override val target: PsiField, private val symbolProvider: JKSymbolProvider) : JKFieldSymbol { - override val filedType: JKType + override val fieldType: JKType get() = target.type.toJK(symbolProvider) override val name: String get() = target.name @@ -156,7 +156,7 @@ class JKMultiverseFieldSymbol(override val target: PsiField, private val symbolP } class JKMultiversePropertySymbol(override val target: KtProperty, private val symbolProvider: JKSymbolProvider) : JKFieldSymbol { - override val filedType: JKType + override val fieldType: JKType get() = target.typeReference!!.typeElement!!.toJK(symbolProvider) override val name: String get() = target.name!! @@ -167,7 +167,7 @@ class JKMultiversePropertySymbol(override val target: KtProperty, private val sy } class JKUnresolvedField(override val target: PsiReference, private val symbolProvider: JKSymbolProvider) : JKFieldSymbol { - override val filedType: JKType + override val fieldType: JKType get() { val resolvedType = (target as? PsiReferenceExpressionImpl)?.type if (resolvedType != null) return resolvedType.toJK(symbolProvider) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt index 449b8b6017f..5fcd1ca5aad 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.j2k.tree import com.intellij.psi.* -import com.intellij.psi.impl.source.resolve.reference.impl.PsiMultiReference import com.intellij.util.reverse import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.idea.caches.resolve.analyze @@ -16,12 +15,9 @@ import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.conversions.resolveFqName import org.jetbrains.kotlin.j2k.tree.impl.* import org.jetbrains.kotlin.name.ClassId -import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtTypeElement -import org.jetbrains.kotlin.psi.KtTypeReference import org.jetbrains.kotlin.psi.KtUserType import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.calls.callUtil.getType import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf @@ -32,7 +28,7 @@ fun JKExpression.type(context: ConversionContext): JKType = is JKLiteralExpression -> type.toJkType(context.symbolProvider) is JKBinaryExpression -> (operator as JKKtOperatorImpl).methodSymbol.returnType is JKMethodCallExpression -> identifier.returnType - is JKFieldAccessExpressionImpl -> identifier.filedType + is JKFieldAccessExpressionImpl -> identifier.fieldType is JKQualifiedExpressionImpl -> this.selector.type(context) else -> TODO(this::class.java.toString()) }