From ee7e6b0fce1dfeff0fa37c6bafc2a02a53dbe9f9 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Mon, 7 Aug 2023 22:08:43 +0900 Subject: [PATCH] [LL API] Ignore local functions in 'CodeFragmentDeclarationCollector' In the old JVM backend, local functions were compiled as JVM classes, so there were an instance to pass around. Today, they are compiled to static functions in the containing class/facade, and calls to them compile natively. --- .../analysis/api/compile/CodeFragmentCapturedValue.kt | 6 ------ .../capturing/localFunction.capturing.txt | 3 --- .../codeFragments/capturing/localFunction.ir.txt | 11 ++++++----- .../codeFragments/capturing/localFunction.txt | 2 +- .../fir/compile/CodeFragmentCapturedValueAnalyzer.kt | 8 -------- 5 files changed, 7 insertions(+), 23 deletions(-) diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/compile/CodeFragmentCapturedValue.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/compile/CodeFragmentCapturedValue.kt index d8617561cdf..50241d895cc 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/compile/CodeFragmentCapturedValue.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/compile/CodeFragmentCapturedValue.kt @@ -85,12 +85,6 @@ public sealed class CodeFragmentCapturedValue( get() = "this@$name" } - /** Represents a captured named local function. */ - public class LocalFunction( - name: Name, - isCrossingInlineBounds: Boolean, - ) : CodeFragmentCapturedValue(name.asString(), isMutated = false, isCrossingInlineBounds) - /** Represents an externally provided value. */ public class ForeignValue( name: Name, diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/localFunction.capturing.txt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/localFunction.capturing.txt index 3d1f7671d8d..8f6923a8842 100644 --- a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/localFunction.capturing.txt +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/localFunction.capturing.txt @@ -1,6 +1,3 @@ -LocalFunction[name: call; isMutated: false; displayText: call] - fun call(a: R|kotlin/Int|, b: R|kotlin/String|): R|kotlin/Unit| - R|(kotlin/Int, kotlin/String) -> kotlin/Unit| Local[name: x; isMutated: false; displayText: x] lval x: R|kotlin/Int| R|kotlin/Int| diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/localFunction.ir.txt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/localFunction.ir.txt index 8fbb48011c4..e6ecff33f07 100644 --- a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/localFunction.ir.txt +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/localFunction.ir.txt @@ -22,10 +22,11 @@ MODULE_FRAGMENT name: CONSTRUCTOR visibility:public <> () returnType:.CodeFragment [primary] BLOCK_BODY DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' - FUN name:run visibility:public modality:FINAL <> (p0:kotlin.Function2, p1:kotlin.Int, p2:kotlin.String) returnType:kotlin.Unit - VALUE_PARAMETER name:p0 index:0 type:kotlin.Function2 - VALUE_PARAMETER name:p1 index:1 type:kotlin.Int - VALUE_PARAMETER name:p2 index:2 type:kotlin.String + FUN name:run visibility:public modality:FINAL <> (p0:kotlin.Int, p1:kotlin.String) returnType:kotlin.Unit + VALUE_PARAMETER name:p0 index:0 type:kotlin.Int + VALUE_PARAMETER name:p1 index:1 type:kotlin.String EXPRESSION_BODY BLOCK type=kotlin.Unit origin=null - GET_VAR 'p0: kotlin.Function2 declared in .CodeFragment.run' type=kotlin.Function2 origin=null + CALL 'local final fun call (a: kotlin.Int, b: kotlin.String): kotlin.Unit declared in .test' type=kotlin.Unit origin=null + a: GET_VAR 'p0: kotlin.Int declared in .CodeFragment.run' type=kotlin.Int origin=null + b: GET_VAR 'p1: kotlin.String declared in .CodeFragment.run' type=kotlin.String origin=null diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/localFunction.txt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/localFunction.txt index 23fe40979b5..79040982afb 100644 --- a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/localFunction.txt +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/localFunction.txt @@ -1,7 +1,7 @@ public final class CodeFragment { // source: 'fragment.kt' public method (): void - public final static method run(p0: kotlin.jvm.functions.Function2, p1: int, p2: java.lang.String): void + public final static method run(p0: int, p1: java.lang.String): void } public final class LocalFunctionKt \ No newline at end of file diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/compile/CodeFragmentCapturedValueAnalyzer.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/compile/CodeFragmentCapturedValueAnalyzer.kt index 5a8cebd8e16..71836cc3a80 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/compile/CodeFragmentCapturedValueAnalyzer.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/compile/CodeFragmentCapturedValueAnalyzer.kt @@ -27,14 +27,12 @@ import org.jetbrains.kotlin.fir.labelName import org.jetbrains.kotlin.fir.references.FirSuperReference import org.jetbrains.kotlin.fir.references.FirThisReference import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol -import org.jetbrains.kotlin.fir.resolve.constructFunctionType import org.jetbrains.kotlin.fir.resolve.defaultType import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef -import org.jetbrains.kotlin.fir.types.specialFunctionTypeKind import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitorVoid import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.psi @@ -195,12 +193,6 @@ private class CodeFragmentCapturedValueVisitor( } is FirNamedFunctionSymbol -> { if (symbol.isLocal) { - val isCrossingInlineBounds = isCrossingInlineBounds(element, symbol) - val capturedValue = CodeFragmentCapturedValue.LocalFunction(symbol.name, isCrossingInlineBounds) - val firFunction = symbol.fir - val functionType = firFunction.constructFunctionType(firFunction.specialFunctionTypeKind(session)) - val typeRef = buildResolvedTypeRef { type = functionType } - register(symbol, CodeFragmentCapturedSymbol(capturedValue, symbol, typeRef)) registerFile(symbol) } }