New J2K: Reference resolve for parameters.
This commit is contained in:
@@ -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
|
||||
|
||||
+1
-3
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user