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 com.intellij.psi.*
import org.jetbrains.kotlin.j2k.tree.JKLocalVariable 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.j2k.tree.impl.*
import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtClassOrObject
@@ -26,7 +27,7 @@ class JKSymbolProvider {
is KtClassOrObject -> JKMultiverseKtClassSymbol(psi) is KtClassOrObject -> JKMultiverseKtClassSymbol(psi)
is PsiMethod -> JKMultiverseMethodSymbol(psi) is PsiMethod -> JKMultiverseMethodSymbol(psi)
is PsiField -> JKMultiverseFieldSymbol(psi) is PsiField -> JKMultiverseFieldSymbol(psi)
else -> TODO() else -> TODO(psi::class.toString())
} }
} }
} }
@@ -41,6 +42,10 @@ class JKSymbolProvider {
return symbols.getOrPut(psi) { JKUniverseFieldSymbol(variable) } return symbols.getOrPut(psi) { JKUniverseFieldSymbol(variable) }
} }
fun provideParameterSymbol(psi: PsiParameter, variable: JKParameter): JKSymbol {
return symbols.getOrPut(psi) { JKUniverseFieldSymbol(variable) }
}
private inner class ElementVisitor : JavaElementVisitor() { private inner class ElementVisitor : JavaElementVisitor() {
override fun visitClass(aClass: PsiClass) { override fun visitClass(aClass: PsiClass) {
symbols[aClass] = JKUniverseClassSymbol() symbols[aClass] = JKUniverseClassSymbol()
@@ -252,7 +252,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
?: TODO() ?: TODO()
}, },
JKNameIdentifierImpl(name), JKNameIdentifierImpl(name),
parameterList.parameters.map { it -> it.toJK() }, parameterList.parameters.map { it.toJK() },
body?.toJK() ?: JKBodyStub body?.toJK() ?: JKBodyStub
).also { ).also {
(symbolProvider.provideDirectSymbol(this) as? JKUniverseMethodSymbol)?.run { target = it } (symbolProvider.provideDirectSymbol(this) as? JKUniverseMethodSymbol)?.run { target = it }
@@ -265,8 +265,12 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
else -> null else -> null
} }
fun PsiParameter.toJK(): JKValueArgumentImpl { fun PsiParameter.toJK(): JKParameter {
return JKValueArgumentImpl(with(expressionTreeMapper) { typeElement?.toJK() } ?: TODO(), name!!) return JKParameterImpl(with(expressionTreeMapper) { typeElement?.toJK() } ?: TODO(),
JKNameIdentifierImpl(name!!),
with(modifierMapper) { modifierList.toJK() }).also {
symbolProvider.provideParameterSymbol(this, it)
}
} }
fun PsiCodeBlock.toJK(): JKBlock { fun PsiCodeBlock.toJK(): JKBlock {
@@ -66,7 +66,7 @@ class FieldToPropertyConversion : RecursiveApplicableConversionBase() {
private fun JKMethod.getterFor(): JKJavaField? { private fun JKMethod.getterFor(): JKJavaField? {
if (JvmAbi.isGetterName(name.value)) return null 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 if (this !is JKJavaMethod) return null
val returnStatement = block.statements.singleOrNull() as? JKReturnStatement ?: return null val returnStatement = block.statements.singleOrNull() as? JKReturnStatement ?: return null
val fieldAccess = returnStatement.expression as? JKFieldAccessExpression ?: 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.JKClass
import org.jetbrains.kotlin.j2k.tree.JKJavaMethod import org.jetbrains.kotlin.j2k.tree.JKJavaMethod
import org.jetbrains.kotlin.j2k.tree.JKTreeElement 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.JKKtFunctionImpl
import org.jetbrains.kotlin.j2k.tree.impl.JKTypeElementImpl
class JavaMethodToKotlinFunctionConversion : TransformerBasedConversion() { class JavaMethodToKotlinFunctionConversion : TransformerBasedConversion() {
override fun visitTreeElement(element: JKTreeElement) { override fun visitTreeElement(element: JKTreeElement) {
@@ -36,7 +34,7 @@ class JavaMethodToKotlinFunctionConversion : TransformerBasedConversion() {
JKKtFunctionImpl( JKKtFunctionImpl(
it.returnType, it.returnType,
it.name, it.name,
it.valueArguments, it.parameters,
it.block, it.block,
it.modifierList it.modifierList
) )
@@ -43,9 +43,9 @@ private class DebugTreePrinter : JKVisitorVoid {
override fun visitJavaMethod(javaMethod: JKJavaMethod) { override fun visitJavaMethod(javaMethod: JKJavaMethod) {
printer.println(javaMethod.classNameWithoutJK(), " [") printer.println(javaMethod.classNameWithoutJK(), " [")
printer.indented { printer.indented {
javaMethod.block?.accept(this, null) javaMethod.block.accept(this, null)
javaMethod.modifierList.accept(this, null) javaMethod.modifierList.accept(this, null)
javaMethod.valueArguments.forEach { it.accept(this, null) } javaMethod.parameters.forEach { it.accept(this, null) }
} }
printer.println("]") printer.println("]")
} }
@@ -35,14 +35,14 @@ class JKJavaFieldImpl(modifierList: JKModifierList, type: JKTypeElement, name: J
} }
class JKJavaMethodImpl( 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() { ) : JKJavaMethod, JKBranchElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaMethod(this, data) 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 modifierList: JKModifierList by child(modifierList)
override var returnType: JKTypeElement by child(returnType) override var returnType: JKTypeElement by child(returnType)
override var name: JKNameIdentifier by child(name) 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 block: JKBlock by child(block)
} }
@@ -46,9 +46,18 @@ class JKModifierListImpl(
override var modifiers: List<JKModifier> by children(modifiers) override var modifiers: List<JKModifier> by children(modifiers)
} }
class JKValueArgumentImpl(type: JKTypeElement, override val name: String) : JKValueArgument, JKBranchElementBase() { class JKParameterImpl(
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitValueArgument(this, data) 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) override var type by child(type)
} }
@@ -43,7 +43,7 @@ class JKKtPropertyImpl(
class JKKtFunctionImpl( class JKKtFunctionImpl(
returnType: JKTypeElement, returnType: JKTypeElement,
name: JKNameIdentifier, name: JKNameIdentifier,
valueArguments: List<JKValueArgument>, parameters: List<JKParameter>,
block: JKBlock, block: JKBlock,
modifierList: JKModifierList modifierList: JKModifierList
) : JKBranchElementBase(), JKKtFunction { ) : JKBranchElementBase(), JKKtFunction {
@@ -51,7 +51,7 @@ class JKKtFunctionImpl(
override var returnType: JKTypeElement by child(returnType) override var returnType: JKTypeElement by child(returnType)
override var name: JKNameIdentifier by child(name) 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 block: JKBlock by child(block)
override var modifierList: JKModifierList by child(modifierList) override var modifierList: JKModifierList by child(modifierList)
} }
@@ -45,7 +45,7 @@ interface JKClass : JKDeclaration, JKModifierListOwner {
interface JKMethod : JKDeclaration, JKModifierListOwner { interface JKMethod : JKDeclaration, JKModifierListOwner {
val name: JKNameIdentifier val name: JKNameIdentifier
var valueArguments: List<JKValueArgument> var parameters: List<JKParameter>
val returnType: JKTypeElement val returnType: JKTypeElement
} }
@@ -154,9 +154,8 @@ interface JKLiteralExpression : JKExpression {
} }
} }
interface JKValueArgument : JKTreeElement { interface JKParameter : JKField {
var type: JKTypeElement
val name: String
} }
interface JKStringLiteralExpression : JKLiteralExpression { interface JKStringLiteralExpression : JKLiteralExpression {
@@ -34,7 +34,7 @@ interface JKVisitor<out R, in D> {
fun visitTypeCastExpression(typeCastExpression: JKTypeCastExpression, data: D): R = visitExpression(typeCastExpression, data) fun visitTypeCastExpression(typeCastExpression: JKTypeCastExpression, data: D): R = visitExpression(typeCastExpression, data)
fun visitExpressionList(expressionList: JKExpressionList, data: D): R = visitTreeElement(expressionList, data) fun visitExpressionList(expressionList: JKExpressionList, data: D): R = visitTreeElement(expressionList, data)
fun visitLiteralExpression(literalExpression: JKLiteralExpression, data: D): R = visitExpression(literalExpression, 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 visitStringLiteralExpression(stringLiteralExpression: JKStringLiteralExpression, data: D): R = visitLiteralExpression(stringLiteralExpression, data)
fun visitStubExpression(stubExpression: JKStubExpression, data: D): R = visitExpression(stubExpression, data) fun visitStubExpression(stubExpression: JKStubExpression, data: D): R = visitExpression(stubExpression, data)
fun visitLoopStatement(loopStatement: JKLoopStatement, data: D): R = visitStatement(loopStatement, 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) override fun visitExpressionList(expressionList: JKExpressionList, data: Nothing?) = visitExpressionList(expressionList)
fun visitLiteralExpression(literalExpression: JKLiteralExpression) = visitExpression(literalExpression, null) fun visitLiteralExpression(literalExpression: JKLiteralExpression) = visitExpression(literalExpression, null)
override fun visitLiteralExpression(literalExpression: JKLiteralExpression, data: Nothing?) = visitLiteralExpression(literalExpression) override fun visitLiteralExpression(literalExpression: JKLiteralExpression, data: Nothing?) = visitLiteralExpression(literalExpression)
fun visitValueArgument(valueArgument: JKValueArgument) = visitTreeElement(valueArgument, null) fun visitParameter(parameter: JKParameter) = visitField(parameter, null)
override fun visitValueArgument(valueArgument: JKValueArgument, data: Nothing?) = visitValueArgument(valueArgument) override fun visitParameter(parameter: JKParameter, data: Nothing?) = visitParameter(parameter)
fun visitStringLiteralExpression(stringLiteralExpression: JKStringLiteralExpression) = visitLiteralExpression(stringLiteralExpression, null) fun visitStringLiteralExpression(stringLiteralExpression: JKStringLiteralExpression) = visitLiteralExpression(stringLiteralExpression, null)
override fun visitStringLiteralExpression(stringLiteralExpression: JKStringLiteralExpression, data: Nothing?) = visitStringLiteralExpression(stringLiteralExpression) override fun visitStringLiteralExpression(stringLiteralExpression: JKStringLiteralExpression, data: Nothing?) = visitStringLiteralExpression(stringLiteralExpression)
fun visitStubExpression(stubExpression: JKStubExpression) = visitExpression(stubExpression, null) fun visitStubExpression(stubExpression: JKStubExpression) = visitExpression(stubExpression, null)