New J2K: Fix also expression && lambda parameter types

This commit is contained in:
Ilya Kirillov
2019-01-12 02:40:02 +03:00
committed by Ilya Kirillov
parent d56a52fce6
commit b396ee0cca
9 changed files with 21 additions and 26 deletions
@@ -173,14 +173,15 @@ class JavaToJKTreeBuilder(
fun PsiLambdaExpression.toJK(): JKExpression { fun PsiLambdaExpression.toJK(): JKExpression {
return JKLambdaExpressionImpl( return JKLambdaExpressionImpl(
with(declarationMapper) { parameterList.parameters.map { it.toJK() } },
body.let { body.let {
when (it) { when (it) {
is PsiExpression -> JKExpressionStatementImpl(it.toJK()) is PsiExpression -> JKExpressionStatementImpl(it.toJK())
is PsiCodeBlock -> JKBlockStatementImpl(with(declarationMapper) { it.toJK() }) is PsiCodeBlock -> JKBlockStatementImpl(with(declarationMapper) { it.toJK() })
else -> JKBlockStatementImpl(JKBodyStub) else -> JKBlockStatementImpl(JKBodyStub)
} }
}) },
with(declarationMapper) { parameterList.parameters.map { it.toJK() } }
)
} }
private fun JKExpression.qualified(qualifier: JKExpression?) = private fun JKExpression.qualified(qualifier: JKExpression?) =
@@ -59,7 +59,8 @@ class ArrayInitializerConversion(private val context: ConversionContext) : Recur
JKExpressionListImpl( JKExpressionListImpl(
dimensions[0], dimensions[0],
JKLambdaExpressionImpl( JKLambdaExpressionImpl(
statement = JKExpressionStatementImpl(buildArrayInitializer(dimensions.subList(1, dimensions.size), type)) JKExpressionStatementImpl(buildArrayInitializer(dimensions.subList(1, dimensions.size), type)),
emptyList()
) )
) )
) )
@@ -67,7 +68,7 @@ class ArrayInitializerConversion(private val context: ConversionContext) : Recur
var resultType = JKClassTypeImpl( var resultType = JKClassTypeImpl(
context.symbolProvider.provideByFqName(arrayFqName(type)), context.symbolProvider.provideByFqName(arrayFqName(type)),
if (type is JKJavaPrimitiveType) emptyList() else listOf(type), if (type is JKJavaPrimitiveType) emptyList() else listOf(type),
Nullability.NotNull Nullability.Default
) )
for (i in 0 until dimensions.size - 2) { for (i in 0 until dimensions.size - 2) {
resultType = JKClassTypeImpl( resultType = JKClassTypeImpl(
@@ -19,8 +19,8 @@ class AssertStatementConversion(private val context: ConversionContext) : Recurs
val messageExpression = val messageExpression =
if (element.description is JKStubExpression) null if (element.description is JKStubExpression) null
else JKLambdaExpressionImpl( else JKLambdaExpressionImpl(
emptyList(), JKExpressionStatementImpl(element::description.detached()),
JKExpressionStatementImpl(element::description.detached()) emptyList()
) )
return recurse( return recurse(
JKExpressionStatementImpl( JKExpressionStatementImpl(
@@ -21,7 +21,11 @@ class AssignmentAsExpressionToAlsoConversion(val context: ConversionContext) : R
), context.symbolProvider.provideByFqName("kotlin/also") ), context.symbolProvider.provideByFqName("kotlin/also")
).also { ).also {
it.statement.cast<JKBlockStatement>().block.statements.first().cast<JKKtAssignmentStatement>().expression = it.statement.cast<JKBlockStatement>().block.statements.first().cast<JKKtAssignmentStatement>().expression =
JKFieldAccessExpressionImpl(context.symbolProvider.provideUniverseSymbol(it.parameter)) JKFieldAccessExpressionImpl(
context.symbolProvider.provideUniverseSymbol(
JKParameterImpl(JKTypeElementImpl(JKContextType), JKNameIdentifierImpl("it"))
)
)//TODO introduce symbol
} }
return recurse( return recurse(
@@ -33,8 +33,8 @@ class BlockToRunConversion(private val context: ConversionContext) : RecursiveAp
element.invalidate() element.invalidate()
val lambda = JKLambdaExpressionImpl( val lambda = JKLambdaExpressionImpl(
emptyList(), JKBlockStatementImpl(element.block),
JKBlockStatementImpl(element.block) emptyList()
) )
val call = JKKtCallExpressionImpl(runSymbol as JKMethodSymbol, JKExpressionListImpl(listOf(lambda))) val call = JKKtCallExpressionImpl(runSymbol as JKMethodSymbol, JKExpressionListImpl(listOf(lambda)))
return recurse(call) return recurse(call)
@@ -208,8 +208,8 @@ fun useExpression(
JKParameterImpl(JKTypeElementImpl(JKNoTypeImpl), variableIdentifier) JKParameterImpl(JKTypeElementImpl(JKNoTypeImpl), variableIdentifier)
val lambda = JKLambdaExpressionImpl( val lambda = JKLambdaExpressionImpl(
listOf(lambdaParameter), body,
body listOf(lambdaParameter)
) )
val methodCall = val methodCall =
JKJavaMethodCallExpressionImpl( JKJavaMethodCallExpressionImpl(
@@ -358,9 +358,9 @@ class JKClassAccessExpressionImpl(override var identifier: JKClassSymbol) : JKCl
} }
class JKLambdaExpressionImpl( class JKLambdaExpressionImpl(
parameters: List<JKParameter> = listOf( statement: JKStatement,
JKParameterImpl(JKTypeElementImpl(JKJavaVoidType), JKNameIdentifierImpl("it")) parameters: List<JKParameter>,
), statement: JKStatement, returnType: JKTypeElement = JKTypeElementImpl(JKContextType) returnType: JKTypeElement = JKTypeElementImpl(JKContextType)//TODO use function type
) : JKLambdaExpression, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() { ) : JKLambdaExpression, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() {
override var statement by child(statement) override var statement by child(statement)
override val returnType by child(returnType) override val returnType by child(returnType)
@@ -118,7 +118,6 @@ class JKKtOperatorImpl(override val token: JKKtOperatorToken, val methodSymbol:
class JKKtAlsoCallExpressionImpl( class JKKtAlsoCallExpressionImpl(
statement: JKStatement, statement: JKStatement,
override val identifier: JKMethodSymbol, override val identifier: JKMethodSymbol,
override val parameterName: String = "it",
typeArgumentList: JKTypeArgumentList = JKTypeArgumentListImpl() typeArgumentList: JKTypeArgumentList = JKTypeArgumentListImpl()
) : JKKtAlsoCallExpression, JKBranchElementBase() { ) : JKKtAlsoCallExpression, JKBranchElementBase() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtAlsoCallExpression(this, data) override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtAlsoCallExpression(this, data)
@@ -127,19 +126,10 @@ class JKKtAlsoCallExpressionImpl(
set(it) { set(it) {
arguments.expressions.first().cast<JKLambdaExpressionImpl>().statement = it arguments.expressions.first().cast<JKLambdaExpressionImpl>().statement = it
} }
val parameter
get() = arguments.expressions.first().cast<JKLambdaExpression>().parameters.first()
override var arguments: JKExpressionList by child( override var arguments: JKExpressionList by child(
JKExpressionListImpl( JKExpressionListImpl(
listOf( listOf(
JKLambdaExpressionImpl( JKLambdaExpressionImpl(statement, emptyList())
listOf(
JKParameterImpl(
JKTypeElementImpl(JKJavaVoidType),
JKNameIdentifierImpl(parameterName)
)
), statement
)
) )
) )
) )
@@ -58,7 +58,6 @@ interface JKKtMethodCallExpression : JKMethodCallExpression
interface JKKtAlsoCallExpression : JKKtMethodCallExpression { interface JKKtAlsoCallExpression : JKKtMethodCallExpression {
var statement: JKStatement var statement: JKStatement
val parameterName: String
} }
interface JKKtLiteralExpression : JKLiteralExpression interface JKKtLiteralExpression : JKLiteralExpression