diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt index 789d30bbac6..bce82b01bed 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt @@ -78,6 +78,10 @@ fun AbstractKtSourceElement?.startOffsetSkippingComments(): Int? { } } +internal inline fun FirElement.convertWithOffsets(defaultOffset: Int, f: (startOffset: Int, endOffset: Int) -> T): T { + return source.convertWithOffsets(defaultOffset, f) +} + internal inline fun FirElement.convertWithOffsets(f: (startOffset: Int, endOffset: Int) -> T): T { return source.convertWithOffsets(f) } @@ -89,15 +93,19 @@ internal fun FirPropertyAccessor?.convertWithOffsets( } internal inline fun KtSourceElement?.convertWithOffsets(f: (startOffset: Int, endOffset: Int) -> T): T { + return convertWithOffsets(UNDEFINED_OFFSET, f) +} + +internal inline fun KtSourceElement?.convertWithOffsets(defaultOffset: Int, f: (startOffset: Int, endOffset: Int) -> T): T { val startOffset: Int val endOffset: Int if (isCompiledElement(psi) || this?.kind == KtFakeSourceElementKind.DataClassGeneratedMembers) { - startOffset = UNDEFINED_OFFSET - endOffset = UNDEFINED_OFFSET + startOffset = defaultOffset + endOffset = defaultOffset } else { - startOffset = this?.startOffsetSkippingComments() ?: this?.startOffset ?: UNDEFINED_OFFSET - endOffset = this?.endOffset ?: UNDEFINED_OFFSET + startOffset = this?.startOffsetSkippingComments() ?: this?.startOffset ?: defaultOffset + endOffset = this?.endOffset ?: defaultOffset } return f(startOffset, endOffset) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DataClassMembersGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DataClassMembersGenerator.kt index 8bdee57aba5..ba15075b00c 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DataClassMembersGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DataClassMembersGenerator.kt @@ -21,7 +21,6 @@ import org.jetbrains.kotlin.fir.scopes.getProperties import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.types.* -import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.builders.IrGeneratorContextBase import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression @@ -193,8 +192,8 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) : Fir2IrCompon irFunction.declareThisReceiverParameter( irClass.defaultType, IrDeclarationOrigin.DEFINED, - UNDEFINED_OFFSET, - UNDEFINED_OFFSET + SYNTHETIC_OFFSET, + SYNTHETIC_OFFSET ) fun generateHeaders(): List { @@ -313,8 +312,8 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) : Fir2IrCompon val signature = if (klass.symbol.classId.isLocal) null else components.signatureComposer.composeSignature(syntheticCounterpart) val symbol = components.declarationStorage.createFunctionSymbol(signature) return components.irFactory.createSimpleFunction( - startOffset = UNDEFINED_OFFSET, - endOffset = UNDEFINED_OFFSET, + startOffset = SYNTHETIC_OFFSET, + endOffset = SYNTHETIC_OFFSET, origin = origin, name = name, visibility = DescriptorVisibilities.PUBLIC, @@ -351,8 +350,8 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) : Fir2IrCompon private fun createSyntheticIrParameter(irFunction: IrFunction, name: Name, type: IrType, index: Int = 0): IrValueParameter = components.irFactory.createValueParameter( - startOffset = UNDEFINED_OFFSET, - endOffset = UNDEFINED_OFFSET, + startOffset = SYNTHETIC_OFFSET, + endOffset = SYNTHETIC_OFFSET, origin = IrDeclarationOrigin.DEFINED, name = name, type = type, diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/Fir2IrCallableDeclarationsGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/Fir2IrCallableDeclarationsGenerator.kt index a919f75306b..6be2fa904fd 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/Fir2IrCallableDeclarationsGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/Fir2IrCallableDeclarationsGenerator.kt @@ -111,11 +111,16 @@ class Fir2IrCallableDeclarationsGenerator(val components: Fir2IrComponents) : Fi @Suppress("USELESS_CAST") // K2 warning suppression, TODO: KT-62472 if (isLambda) ((function as FirAnonymousFunction).typeRef as? FirResolvedTypeRef)?.type?.isSuspendOrKSuspendFunctionType(session) == true else function.isSuspend - val created = function.convertWithOffsets { startOffset, endOffset -> + val defaultOffset = when { + function.origin == FirDeclarationOrigin.Synthetic.DataClassMember -> SYNTHETIC_OFFSET + updatedOrigin == IrDeclarationOrigin.DELEGATED_MEMBER -> SYNTHETIC_OFFSET + else -> UNDEFINED_OFFSET + } + val created = function.convertWithOffsets(defaultOffset) { startOffset, endOffset -> classifierStorage.preCacheTypeParameters(function, symbol) irFactory.createSimpleFunction( - startOffset = if (updatedOrigin == IrDeclarationOrigin.DELEGATED_MEMBER) SYNTHETIC_OFFSET else startOffset, - endOffset = if (updatedOrigin == IrDeclarationOrigin.DELEGATED_MEMBER) SYNTHETIC_OFFSET else endOffset, + startOffset = startOffset, + endOffset = endOffset, origin = updatedOrigin, name = name, visibility = components.visibilityConverter.convertToDescriptorVisibility(visibility), diff --git a/compiler/testData/debug/stepping/dataClass.kt b/compiler/testData/debug/stepping/dataClass.kt index 7a4586fc0e1..861710bd054 100644 --- a/compiler/testData/debug/stepping/dataClass.kt +++ b/compiler/testData/debug/stepping/dataClass.kt @@ -61,7 +61,7 @@ fun box() { // test.kt:25 box // test.kt:26 box -// EXPECTATIONS ClassicFrontend JS_IR +// EXPECTATIONS JS_IR // test.kt:14 box // test.kt:4 // test.kt:4 @@ -118,63 +118,6 @@ fun box() { // test.kt:6 // test.kt:26 box -// EXPECTATIONS FIR JS_IR // TODO: There is an inconsistency in names between K1 and K2. This should be fixed in KT-64435. -// test.kt:14 box -// test.kt:4 -// test.kt:4 -// test.kt:4 -// test.kt:15 box -// test.kt:4 -// test.kt:4 -// test.kt:4 -// test.kt:15 box -// test.kt:1 protoOf.equals -// test.kt:1 protoOf.equals -// test.kt:1 protoOf.equals -// test.kt:1 protoOf.equals -// test.kt:1 protoOf.equals -// test.kt:1 protoOf.equals -// test.kt:16 box -// test.kt:1 protoOf.hashCode -// test.kt:1 protoOf.hashCode -// test.kt:17 box -// test.kt:1 protoOf.toString -// test.kt:18 box -// test.kt:1 protoOf.component1_7eebsc_k$ -// test.kt:18 box -// test.kt:1 protoOf.component2_7eebsb_k$ -// test.kt:19 box -// test.kt:1 protoOf.copy$default_8mg6yi_k$ -// test.kt:1 protoOf.copy$default_8mg6yi_k$ -// test.kt:1 protoOf.copy_xhhsuv_k$ -// test.kt:4 -// test.kt:4 -// test.kt:4 -// test.kt:20 box -// test.kt:6 -// test.kt:6 -// test.kt:6 -// test.kt:21 box -// test.kt:6 -// test.kt:6 -// test.kt:6 -// test.kt:21 box -// test.kt:8 equals -// test.kt:22 box -// test.kt:9 hashCode -// test.kt:23 box -// test.kt:7 toString -// test.kt:24 box -// test.kt:1 protoOf.component1_7eebsc_k$ -// test.kt:24 box -// test.kt:1 protoOf.component2_7eebsb_k$ -// test.kt:25 box -// test.kt:10 copy -// test.kt:6 -// test.kt:6 -// test.kt:6 -// test.kt:26 box - // EXPECTATIONS WASM // test.kt:14 $box (12, 14, 18, 18, 18, 18, 12) // String.kt:141 $kotlin.stringLiteral (17, 28, 17, 17, 28, 17, 17, 28, 17, 17, 28, 17, 17, 28, 17, 17, 28, 17, 17, 28, 17, 17, 28, 17, 17, 28, 17, 17, 28, 17, 17, 28, 17, 17, 28, 17, 17, 28, 17) diff --git a/compiler/testData/debug/stepping/delegation.kt b/compiler/testData/debug/stepping/delegation.kt index b7f0fad4daf..471fc3a71bb 100644 --- a/compiler/testData/debug/stepping/delegation.kt +++ b/compiler/testData/debug/stepping/delegation.kt @@ -23,6 +23,13 @@ fun box() { // test.kt:14 // test.kt:17 box // test.kt:18 box +// EXPECTATIONS FIR JVM_IR +// test.kt:14 f +// test.kt:10 f +// test.kt:11 f +// test.kt:14 f +// test.kt:19 box +// EXPECTATIONS ClassicFrontend JVM_IR // test.kt:11 f // test.kt:-1 f // test.kt:19 box