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.KtNodeTypes
import org.jetbrains.kotlin.fir.FirReference import org.jetbrains.kotlin.fir.FirReference
import org.jetbrains.kotlin.fir.FirSession 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.declarations.impl.FirVariableImpl
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.impl.* import org.jetbrains.kotlin.fir.expressions.impl.*
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
import org.jetbrains.kotlin.fir.references.FirExplicitThisReference import org.jetbrains.kotlin.fir.references.FirExplicitThisReference
import org.jetbrains.kotlin.fir.references.FirSimpleNamedReference 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.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl
import org.jetbrains.kotlin.ir.expressions.IrConstKind import org.jetbrains.kotlin.ir.expressions.IrConstKind
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.constants.evaluate.* import org.jetbrains.kotlin.resolve.constants.evaluate.*
@@ -268,12 +265,13 @@ internal fun generateAccessExpression(session: FirSession, psi: PsiElement?, nam
internal fun generateDestructuringBlock( internal fun generateDestructuringBlock(
session: FirSession, session: FirSession,
multiDeclaration: KtDestructuringDeclaration, multiDeclaration: KtDestructuringDeclaration,
container: FirNamedDeclaration, container: FirVariable,
tmpVariable: Boolean,
extractAnnotationsTo: KtAnnotated.(FirAbstractAnnotatedElement) -> Unit, extractAnnotationsTo: KtAnnotated.(FirAbstractAnnotatedElement) -> Unit,
toFirOrImplicitTypeRef: KtTypeReference?.() -> FirTypeRef toFirOrImplicitTypeRef: KtTypeReference?.() -> FirTypeRef
): FirExpression { ): FirExpression {
return FirBlockImpl(session, multiDeclaration).apply { return FirBlockImpl(session, multiDeclaration).apply {
if (container is FirVariable) { if (tmpVariable) {
statements += container statements += container
} }
val isVar = multiDeclaration.isVar val isVar = multiDeclaration.isVar
@@ -614,7 +614,11 @@ class RawFirBuilder(val session: FirSession, val stubMode: Boolean) {
defaultValue = null, isCrossinline = false, isNoinline = false, isVararg = false defaultValue = null, isCrossinline = false, isNoinline = false, isVararg = false
) )
destructuringBlock = generateDestructuringBlock( destructuringBlock = generateDestructuringBlock(
this@RawFirBuilder.session, multiDeclaration, multiParameter, { extractAnnotationsTo(it) } this@RawFirBuilder.session,
multiDeclaration,
multiParameter,
tmpVariable = false,
extractAnnotationsTo = { extractAnnotationsTo(it) }
) { toFirOrImplicitType() } ) { toFirOrImplicitType() }
multiParameter multiParameter
} else { } else {
@@ -1102,7 +1106,11 @@ class RawFirBuilder(val session: FirSession, val stubMode: Boolean) {
) )
if (multiDeclaration != null) { if (multiDeclaration != null) {
val destructuringBlock = generateDestructuringBlock( val destructuringBlock = generateDestructuringBlock(
this@RawFirBuilder.session, multiDeclaration, firLoopParameter, { extractAnnotationsTo(it) } this@RawFirBuilder.session,
multiDeclaration,
firLoopParameter,
tmpVariable = true,
extractAnnotationsTo = { extractAnnotationsTo(it) }
) { toFirOrImplicitType() } ) { toFirOrImplicitType() }
if (destructuringBlock is FirBlock) { if (destructuringBlock is FirBlock) {
for ((index, statement) in destructuringBlock.statements.withIndex()) { for ((index, statement) in destructuringBlock.statements.withIndex()) {
@@ -1348,7 +1356,13 @@ class RawFirBuilder(val session: FirSession, val stubMode: Boolean) {
session, multiDeclaration, "destruct", session, multiDeclaration, "destruct",
multiDeclaration.initializer.toFirExpression("Destructuring declaration without initializer") 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() toFirOrImplicitType()
} }
} }