提交 6cee4e96 编写于 作者: M Mikhail Glukhikh

[FIR] Don't call componentX for anonymous destructuring entry

上级 795bd26e
......@@ -112,6 +112,7 @@ fun generateDestructuringBlock(
}
val isVar = multiDeclaration.isVar
for ((index, entry) in multiDeclaration.entries.withIndex()) {
if (entry == null) continue
statements += buildProperty {
this.session = session
origin = FirDeclarationOrigin.Source
......
......@@ -1068,7 +1068,7 @@ class DeclarationsConverter(
*/
private fun convertDestructingDeclaration(destructingDeclaration: LighterASTNode): DestructuringDeclaration {
var isVar = false
val entries = mutableListOf<FirVariable<*>>()
val entries = mutableListOf<FirVariable<*>?>()
val source = destructingDeclaration.toFirSourceElement()
var firExpression: FirExpression =
buildErrorExpression(null, ConeSimpleDiagnostic("Initializer required for destructuring declaration", DiagnosticKind.Syntax))
......@@ -1087,7 +1087,7 @@ class DeclarationsConverter(
/**
* @see org.jetbrains.kotlin.parsing.KotlinParsing.parseMultiDeclarationName
*/
private fun convertDestructingDeclarationEntry(entry: LighterASTNode): FirVariable<*> {
private fun convertDestructingDeclarationEntry(entry: LighterASTNode): FirVariable<*>? {
var modifiers = Modifier()
var identifier: String? = null
var firType: FirTypeRef? = null
......@@ -1099,6 +1099,7 @@ class DeclarationsConverter(
}
}
if (identifier == "_") return null
val name = identifier.nameAsSafeName()
return buildProperty {
source = entry.toFirSourceElement()
......
......@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.fir.lightTree.converter.generateDestructuringBlock
data class DestructuringDeclaration(
val isVar: Boolean,
val entries: List<FirVariable<*>>,
val entries: List<FirVariable<*>?>,
val initializer: FirExpression,
val source: FirSourceElement
) {
......
......@@ -96,6 +96,7 @@ internal fun generateDestructuringBlock(
}
val isVar = multiDeclaration.isVar
for ((index, entry) in multiDeclaration.entries.withIndex()) {
if (entry.nameIdentifier?.text == "_") continue
val entrySource = entry.toFirPsiSourceElement()
val name = entry.nameAsSafeName
statements += buildProperty {
......
......@@ -6,4 +6,8 @@ fun foo(some: Some) {
x++
y *= 2.0
z = ""
}
fun bar(some: Some) {
val (a, _, `_`) = some
}
\ No newline at end of file
......@@ -23,3 +23,4 @@ FILE: destructuring.kt
}
public? final? fun foo(some: Some): R|kotlin/Unit| { LAZY_BLOCK }
public? final? fun bar(some: Some): R|kotlin/Unit| { LAZY_BLOCK }
......@@ -33,3 +33,8 @@ FILE: destructuring.kt
*=(y#, Double(2.0))
z# = String()
}
public? final? fun bar(some: Some): R|kotlin/Unit| {
lval <destruct>: <implicit> = some#
lval a: <implicit> = R|<local>/<destruct>|.component1#()
lval _: <implicit> = R|<local>/<destruct>|.component3#()
}
......@@ -264,6 +264,7 @@ class RawFirBuilderTotalKotlinTestCase : AbstractRawFirBuilderTestCase() {
it.getStrictParentOfType<KtPackageDirective>() != null ||
it.getStrictParentOfType<KtImportDirective>() != null ||
(it is KtPropertyAccessor && !it.hasBody()) ||
it is KtDestructuringDeclarationEntry && it.text == "_" ||
it is KtConstantExpression && it.parent.let { parent ->
parent is KtPrefixExpression && (parent.operationToken == KtTokens.MINUS || parent.operationToken == KtTokens.PLUS)
}
......
// IGNORE_BACKEND_FIR: JVM_IR
class A {
operator fun component1() = "O"
operator fun component2(): String = throw RuntimeException("fail 0")
......
// IGNORE_BACKEND_FIR: JVM_IR
class A {
operator fun component1() = "O"
operator fun component2(): String = throw RuntimeException("fail 0")
......
......@@ -7,7 +7,7 @@ fun useDeclaredVariables() {
}
fun checkersShouldRun() {
<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>for ((<!UNRESOLVED_REFERENCE!>@A a<!>, <!UNRESOLVED_REFERENCE!>_<!>)<!SYNTAX!><!>) {
<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>for ((<!UNRESOLVED_REFERENCE!>@A a<!>, _)<!SYNTAX!><!>) {
}<!>
}
......
......@@ -5,7 +5,7 @@ fun useDeclaredVariables() {
}
fun checkersShouldRun() {
val (<!UNRESOLVED_REFERENCE!>@A a<!>, <!UNRESOLVED_REFERENCE!>_<!>) = <!UNRESOLVED_REFERENCE!>unresolved<!>
val (<!UNRESOLVED_REFERENCE!>@A a<!>, _) = <!UNRESOLVED_REFERENCE!>unresolved<!>
}
annotation class A
......@@ -5,7 +5,7 @@ fun useDeclaredVariables() {
}
fun checkersShouldRun() {
<!INITIALIZER_REQUIRED_FOR_DESTRUCTURING_DECLARATION!>val (<!UNRESOLVED_REFERENCE!>@A a<!>, <!UNRESOLVED_REFERENCE!>_<!>)<!>
<!INITIALIZER_REQUIRED_FOR_DESTRUCTURING_DECLARATION!>val (<!UNRESOLVED_REFERENCE!>@A a<!>, _)<!>
}
annotation class A
......@@ -11,31 +11,31 @@ class C {
fun test() {
for ((x, _) in C()) {
foo(x, _)
foo(x, <!UNRESOLVED_REFERENCE!>_<!>)
}
for ((_, y) in C()) {
foo(_, y)
foo(<!UNRESOLVED_REFERENCE!>_<!>, y)
}
for ((_, _) in C()) {
<!INAPPLICABLE_CANDIDATE!>foo<!>(_, _)
foo(<!UNRESOLVED_REFERENCE!>_<!>, <!UNRESOLVED_REFERENCE!>_<!>)
}
for ((_ : Int, _ : String) in C()) {
<!INAPPLICABLE_CANDIDATE!>foo<!>(_, _)
foo(<!UNRESOLVED_REFERENCE!>_<!>, <!UNRESOLVED_REFERENCE!>_<!>)
}
for ((_ : String, _ : Int) in C()) {
<!INAPPLICABLE_CANDIDATE!>foo<!>(_, _)
foo(<!UNRESOLVED_REFERENCE!>_<!>, <!UNRESOLVED_REFERENCE!>_<!>)
}
val (x, _) = A()
val (_, y) = A()
foo(x, y)
<!INAPPLICABLE_CANDIDATE!>foo<!>(x, _)
foo(_, y)
foo(x, <!UNRESOLVED_REFERENCE!>_<!>)
foo(<!UNRESOLVED_REFERENCE!>_<!>, y)
val (`_`, z) = A()
......
......@@ -8,39 +8,39 @@ fun foo(block: (A) -> Unit) { }
fun bar() {
foo { (_, b) ->
_.hashCode()
<!UNRESOLVED_REFERENCE!>_<!>.<!UNRESOLVED_REFERENCE!>hashCode<!>()
b checkType { _<String>() }
}
foo { (a, _) ->
a checkType { _<Int>() }
_.hashCode()
<!UNRESOLVED_REFERENCE!>_<!>.<!UNRESOLVED_REFERENCE!>hashCode<!>()
}
foo { (_, _) ->
_.hashCode()
<!UNRESOLVED_REFERENCE!>_<!>.<!UNRESOLVED_REFERENCE!>hashCode<!>()
}
foo { (_: Int, b: String) ->
_.hashCode()
<!UNRESOLVED_REFERENCE!>_<!>.<!UNRESOLVED_REFERENCE!>hashCode<!>()
b checkType { _<String>() }
}
foo { (a: Int, _: String) ->
a checkType { _<Int>() }
_.hashCode()
<!UNRESOLVED_REFERENCE!>_<!>.<!UNRESOLVED_REFERENCE!>hashCode<!>()
}
foo { (_: Int, _: String) ->
_.hashCode()
<!UNRESOLVED_REFERENCE!>_<!>.<!UNRESOLVED_REFERENCE!>hashCode<!>()
}
foo { (_, _): A ->
_.hashCode()
<!UNRESOLVED_REFERENCE!>_<!>.<!UNRESOLVED_REFERENCE!>hashCode<!>()
}
foo { (`_`, _) ->
_ checkType { <!INAPPLICABLE_CANDIDATE!>_<!><Int>() }
_ checkType { _<Int>() }
}
foo { (_, `_`) ->
......@@ -52,12 +52,12 @@ fun bar() {
}
foo { (_: String, b) ->
_.hashCode()
<!UNRESOLVED_REFERENCE!>_<!>.<!UNRESOLVED_REFERENCE!>hashCode<!>()
b checkType { _<String>() }
}
foo { (_, b): B ->
_.hashCode()
<!UNRESOLVED_REFERENCE!>_<!>.<!UNRESOLVED_REFERENCE!>hashCode<!>()
b checkType { <!INAPPLICABLE_CANDIDATE!>_<!><Short>() }
}
}
......@@ -31,6 +31,5 @@ object B {
fun B.test() {
val <destruct>: A = A
val x: Int = (<this>, <destruct>).component1()
val _: Int = (<this>, <destruct>).component2()
val z: Int = (<this>, <destruct>).component3()
}
......@@ -64,10 +64,6 @@ FILE fqName:<root> fileName:/destructuringWithUnderscore.kt
CALL 'public final fun component1 (): kotlin.Int [operator] declared in <root>.B' type=kotlin.Int origin=null
$this: GET_VAR '<this>: <root>.B declared in <root>.test' type=<root>.B origin=null
$receiver: GET_VAR 'val tmp_0: <root>.A [val] declared in <root>.test' type=<root>.A origin=null
VAR name:_ type:kotlin.Int [val]
CALL 'public final fun component2 (): kotlin.Int [operator] declared in <root>.B' type=kotlin.Int origin=null
$this: GET_VAR '<this>: <root>.B declared in <root>.test' type=<root>.B origin=null
$receiver: GET_VAR 'val tmp_0: <root>.A [val] declared in <root>.test' type=<root>.A origin=null
VAR name:z type:kotlin.Int [val]
CALL 'public final fun component3 (): kotlin.Int [operator] declared in <root>.B' type=kotlin.Int origin=null
$this: GET_VAR '<this>: <root>.B declared in <root>.test' type=<root>.B origin=null
......
......@@ -56,7 +56,6 @@ data class A {
var fn: Function1<A, Int>
field = local fun <anonymous>(<destruct>: A): Int {
val _: Int = <destruct>.component1()
val y: Int = <destruct>.component2()
return 42.plus(other = y)
}
......
......@@ -142,9 +142,6 @@ FILE fqName:<root> fileName:/destructuringInLambda.kt
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> (<destruct>:<root>.A) returnType:kotlin.Int
VALUE_PARAMETER name:<destruct> index:0 type:<root>.A
BLOCK_BODY
VAR name:_ type:kotlin.Int [val]
CALL 'public final fun component1 (): kotlin.Int declared in <root>.A' type=kotlin.Int origin=null
$this: GET_VAR '<destruct>: <root>.A declared in <root>.fn.<anonymous>' type=<root>.A origin=null
VAR name:y type:kotlin.Int [val]
CALL 'public final fun component2 (): kotlin.Int declared in <root>.A' type=kotlin.Int origin=null
$this: GET_VAR '<destruct>: <root>.A declared in <root>.fn.<anonymous>' type=<root>.A origin=null
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册