[FIR] Define argument lists and their builders more accurately

This commit is contained in:
Mikhail Glukhikh
2020-03-11 16:50:39 +03:00
parent 3d17ce05b5
commit 1321bf426b
6 changed files with 77 additions and 42 deletions
@@ -484,7 +484,7 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
rValue = value rValue = value
this.operation = operation this.operation = operation
indexes += firArrayAccess.arguments indexes += firArrayAccess.arguments
argumentList = FirArraySetArgumentList(rValue, indexes) argumentList = buildArraySetArgumentList(rValue, indexes)
} }
val arrayExpression = this.getChildNodeByType(REFERENCE_EXPRESSION) val arrayExpression = this.getChildNodeByType(REFERENCE_EXPRESSION)
if (arrayExpression != null) { if (arrayExpression != null) {
@@ -209,7 +209,7 @@ class FirCallCompletionResultsWriterTransformer(
} }
} }
subCandidate.argumentMapping?.let { subCandidate.argumentMapping?.let {
result.replaceArgumentList(FirResolvedArgumentList(it)) result.replaceArgumentList(buildResolvedArgumentList(it))
} }
result.transformExplicitReceiver(integerApproximator, null) result.transformExplicitReceiver(integerApproximator, null)
} }
@@ -0,0 +1,28 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.FirVisitor
abstract class FirAbstractArgumentList : FirArgumentList() {
override val source: FirSourceElement?
get() = null
override fun <D> transformArguments(transformer: FirTransformer<D>, data: D): FirArgumentList {
return this
}
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
// DO NOTHING
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
return this
}
}
@@ -5,12 +5,10 @@
package org.jetbrains.kotlin.fir.expressions package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.builder.buildArgumentList import org.jetbrains.kotlin.fir.expressions.builder.buildArgumentList
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.expressions.impl.FirArraySetArgumentList
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.expressions.impl.FirResolvedArgumentList
fun buildUnaryArgumentList(argument: FirExpression): FirArgumentList = buildArgumentList { fun buildUnaryArgumentList(argument: FirExpression): FirArgumentList = buildArgumentList {
arguments += argument arguments += argument
@@ -21,45 +19,13 @@ fun buildBinaryArgumentList(left: FirExpression, right: FirExpression): FirArgum
arguments += right arguments += right
} }
abstract class FirAbstractArgumentList : FirArgumentList() { fun buildArraySetArgumentList(rValue: FirExpression, indexes: List<FirExpression>): FirArgumentList =
override val source: FirSourceElement? FirArraySetArgumentList(rValue, indexes)
get() = null
override fun <D> transformArguments(transformer: FirTransformer<D>, data: D): FirArgumentList { fun buildResolvedArgumentList(mapping: Map<FirExpression, FirValueParameter>): FirArgumentList =
return this FirResolvedArgumentList(mapping)
}
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
// DO NOTHING
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
return this
}
}
object FirEmptyArgumentList : FirAbstractArgumentList() { object FirEmptyArgumentList : FirAbstractArgumentList() {
override val arguments: List<FirExpression> override val arguments: List<FirExpression>
get() = emptyList() get() = emptyList()
} }
class FirArraySetArgumentList(
private val rValue: FirExpression,
private val indexes: List<FirExpression>
) : FirAbstractArgumentList() {
override val arguments: List<FirExpression>
get() = indexes + rValue
}
class FirResolvedArgumentList(
val mapping: Map<FirExpression, FirValueParameter>
) : FirAbstractArgumentList() {
override val arguments: List<FirExpression>
get() = mapping.keys.toList()
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
for (argument in mapping.keys) {
argument.accept(visitor, data)
}
}
}
@@ -0,0 +1,17 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.fir.expressions.FirAbstractArgumentList
import org.jetbrains.kotlin.fir.expressions.FirExpression
class FirArraySetArgumentList internal constructor(
private val rValue: FirExpression,
private val indexes: List<FirExpression>
) : FirAbstractArgumentList() {
override val arguments: List<FirExpression>
get() = indexes + rValue
}
@@ -0,0 +1,24 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.expressions.impl
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.FirAbstractArgumentList
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.visitors.FirVisitor
class FirResolvedArgumentList internal constructor(
val mapping: Map<FirExpression, FirValueParameter>
) : FirAbstractArgumentList() {
override val arguments: List<FirExpression>
get() = mapping.keys.toList()
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
for (argument in mapping.keys) {
argument.accept(visitor, data)
}
}
}