[FIR2IR] Set proper offsets for generated data class members

^KT-64435 Fixed
This commit is contained in:
Alexander Korepanov
2023-12-20 11:59:54 +01:00
committed by Space Team
parent 6556acabba
commit b33798d65a
5 changed files with 34 additions and 72 deletions
@@ -78,6 +78,10 @@ fun AbstractKtSourceElement?.startOffsetSkippingComments(): Int? {
}
}
internal inline fun <T : IrElement> FirElement.convertWithOffsets(defaultOffset: Int, f: (startOffset: Int, endOffset: Int) -> T): T {
return source.convertWithOffsets(defaultOffset, f)
}
internal inline fun <T : IrElement> FirElement.convertWithOffsets(f: (startOffset: Int, endOffset: Int) -> T): T {
return source.convertWithOffsets(f)
}
@@ -89,15 +93,19 @@ internal fun <T : IrElement> FirPropertyAccessor?.convertWithOffsets(
}
internal inline fun <T : IrElement> KtSourceElement?.convertWithOffsets(f: (startOffset: Int, endOffset: Int) -> T): T {
return convertWithOffsets(UNDEFINED_OFFSET, f)
}
internal inline fun <T : IrElement> 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)
@@ -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<FirDeclaration> {
@@ -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,
@@ -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),
+1 -58
View File
@@ -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 <init>
// test.kt:4 <init>
@@ -118,63 +118,6 @@ fun box() {
// test.kt:6 <init>
// 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 <init>
// test.kt:4 <init>
// test.kt:4 <init>
// test.kt:15 box
// test.kt:4 <init>
// test.kt:4 <init>
// test.kt:4 <init>
// 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 <init>
// test.kt:4 <init>
// test.kt:4 <init>
// test.kt:20 box
// test.kt:6 <init>
// test.kt:6 <init>
// test.kt:6 <init>
// test.kt:21 box
// test.kt:6 <init>
// test.kt:6 <init>
// test.kt:6 <init>
// 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 <init>
// test.kt:6 <init>
// test.kt:6 <init>
// 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)
+7
View File
@@ -23,6 +23,13 @@ fun box() {
// test.kt:14 <init>
// 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