From 72c88c90033c7b1e9293d9e43ac0ed38464f98a9 Mon Sep 17 00:00:00 2001 From: Dimach Date: Wed, 13 Jun 2018 09:16:39 +0300 Subject: [PATCH] New J2K: Reference resolve for parameters. --- .../org/jetbrains/kotlin/j2k/JKSymbolProvider.kt | 7 ++++++- .../org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt | 10 +++++++--- .../j2k/conversions/FieldToPropertyConversion.kt | 2 +- .../JavaMethodToKotlinFunctionConversion.kt | 4 +--- .../jetbrains/kotlin/j2k/tree/DebugTreePrinter.kt | 4 ++-- j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt | 4 ++-- j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt | 13 +++++++++++-- j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt | 4 ++-- j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt | 7 +++---- .../jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt | 2 +- .../kotlin/j2k/tree/visitors/JKVisitorVoid.kt | 4 ++-- 11 files changed, 38 insertions(+), 23 deletions(-) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/JKSymbolProvider.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/JKSymbolProvider.kt index 68c0e785d39..49194d8e0da 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/JKSymbolProvider.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/JKSymbolProvider.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.j2k import com.intellij.psi.* import org.jetbrains.kotlin.j2k.tree.JKLocalVariable +import org.jetbrains.kotlin.j2k.tree.JKParameter import org.jetbrains.kotlin.j2k.tree.impl.* import org.jetbrains.kotlin.psi.KtClassOrObject @@ -26,7 +27,7 @@ class JKSymbolProvider { is KtClassOrObject -> JKMultiverseKtClassSymbol(psi) is PsiMethod -> JKMultiverseMethodSymbol(psi) is PsiField -> JKMultiverseFieldSymbol(psi) - else -> TODO() + else -> TODO(psi::class.toString()) } } } @@ -41,6 +42,10 @@ class JKSymbolProvider { return symbols.getOrPut(psi) { JKUniverseFieldSymbol(variable) } } + fun provideParameterSymbol(psi: PsiParameter, variable: JKParameter): JKSymbol { + return symbols.getOrPut(psi) { JKUniverseFieldSymbol(variable) } + } + private inner class ElementVisitor : JavaElementVisitor() { override fun visitClass(aClass: PsiClass) { symbols[aClass] = JKUniverseClassSymbol() diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt index f23fee1424b..bb409e008f8 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt @@ -252,7 +252,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) { ?: TODO() }, JKNameIdentifierImpl(name), - parameterList.parameters.map { it -> it.toJK() }, + parameterList.parameters.map { it.toJK() }, body?.toJK() ?: JKBodyStub ).also { (symbolProvider.provideDirectSymbol(this) as? JKUniverseMethodSymbol)?.run { target = it } @@ -265,8 +265,12 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) { else -> null } - fun PsiParameter.toJK(): JKValueArgumentImpl { - return JKValueArgumentImpl(with(expressionTreeMapper) { typeElement?.toJK() } ?: TODO(), name!!) + fun PsiParameter.toJK(): JKParameter { + return JKParameterImpl(with(expressionTreeMapper) { typeElement?.toJK() } ?: TODO(), + JKNameIdentifierImpl(name!!), + with(modifierMapper) { modifierList.toJK() }).also { + symbolProvider.provideParameterSymbol(this, it) + } } fun PsiCodeBlock.toJK(): JKBlock { diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/FieldToPropertyConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/FieldToPropertyConversion.kt index 1e7c6540383..2678b482c11 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/FieldToPropertyConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/FieldToPropertyConversion.kt @@ -66,7 +66,7 @@ class FieldToPropertyConversion : RecursiveApplicableConversionBase() { private fun JKMethod.getterFor(): JKJavaField? { if (JvmAbi.isGetterName(name.value)) return null - if (this.valueArguments.isNotEmpty()) return null + if (this.parameters.isNotEmpty()) return null if (this !is JKJavaMethod) return null val returnStatement = block.statements.singleOrNull() as? JKReturnStatement ?: return null val fieldAccess = returnStatement.expression as? JKFieldAccessExpression ?: return null diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaMethodToKotlinFunctionConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaMethodToKotlinFunctionConversion.kt index 087b48d60ea..a48ba247957 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaMethodToKotlinFunctionConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaMethodToKotlinFunctionConversion.kt @@ -19,9 +19,7 @@ package org.jetbrains.kotlin.j2k.conversions import org.jetbrains.kotlin.j2k.tree.JKClass import org.jetbrains.kotlin.j2k.tree.JKJavaMethod import org.jetbrains.kotlin.j2k.tree.JKTreeElement -import org.jetbrains.kotlin.j2k.tree.impl.JKJavaPrimitiveTypeImpl import org.jetbrains.kotlin.j2k.tree.impl.JKKtFunctionImpl -import org.jetbrains.kotlin.j2k.tree.impl.JKTypeElementImpl class JavaMethodToKotlinFunctionConversion : TransformerBasedConversion() { override fun visitTreeElement(element: JKTreeElement) { @@ -36,7 +34,7 @@ class JavaMethodToKotlinFunctionConversion : TransformerBasedConversion() { JKKtFunctionImpl( it.returnType, it.name, - it.valueArguments, + it.parameters, it.block, it.modifierList ) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/DebugTreePrinter.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/DebugTreePrinter.kt index af22edf2da0..cb912b163fe 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/DebugTreePrinter.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/DebugTreePrinter.kt @@ -43,9 +43,9 @@ private class DebugTreePrinter : JKVisitorVoid { override fun visitJavaMethod(javaMethod: JKJavaMethod) { printer.println(javaMethod.classNameWithoutJK(), " [") printer.indented { - javaMethod.block?.accept(this, null) + javaMethod.block.accept(this, null) javaMethod.modifierList.accept(this, null) - javaMethod.valueArguments.forEach { it.accept(this, null) } + javaMethod.parameters.forEach { it.accept(this, null) } } printer.println("]") } 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 853bd52c61d..b39eaf67ae2 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt @@ -35,14 +35,14 @@ class JKJavaFieldImpl(modifierList: JKModifierList, type: JKTypeElement, name: J } class JKJavaMethodImpl( - modifierList: JKModifierList, returnType: JKTypeElement, name: JKNameIdentifier, valueArguments: List, block: JKBlock + modifierList: JKModifierList, returnType: JKTypeElement, name: JKNameIdentifier, parameters: List, block: JKBlock ) : JKJavaMethod, JKBranchElementBase() { override fun accept(visitor: JKVisitor, data: D): R = visitor.visitJavaMethod(this, data) override var modifierList: JKModifierList by child(modifierList) override var returnType: JKTypeElement by child(returnType) override var name: JKNameIdentifier by child(name) - override var valueArguments: List by children(valueArguments) + override var parameters: List by children(parameters) override var block: JKBlock by child(block) } 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 443ebcd3379..05dd46adf7b 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt @@ -46,9 +46,18 @@ class JKModifierListImpl( override var modifiers: List by children(modifiers) } -class JKValueArgumentImpl(type: JKTypeElement, override val name: String) : JKValueArgument, JKBranchElementBase() { - override fun accept(visitor: JKVisitor, data: D): R = visitor.visitValueArgument(this, data) +class JKParameterImpl( + type: JKTypeElement, + name: JKNameIdentifier, + modifierList: JKModifierList, + initializer: JKExpression = JKStubExpressionImpl() +) : JKParameter, JKBranchElementBase() { + override fun accept(visitor: JKVisitor, data: D): R = visitor.visitParameter(this, data) + + override var modifierList by child(modifierList) + override val initializer by child(initializer) + override val name by child(name) override var type by child(type) } 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 f5fef8dfbbf..13b0375a983 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt @@ -43,7 +43,7 @@ class JKKtPropertyImpl( class JKKtFunctionImpl( returnType: JKTypeElement, name: JKNameIdentifier, - valueArguments: List, + parameters: List, block: JKBlock, modifierList: JKModifierList ) : JKBranchElementBase(), JKKtFunction { @@ -51,7 +51,7 @@ class JKKtFunctionImpl( override var returnType: JKTypeElement by child(returnType) override var name: JKNameIdentifier by child(name) - override var valueArguments: List by children(valueArguments) + override var parameters: List by children(parameters) override var block: JKBlock by child(block) override var modifierList: JKModifierList by child(modifierList) } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt index 9c3b873f61e..8b09675a571 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt @@ -45,7 +45,7 @@ interface JKClass : JKDeclaration, JKModifierListOwner { interface JKMethod : JKDeclaration, JKModifierListOwner { val name: JKNameIdentifier - var valueArguments: List + var parameters: List val returnType: JKTypeElement } @@ -154,9 +154,8 @@ interface JKLiteralExpression : JKExpression { } } -interface JKValueArgument : JKTreeElement { - var type: JKTypeElement - val name: String +interface JKParameter : JKField { + } interface JKStringLiteralExpression : JKLiteralExpression { diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt index b8d12730cf0..a197184dfc8 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt @@ -34,7 +34,7 @@ interface JKVisitor { fun visitTypeCastExpression(typeCastExpression: JKTypeCastExpression, data: D): R = visitExpression(typeCastExpression, data) fun visitExpressionList(expressionList: JKExpressionList, data: D): R = visitTreeElement(expressionList, data) fun visitLiteralExpression(literalExpression: JKLiteralExpression, data: D): R = visitExpression(literalExpression, data) - fun visitValueArgument(valueArgument: JKValueArgument, data: D): R = visitTreeElement(valueArgument, data) + fun visitParameter(parameter: JKParameter, data: D): R = visitField(parameter, data) fun visitStringLiteralExpression(stringLiteralExpression: JKStringLiteralExpression, data: D): R = visitLiteralExpression(stringLiteralExpression, data) fun visitStubExpression(stubExpression: JKStubExpression, data: D): R = visitExpression(stubExpression, data) fun visitLoopStatement(loopStatement: JKLoopStatement, data: D): R = visitStatement(loopStatement, data) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt index f85f7f3d340..43a36e05659 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt @@ -65,8 +65,8 @@ interface JKVisitorVoid : JKVisitor { override fun visitExpressionList(expressionList: JKExpressionList, data: Nothing?) = visitExpressionList(expressionList) fun visitLiteralExpression(literalExpression: JKLiteralExpression) = visitExpression(literalExpression, null) override fun visitLiteralExpression(literalExpression: JKLiteralExpression, data: Nothing?) = visitLiteralExpression(literalExpression) - fun visitValueArgument(valueArgument: JKValueArgument) = visitTreeElement(valueArgument, null) - override fun visitValueArgument(valueArgument: JKValueArgument, data: Nothing?) = visitValueArgument(valueArgument) + fun visitParameter(parameter: JKParameter) = visitField(parameter, null) + override fun visitParameter(parameter: JKParameter, data: Nothing?) = visitParameter(parameter) fun visitStringLiteralExpression(stringLiteralExpression: JKStringLiteralExpression) = visitLiteralExpression(stringLiteralExpression, null) override fun visitStringLiteralExpression(stringLiteralExpression: JKStringLiteralExpression, data: Nothing?) = visitStringLiteralExpression(stringLiteralExpression) fun visitStubExpression(stubExpression: JKStubExpression) = visitExpression(stubExpression, null)