FIR: Fix value-parameters redeclare in destructuring

This commit is contained in:
Simon Ogorodnik
2019-03-11 16:49:29 +03:00
parent 9a642ef2e5
commit 9cc6e44158
2 changed files with 20 additions and 8 deletions
@@ -10,20 +10,17 @@ import com.intellij.psi.tree.IElementType
import org.jetbrains.kotlin.KtNodeTypes
import org.jetbrains.kotlin.fir.FirReference
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirNamedDeclaration
import org.jetbrains.kotlin.fir.declarations.impl.FirVariableImpl
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.impl.*
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
import org.jetbrains.kotlin.fir.references.FirExplicitThisReference
import org.jetbrains.kotlin.fir.references.FirSimpleNamedReference
import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl
import org.jetbrains.kotlin.ir.expressions.IrConstKind
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.constants.evaluate.*
@@ -268,12 +265,13 @@ internal fun generateAccessExpression(session: FirSession, psi: PsiElement?, nam
internal fun generateDestructuringBlock(
session: FirSession,
multiDeclaration: KtDestructuringDeclaration,
container: FirNamedDeclaration,
container: FirVariable,
tmpVariable: Boolean,
extractAnnotationsTo: KtAnnotated.(FirAbstractAnnotatedElement) -> Unit,
toFirOrImplicitTypeRef: KtTypeReference?.() -> FirTypeRef
): FirExpression {
return FirBlockImpl(session, multiDeclaration).apply {
if (container is FirVariable) {
if (tmpVariable) {
statements += container
}
val isVar = multiDeclaration.isVar
@@ -614,7 +614,11 @@ class RawFirBuilder(val session: FirSession, val stubMode: Boolean) {
defaultValue = null, isCrossinline = false, isNoinline = false, isVararg = false
)
destructuringBlock = generateDestructuringBlock(
this@RawFirBuilder.session, multiDeclaration, multiParameter, { extractAnnotationsTo(it) }
this@RawFirBuilder.session,
multiDeclaration,
multiParameter,
tmpVariable = false,
extractAnnotationsTo = { extractAnnotationsTo(it) }
) { toFirOrImplicitType() }
multiParameter
} else {
@@ -1102,7 +1106,11 @@ class RawFirBuilder(val session: FirSession, val stubMode: Boolean) {
)
if (multiDeclaration != null) {
val destructuringBlock = generateDestructuringBlock(
this@RawFirBuilder.session, multiDeclaration, firLoopParameter, { extractAnnotationsTo(it) }
this@RawFirBuilder.session,
multiDeclaration,
firLoopParameter,
tmpVariable = true,
extractAnnotationsTo = { extractAnnotationsTo(it) }
) { toFirOrImplicitType() }
if (destructuringBlock is FirBlock) {
for ((index, statement) in destructuringBlock.statements.withIndex()) {
@@ -1348,7 +1356,13 @@ class RawFirBuilder(val session: FirSession, val stubMode: Boolean) {
session, multiDeclaration, "destruct",
multiDeclaration.initializer.toFirExpression("Destructuring declaration without initializer")
)
return generateDestructuringBlock(session, multiDeclaration, baseVariable, { extractAnnotationsTo(it) }) {
return generateDestructuringBlock(
session,
multiDeclaration,
baseVariable,
tmpVariable = true,
extractAnnotationsTo = { extractAnnotationsTo(it) }
) {
toFirOrImplicitType()
}
}