[FIR2IR] Set proper offsets for generated data class members
^KT-64435 Fixed
This commit is contained in:
committed by
Space Team
parent
6556acabba
commit
b33798d65a
@@ -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)
|
||||
|
||||
+6
-7
@@ -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,
|
||||
|
||||
+8
-3
@@ -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
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user