[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),