New J2K: Reference resolve for parameters.

This commit is contained in:
Dimach
2018-06-13 09:16:39 +03:00
committed by Ilya Kirillov
parent 6f84750af4
commit 72c88c9003
11 changed files with 38 additions and 23 deletions
@@ -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()
@@ -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 {
@@ -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
@@ -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
)
@@ -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("]")
}
@@ -35,14 +35,14 @@ class JKJavaFieldImpl(modifierList: JKModifierList, type: JKTypeElement, name: J
}
class JKJavaMethodImpl(
modifierList: JKModifierList, returnType: JKTypeElement, name: JKNameIdentifier, valueArguments: List<JKValueArgument>, block: JKBlock
modifierList: JKModifierList, returnType: JKTypeElement, name: JKNameIdentifier, parameters: List<JKParameter>, block: JKBlock
) : JKJavaMethod, JKBranchElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, 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<JKValueArgument> by children(valueArguments)
override var parameters: List<JKParameter> by children(parameters)
override var block: JKBlock by child(block)
}
@@ -46,9 +46,18 @@ class JKModifierListImpl(
override var modifiers: List<JKModifier> by children(modifiers)
}
class JKValueArgumentImpl(type: JKTypeElement, override val name: String) : JKValueArgument, JKBranchElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitValueArgument(this, data)
class JKParameterImpl(
type: JKTypeElement,
name: JKNameIdentifier,
modifierList: JKModifierList,
initializer: JKExpression = JKStubExpressionImpl()
) : JKParameter, JKBranchElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, 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)
}
@@ -43,7 +43,7 @@ class JKKtPropertyImpl(
class JKKtFunctionImpl(
returnType: JKTypeElement,
name: JKNameIdentifier,
valueArguments: List<JKValueArgument>,
parameters: List<JKParameter>,
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<JKValueArgument> by children(valueArguments)
override var parameters: List<JKParameter> by children(parameters)
override var block: JKBlock by child(block)
override var modifierList: JKModifierList by child(modifierList)
}
@@ -45,7 +45,7 @@ interface JKClass : JKDeclaration, JKModifierListOwner {
interface JKMethod : JKDeclaration, JKModifierListOwner {
val name: JKNameIdentifier
var valueArguments: List<JKValueArgument>
var parameters: List<JKParameter>
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 {
@@ -34,7 +34,7 @@ interface JKVisitor<out R, in D> {
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)
@@ -65,8 +65,8 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
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)