[FIR] KT-55666: Support labels to local functions
^KT-55666 Fixed
diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java
index 40fcf27..f660d12 100644
--- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java
+++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java
@@ -508,6 +508,12 @@
}
@Test
+ @TestMetadata("kt55666.kt")
+ public void testKt55666() throws Exception {
+ runTest("compiler/testData/diagnostics/tests/kt55666.kt");
+ }
+
+ @Test
@TestMetadata("kt55733.kt")
public void testKt55733() throws Exception {
runTest("compiler/testData/diagnostics/tests/kt55733.kt");
diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java
index 4fd3733..8299dca 100644
--- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java
+++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java
@@ -508,6 +508,12 @@
}
@Test
+ @TestMetadata("kt55666.kt")
+ public void testKt55666() throws Exception {
+ runTest("compiler/testData/diagnostics/tests/kt55666.kt");
+ }
+
+ @Test
@TestMetadata("kt55733.kt")
public void testKt55733() throws Exception {
runTest("compiler/testData/diagnostics/tests/kt55733.kt");
diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java
index b5ac344..f0ffe45 100644
--- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java
+++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java
@@ -508,6 +508,12 @@
}
@Test
+ @TestMetadata("kt55666.kt")
+ public void testKt55666() throws Exception {
+ runTest("compiler/testData/diagnostics/tests/kt55666.kt");
+ }
+
+ @Test
@TestMetadata("kt55733.kt")
public void testKt55733() throws Exception {
runTest("compiler/testData/diagnostics/tests/kt55733.kt");
diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt
index 863d838..b506970 100644
--- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt
+++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt
@@ -1676,7 +1676,7 @@
}
} else {
val functionName = identifier.nameAsSafeName()
- val labelName = runIf(!functionName.isSpecial) { functionName.identifier }
+ val labelName = context.getLastLabel(functionDeclaration)?.name ?: runIf(!functionName.isSpecial) { functionName.identifier }
target = FirFunctionTarget(labelName, isLambda = false)
functionSymbol = FirNamedFunctionSymbol(callableIdForName(functionName))
FirSimpleFunctionBuilder().apply {
diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt
index fd81b57..4ed44fb 100644
--- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt
+++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt
@@ -1435,7 +1435,7 @@
FirSimpleFunctionBuilder().apply {
receiverParameter = receiverType?.convertToReceiverParameter()
name = function.nameAsSafeName
- labelName = runIf(!name.isSpecial) { name.identifier }
+ labelName = context.getLastLabel(function)?.name ?: runIf(!name.isSpecial) { name.identifier }
symbol = FirNamedFunctionSymbol(callableIdForName(function.nameAsSafeName)).also { functionSymbol = it }
dispatchReceiverType = currentDispatchReceiverType()
status = FirDeclarationStatusImpl(
diff --git a/compiler/testData/diagnostics/tests/kt55666.kt b/compiler/testData/diagnostics/tests/kt55666.kt
new file mode 100644
index 0000000..1a817f3
--- /dev/null
+++ b/compiler/testData/diagnostics/tests/kt55666.kt
@@ -0,0 +1,19 @@
+// FIR_IDENTICAL
+
+inline fun l2f1(p: () -> Unit) {}
+
+fun label2simple1() {
+ l2f1 { return@label2simple1 }
+
+ fun local() {
+ l2f1 { return@local }
+ }
+
+ labelLocal@ fun labelledLocal() {
+ l2f1 { return@labelLocal }
+ }
+}
+
+fun main() {
+ label2simple1()
+}
diff --git a/compiler/testData/diagnostics/tests/kt55666.txt b/compiler/testData/diagnostics/tests/kt55666.txt
new file mode 100644
index 0000000..2b4902b
--- /dev/null
+++ b/compiler/testData/diagnostics/tests/kt55666.txt
@@ -0,0 +1,5 @@
+package
+
+public inline fun l2f1(/*0*/ p: () -> kotlin.Unit): kotlin.Unit
+public fun label2simple1(): kotlin.Unit
+public fun main(): kotlin.Unit
diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java
index 84b681d..a522fdc 100644
--- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java
+++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java
@@ -508,6 +508,12 @@
}
@Test
+ @TestMetadata("kt55666.kt")
+ public void testKt55666() throws Exception {
+ runTest("compiler/testData/diagnostics/tests/kt55666.kt");
+ }
+
+ @Test
@TestMetadata("kt55733.kt")
public void testKt55733() throws Exception {
runTest("compiler/testData/diagnostics/tests/kt55733.kt");