[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),
|
||||
|
||||
Reference in New Issue
Block a user