From 70c291f22262642403393ce784c3bc884a825988 Mon Sep 17 00:00:00 2001 From: Kirill Knize Date: Mon, 19 Feb 2018 15:58:06 +0300 Subject: [PATCH] New J2K: Add kotlin declarations to IR (#9) --- .../jetbrains/kotlin/j2k/ConversionsRunner.kt | 2 ++ .../kotlin/j2k/JavaToJKTreeBuilder.kt | 1 + .../JavaFieldToKotlinPropertyConversion.kt | 15 +++++++-- .../org/jetbrains/kotlin/j2k/tree/impl/jk.kt | 4 ++- .../org/jetbrains/kotlin/j2k/tree/impl/k.kt | 8 +++++ j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt | 6 +++- .../org/jetbrains/kotlin/j2k/tree/jk.kt | 33 ++++++++++++------- j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt | 26 ++++++++++++--- 8 files changed, 73 insertions(+), 22 deletions(-) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt index 7c85b27f77d..2dcf4cf483d 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.j2k import org.jetbrains.kotlin.j2k.conversions.JavaFieldToKotlinPropertyConversion +import org.jetbrains.kotlin.j2k.conversions.JavaMethodToKotlinFunctionConversion import org.jetbrains.kotlin.j2k.tree.JKElement object ConversionsRunner { @@ -25,6 +26,7 @@ object ConversionsRunner { trees.forEach { JavaFieldToKotlinPropertyConversion().runConversion(it) + JavaMethodToKotlinFunctionConversion().runConversion(it) } } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt index 0a62c1bbc0a..7971e224739 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt @@ -161,6 +161,7 @@ class JavaToJKTreeBuilder { } fun PsiIdentifier.convertMethodReference(): JKJavaMethodReference { + return JKJavaMethodReferenceImpl() } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaFieldToKotlinPropertyConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaFieldToKotlinPropertyConversion.kt index f98b1c08008..30f471699de 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaFieldToKotlinPropertyConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaFieldToKotlinPropertyConversion.kt @@ -16,9 +16,9 @@ package org.jetbrains.kotlin.j2k.conversions -import org.jetbrains.kotlin.j2k.tree.JKDeclaration -import org.jetbrains.kotlin.j2k.tree.JKElement -import org.jetbrains.kotlin.j2k.tree.JKJavaField +import org.jetbrains.kotlin.j2k.tree.* +import org.jetbrains.kotlin.j2k.tree.impl.JKJavaTypeIdentifierImpl +import org.jetbrains.kotlin.j2k.tree.impl.JKKtFunctionImpl import org.jetbrains.kotlin.j2k.tree.impl.JKKtPropertyImpl class JavaFieldToKotlinPropertyConversion : TransformerBasedConversion() { @@ -30,4 +30,13 @@ class JavaFieldToKotlinPropertyConversion : TransformerBasedConversion() { return JKKtPropertyImpl(javaField.modifierList, javaField.type, javaField.name, javaField.initializer) } +} + +class JavaMethodToKotlinFunctionConversion : TransformerBasedConversion() { + override fun visitElement(element: JKElement): JKElement = element.also { it.transformChildren(this, null) } + + override fun visitJavaMethod(javaMethod: JKJavaMethod): JKDeclaration { + somethingChanged = true + return JKKtFunctionImpl(JKJavaTypeIdentifierImpl("Stab"), javaMethod.name, javaMethod.valueArguments, javaMethod.block, javaMethod.modifierList) + } } \ No newline at end of file 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 83a634da3b1..8800aa6451f 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt @@ -198,7 +198,9 @@ class JKTypeCastExpressionImpl(override var expression: JKExpression?, override } } -class JKTypeReferenceImpl() : JKTypeReference, JKElementBase() { +class JKTypeReferenceImpl(override val parameters: List) : JKTypeReference, JKElementBase() { + + override fun accept(visitor: JKVisitor, data: D): R = visitor.visitTypeReference(this, data) override fun acceptChildren(visitor: JKVisitor, data: D) { 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 4e98ba73fcf..7744de58cab 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt @@ -45,3 +45,11 @@ class JKKtPropertyImpl(override var modifierList: JKModifierList, setter = setter?.transform(transformer, data) } } + +class JKKtFunctionImpl(override var returnType: JKTypeIdentifier, + override var name: JKNameIdentifier, + override var valueArguments: List, + override var block: JKBlock?, + override var modifierList: JKModifierList) : JKElementBase(), JKKtFunction { + +} diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt index 7d008286b54..b7a3dbec597 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt @@ -86,4 +86,8 @@ interface JKJavaNewEmptyArray : JKExpression { interface JKJavaNewArray : JKExpression { val initializer: List -} \ No newline at end of file +} + +interface JKJavaExternalReference : JKExternalReference { + +} diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt index c8dd7ca724f..41898216344 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.j2k.tree +import com.intellij.psi.PsiElement import org.jetbrains.kotlin.j2k.tree.visitors.JKTransformer import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor @@ -75,39 +76,47 @@ interface JKFieldAccessExpression : JKExpression { } interface JKArrayAccessExpression : JKExpression { - val expression : JKExpression - val indexExpression : JKExpression? + val expression: JKExpression + val indexExpression: JKExpression? } interface JKParenthesizedExpression : JKExpression { - val expression : JKExpression? + val expression: JKExpression? } interface JKTypeCastExpression : JKExpression { - val expression : JKExpression? - val type : JKTypeReference? + val expression: JKExpression? + val type: JKTypeReference? } interface JKExpressionList : JKElement { - val expressions: Array -} - -interface JKMethodReference : JKElement { } -interface JKFieldReference : JKElement { +interface JKReference : JKElement { } -interface JKClassReference : JKElement { +interface JKExternalReference { + fun resolve(): PsiElement +} + +interface JKMethodReference : JKReference { } -interface JKTypeReference : JKElement { +interface JKFieldReference : JKReference { } +interface JKClassReference : JKReference { + +} + +interface JKTypeReference : JKReference { + val parameters: List +} + interface JKOperatorIdentifier : JKIdentifier interface JKQualificationIdentifier : JKIdentifier diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt index 0b1fc79a4d2..aacf241f059 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt @@ -27,9 +27,25 @@ interface JKKtAssignmentStatement : JKStatement interface JKKtCall : JKMethodCallExpression interface JKKtProperty : JKDeclaration, JKModifierListOwner { - var type: JKTypeIdentifier - var name: JKNameIdentifier - var initializer: JKExpression? - var getter: JKBlock? - var setter: JKBlock? + val type: JKTypeIdentifier + val name: JKNameIdentifier + val initializer: JKExpression? + val getter: JKBlock? + val setter: JKBlock? +} + +interface JKKtFunction : JKDeclaration, JKModifierListOwner { + val returnType: JKTypeIdentifier + val name: JKNameIdentifier + val valueArguments: List + val block: JKBlock? +} + +interface JKKtModifier : JKModifier { + val type: KtModifierType + + enum class KtModifierType { + ACTUAL, ABSTRACT, ANNOTATION, COMPANION, CONST, CROSSINLINE, DATA, ENUM, EXPECT, EXTERNAL, FINAL, INFIX, INLINE, INNER, + INTERNAL, LATEINIT, NOINLINE, OPEN, OPERATOR, OUT, OVERRIDE, REIFIED, SEALED, SUSPEND, TAILREC, VARARG + } } \ No newline at end of file