FIR: Fix value-parameters redeclare in destructuring
This commit is contained in:
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user