[FIR] Don't call componentX for anonymous destructuring entry
This commit is contained in:
+1
@@ -112,6 +112,7 @@ fun generateDestructuringBlock(
|
|||||||
}
|
}
|
||||||
val isVar = multiDeclaration.isVar
|
val isVar = multiDeclaration.isVar
|
||||||
for ((index, entry) in multiDeclaration.entries.withIndex()) {
|
for ((index, entry) in multiDeclaration.entries.withIndex()) {
|
||||||
|
if (entry == null) continue
|
||||||
statements += buildProperty {
|
statements += buildProperty {
|
||||||
this.session = session
|
this.session = session
|
||||||
origin = FirDeclarationOrigin.Source
|
origin = FirDeclarationOrigin.Source
|
||||||
|
|||||||
+3
-2
@@ -1068,7 +1068,7 @@ class DeclarationsConverter(
|
|||||||
*/
|
*/
|
||||||
private fun convertDestructingDeclaration(destructingDeclaration: LighterASTNode): DestructuringDeclaration {
|
private fun convertDestructingDeclaration(destructingDeclaration: LighterASTNode): DestructuringDeclaration {
|
||||||
var isVar = false
|
var isVar = false
|
||||||
val entries = mutableListOf<FirVariable<*>>()
|
val entries = mutableListOf<FirVariable<*>?>()
|
||||||
val source = destructingDeclaration.toFirSourceElement()
|
val source = destructingDeclaration.toFirSourceElement()
|
||||||
var firExpression: FirExpression =
|
var firExpression: FirExpression =
|
||||||
buildErrorExpression(null, ConeSimpleDiagnostic("Initializer required for destructuring declaration", DiagnosticKind.Syntax))
|
buildErrorExpression(null, ConeSimpleDiagnostic("Initializer required for destructuring declaration", DiagnosticKind.Syntax))
|
||||||
@@ -1087,7 +1087,7 @@ class DeclarationsConverter(
|
|||||||
/**
|
/**
|
||||||
* @see org.jetbrains.kotlin.parsing.KotlinParsing.parseMultiDeclarationName
|
* @see org.jetbrains.kotlin.parsing.KotlinParsing.parseMultiDeclarationName
|
||||||
*/
|
*/
|
||||||
private fun convertDestructingDeclarationEntry(entry: LighterASTNode): FirVariable<*> {
|
private fun convertDestructingDeclarationEntry(entry: LighterASTNode): FirVariable<*>? {
|
||||||
var modifiers = Modifier()
|
var modifiers = Modifier()
|
||||||
var identifier: String? = null
|
var identifier: String? = null
|
||||||
var firType: FirTypeRef? = null
|
var firType: FirTypeRef? = null
|
||||||
@@ -1099,6 +1099,7 @@ class DeclarationsConverter(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (identifier == "_") return null
|
||||||
val name = identifier.nameAsSafeName()
|
val name = identifier.nameAsSafeName()
|
||||||
return buildProperty {
|
return buildProperty {
|
||||||
source = entry.toFirSourceElement()
|
source = entry.toFirSourceElement()
|
||||||
|
|||||||
+1
-1
@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.fir.lightTree.converter.generateDestructuringBlock
|
|||||||
|
|
||||||
data class DestructuringDeclaration(
|
data class DestructuringDeclaration(
|
||||||
val isVar: Boolean,
|
val isVar: Boolean,
|
||||||
val entries: List<FirVariable<*>>,
|
val entries: List<FirVariable<*>?>,
|
||||||
val initializer: FirExpression,
|
val initializer: FirExpression,
|
||||||
val source: FirSourceElement
|
val source: FirSourceElement
|
||||||
) {
|
) {
|
||||||
|
|||||||
+1
@@ -96,6 +96,7 @@ internal fun generateDestructuringBlock(
|
|||||||
}
|
}
|
||||||
val isVar = multiDeclaration.isVar
|
val isVar = multiDeclaration.isVar
|
||||||
for ((index, entry) in multiDeclaration.entries.withIndex()) {
|
for ((index, entry) in multiDeclaration.entries.withIndex()) {
|
||||||
|
if (entry.nameIdentifier?.text == "_") continue
|
||||||
val entrySource = entry.toFirPsiSourceElement()
|
val entrySource = entry.toFirPsiSourceElement()
|
||||||
val name = entry.nameAsSafeName
|
val name = entry.nameAsSafeName
|
||||||
statements += buildProperty {
|
statements += buildProperty {
|
||||||
|
|||||||
@@ -7,3 +7,7 @@ fun foo(some: Some) {
|
|||||||
y *= 2.0
|
y *= 2.0
|
||||||
z = ""
|
z = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun bar(some: Some) {
|
||||||
|
val (a, _, `_`) = some
|
||||||
|
}
|
||||||
+1
@@ -23,3 +23,4 @@ FILE: destructuring.kt
|
|||||||
|
|
||||||
}
|
}
|
||||||
public? final? fun foo(some: Some): R|kotlin/Unit| { LAZY_BLOCK }
|
public? final? fun foo(some: Some): R|kotlin/Unit| { LAZY_BLOCK }
|
||||||
|
public? final? fun bar(some: Some): R|kotlin/Unit| { LAZY_BLOCK }
|
||||||
|
|||||||
+5
@@ -33,3 +33,8 @@ FILE: destructuring.kt
|
|||||||
*=(y#, Double(2.0))
|
*=(y#, Double(2.0))
|
||||||
z# = String()
|
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#()
|
||||||
|
}
|
||||||
|
|||||||
+1
@@ -264,6 +264,7 @@ class RawFirBuilderTotalKotlinTestCase : AbstractRawFirBuilderTestCase() {
|
|||||||
it.getStrictParentOfType<KtPackageDirective>() != null ||
|
it.getStrictParentOfType<KtPackageDirective>() != null ||
|
||||||
it.getStrictParentOfType<KtImportDirective>() != null ||
|
it.getStrictParentOfType<KtImportDirective>() != null ||
|
||||||
(it is KtPropertyAccessor && !it.hasBody()) ||
|
(it is KtPropertyAccessor && !it.hasBody()) ||
|
||||||
|
it is KtDestructuringDeclarationEntry && it.text == "_" ||
|
||||||
it is KtConstantExpression && it.parent.let { parent ->
|
it is KtConstantExpression && it.parent.let { parent ->
|
||||||
parent is KtPrefixExpression && (parent.operationToken == KtTokens.MINUS || parent.operationToken == KtTokens.PLUS)
|
parent is KtPrefixExpression && (parent.operationToken == KtTokens.MINUS || parent.operationToken == KtTokens.PLUS)
|
||||||
}
|
}
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
class A {
|
class A {
|
||||||
operator fun component1() = "O"
|
operator fun component1() = "O"
|
||||||
operator fun component2(): String = throw RuntimeException("fail 0")
|
operator fun component2(): String = throw RuntimeException("fail 0")
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
class A {
|
class A {
|
||||||
operator fun component1() = "O"
|
operator fun component1() = "O"
|
||||||
operator fun component2(): String = throw RuntimeException("fail 0")
|
operator fun component2(): String = throw RuntimeException("fail 0")
|
||||||
|
|||||||
+1
-1
@@ -7,7 +7,7 @@ fun useDeclaredVariables() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun checkersShouldRun() {
|
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!><!>) {
|
||||||
|
|
||||||
}<!>
|
}<!>
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@ fun useDeclaredVariables() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun checkersShouldRun() {
|
fun checkersShouldRun() {
|
||||||
val (<!UNRESOLVED_REFERENCE!>@A a<!>, <!UNRESOLVED_REFERENCE!>_<!>) = <!UNRESOLVED_REFERENCE!>unresolved<!>
|
val (<!UNRESOLVED_REFERENCE!>@A a<!>, _) = <!UNRESOLVED_REFERENCE!>unresolved<!>
|
||||||
}
|
}
|
||||||
|
|
||||||
annotation class A
|
annotation class A
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@ fun useDeclaredVariables() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun checkersShouldRun() {
|
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
|
annotation class A
|
||||||
|
|||||||
Vendored
+7
-7
@@ -11,31 +11,31 @@ class C {
|
|||||||
|
|
||||||
fun test() {
|
fun test() {
|
||||||
for ((x, _) in C()) {
|
for ((x, _) in C()) {
|
||||||
foo(x, _)
|
foo(x, <!UNRESOLVED_REFERENCE!>_<!>)
|
||||||
}
|
}
|
||||||
|
|
||||||
for ((_, y) in C()) {
|
for ((_, y) in C()) {
|
||||||
foo(_, y)
|
foo(<!UNRESOLVED_REFERENCE!>_<!>, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
for ((_, _) in C()) {
|
for ((_, _) in C()) {
|
||||||
<!INAPPLICABLE_CANDIDATE!>foo<!>(_, _)
|
foo(<!UNRESOLVED_REFERENCE!>_<!>, <!UNRESOLVED_REFERENCE!>_<!>)
|
||||||
}
|
}
|
||||||
|
|
||||||
for ((_ : Int, _ : String) in C()) {
|
for ((_ : Int, _ : String) in C()) {
|
||||||
<!INAPPLICABLE_CANDIDATE!>foo<!>(_, _)
|
foo(<!UNRESOLVED_REFERENCE!>_<!>, <!UNRESOLVED_REFERENCE!>_<!>)
|
||||||
}
|
}
|
||||||
|
|
||||||
for ((_ : String, _ : Int) in C()) {
|
for ((_ : String, _ : Int) in C()) {
|
||||||
<!INAPPLICABLE_CANDIDATE!>foo<!>(_, _)
|
foo(<!UNRESOLVED_REFERENCE!>_<!>, <!UNRESOLVED_REFERENCE!>_<!>)
|
||||||
}
|
}
|
||||||
|
|
||||||
val (x, _) = A()
|
val (x, _) = A()
|
||||||
val (_, y) = A()
|
val (_, y) = A()
|
||||||
|
|
||||||
foo(x, y)
|
foo(x, y)
|
||||||
<!INAPPLICABLE_CANDIDATE!>foo<!>(x, _)
|
foo(x, <!UNRESOLVED_REFERENCE!>_<!>)
|
||||||
foo(_, y)
|
foo(<!UNRESOLVED_REFERENCE!>_<!>, y)
|
||||||
|
|
||||||
val (`_`, z) = A()
|
val (`_`, z) = A()
|
||||||
|
|
||||||
|
|||||||
Vendored
+10
-10
@@ -8,39 +8,39 @@ fun foo(block: (A) -> Unit) { }
|
|||||||
|
|
||||||
fun bar() {
|
fun bar() {
|
||||||
foo { (_, b) ->
|
foo { (_, b) ->
|
||||||
_.hashCode()
|
<!UNRESOLVED_REFERENCE!>_<!>.<!UNRESOLVED_REFERENCE!>hashCode<!>()
|
||||||
b checkType { _<String>() }
|
b checkType { _<String>() }
|
||||||
}
|
}
|
||||||
|
|
||||||
foo { (a, _) ->
|
foo { (a, _) ->
|
||||||
a checkType { _<Int>() }
|
a checkType { _<Int>() }
|
||||||
_.hashCode()
|
<!UNRESOLVED_REFERENCE!>_<!>.<!UNRESOLVED_REFERENCE!>hashCode<!>()
|
||||||
}
|
}
|
||||||
|
|
||||||
foo { (_, _) ->
|
foo { (_, _) ->
|
||||||
_.hashCode()
|
<!UNRESOLVED_REFERENCE!>_<!>.<!UNRESOLVED_REFERENCE!>hashCode<!>()
|
||||||
}
|
}
|
||||||
|
|
||||||
foo { (_: Int, b: String) ->
|
foo { (_: Int, b: String) ->
|
||||||
_.hashCode()
|
<!UNRESOLVED_REFERENCE!>_<!>.<!UNRESOLVED_REFERENCE!>hashCode<!>()
|
||||||
b checkType { _<String>() }
|
b checkType { _<String>() }
|
||||||
}
|
}
|
||||||
|
|
||||||
foo { (a: Int, _: String) ->
|
foo { (a: Int, _: String) ->
|
||||||
a checkType { _<Int>() }
|
a checkType { _<Int>() }
|
||||||
_.hashCode()
|
<!UNRESOLVED_REFERENCE!>_<!>.<!UNRESOLVED_REFERENCE!>hashCode<!>()
|
||||||
}
|
}
|
||||||
|
|
||||||
foo { (_: Int, _: String) ->
|
foo { (_: Int, _: String) ->
|
||||||
_.hashCode()
|
<!UNRESOLVED_REFERENCE!>_<!>.<!UNRESOLVED_REFERENCE!>hashCode<!>()
|
||||||
}
|
}
|
||||||
|
|
||||||
foo { (_, _): A ->
|
foo { (_, _): A ->
|
||||||
_.hashCode()
|
<!UNRESOLVED_REFERENCE!>_<!>.<!UNRESOLVED_REFERENCE!>hashCode<!>()
|
||||||
}
|
}
|
||||||
|
|
||||||
foo { (`_`, _) ->
|
foo { (`_`, _) ->
|
||||||
_ checkType { <!INAPPLICABLE_CANDIDATE!>_<!><Int>() }
|
_ checkType { _<Int>() }
|
||||||
}
|
}
|
||||||
|
|
||||||
foo { (_, `_`) ->
|
foo { (_, `_`) ->
|
||||||
@@ -52,12 +52,12 @@ fun bar() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
foo { (_: String, b) ->
|
foo { (_: String, b) ->
|
||||||
_.hashCode()
|
<!UNRESOLVED_REFERENCE!>_<!>.<!UNRESOLVED_REFERENCE!>hashCode<!>()
|
||||||
b checkType { _<String>() }
|
b checkType { _<String>() }
|
||||||
}
|
}
|
||||||
|
|
||||||
foo { (_, b): B ->
|
foo { (_, b): B ->
|
||||||
_.hashCode()
|
<!UNRESOLVED_REFERENCE!>_<!>.<!UNRESOLVED_REFERENCE!>hashCode<!>()
|
||||||
b checkType { <!INAPPLICABLE_CANDIDATE!>_<!><Short>() }
|
b checkType { <!INAPPLICABLE_CANDIDATE!>_<!><Short>() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
-1
@@ -31,6 +31,5 @@ object B {
|
|||||||
fun B.test() {
|
fun B.test() {
|
||||||
val <destruct>: A = A
|
val <destruct>: A = A
|
||||||
val x: Int = (<this>, <destruct>).component1()
|
val x: Int = (<this>, <destruct>).component1()
|
||||||
val _: Int = (<this>, <destruct>).component2()
|
|
||||||
val z: Int = (<this>, <destruct>).component3()
|
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
|
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
|
$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
|
$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]
|
VAR name:z type:kotlin.Int [val]
|
||||||
CALL 'public final fun component3 (): kotlin.Int [operator] declared in <root>.B' type=kotlin.Int origin=null
|
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
|
$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>
|
var fn: Function1<A, Int>
|
||||||
field = local fun <anonymous>(<destruct>: A): Int {
|
field = local fun <anonymous>(<destruct>: A): Int {
|
||||||
val _: Int = <destruct>.component1()
|
|
||||||
val y: Int = <destruct>.component2()
|
val y: Int = <destruct>.component2()
|
||||||
return 42.plus(other = y)
|
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
|
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
|
VALUE_PARAMETER name:<destruct> index:0 type:<root>.A
|
||||||
BLOCK_BODY
|
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]
|
VAR name:y type:kotlin.Int [val]
|
||||||
CALL 'public final fun component2 (): kotlin.Int declared in <root>.A' type=kotlin.Int origin=null
|
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
|
$this: GET_VAR '<destruct>: <root>.A declared in <root>.fn.<anonymous>' type=<root>.A origin=null
|
||||||
|
|||||||
Reference in New Issue
Block a user