Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@

### Updated

- `org.jetbrains.kotlin:kotlin-gradle-plugin -> 2.3.20`
- `com.javiersc.kotlin:kotlin-compiler-test-extensions -> 0.13.0+2.3.20`
- `com.javiersc.kotlin:kotlin-compiler-gradle-extensions -> 0.13.0+2.3.20`
- `com.javiersc.kotlin:kotlin-compiler-extensions -> 0.13.0+2.3.20`
- `gradle -> 9.4.0`

## [0.22.0+2.3.10] - 2026-02-07
Expand Down
4 changes: 2 additions & 2 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
[versions]
hubdle = "0.18.1"
hubdleCatalog = "0.13.0"
javiersc-kotlin-compiler-extensions = "0.12.0+2.3.10"
jetbrains-kotlin = "2.3.10"
javiersc-kotlin-compiler-extensions = "0.13.0+2.3.20"
jetbrains-kotlin = "2.3.20"

[libraries]
hubdle-catalog = { module = "com.javiersc.hubdle:hubdle-version-catalog", version.ref = "hubdleCatalog" }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,16 @@ public class KopyCompilerPluginRegistrar : CompilerPluginRegistrar() {
}
}

@JvmName("registerAllExtensionsJava")
context(extensionStorage: ExtensionStorage)
internal fun registerAllExtensions(
configuration: CompilerConfiguration,
onlyDiagnostics: Boolean,
additionalConfig: ExtensionStorage.() -> Unit = {},
) {
extensionStorage.registerAllExtensions(configuration, onlyDiagnostics, additionalConfig)
}

internal fun ExtensionStorage.registerAllExtensions(
configuration: CompilerConfiguration,
onlyDiagnostics: Boolean,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirNamedFunction
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.declarations.hasAnnotation
import org.jetbrains.kotlin.fir.declarations.primaryConstructorIfAny
import org.jetbrains.kotlin.fir.declarations.utils.isData
Expand Down Expand Up @@ -147,7 +147,7 @@ internal class FirKopyDeclarationGenerationExtension(
.apply {
addTransientAnnotationIfOwnedBySerializable(owner = owner)
replaceInitializer(
buildErrorExpression { diagnostic = KopyConeTemporalDiagnostic }
buildErrorExpression { diagnostic = KopyConeTemporalDiagnostic },
)
}
return listOf(atomicProperty.symbol)
Expand Down Expand Up @@ -226,7 +226,7 @@ internal class FirKopyDeclarationGenerationExtension(
owner: FirClassSymbol<*>,
): FirNamedFunctionSymbol? {
if (callableId.callableName != setName) return null
val setFunction: FirSimpleFunction =
val setFunction: FirNamedFunction =
createMemberFunction(
owner = owner,
key = Key,
Expand Down Expand Up @@ -258,7 +258,7 @@ internal class FirKopyDeclarationGenerationExtension(
listOfNotNull(
createAnnotation(kopyOptInClassId),
createAnnotation(kopyFunctionSetClassId),
)
),
)
}
return setFunction.symbol
Expand All @@ -270,7 +270,7 @@ internal class FirKopyDeclarationGenerationExtension(
): FirNamedFunctionSymbol? {
if (callableId.callableName != updateName) return null

val updateFunction: FirSimpleFunction =
val updateFunction: FirNamedFunction =
createMemberFunction(
owner = owner,
key = Key,
Expand Down Expand Up @@ -312,7 +312,7 @@ internal class FirKopyDeclarationGenerationExtension(
listOfNotNull(
createAnnotation(kopyOptInClassId),
createAnnotation(kopyFunctionUpdateClassId),
)
),
)
}
return updateFunction.symbol
Expand All @@ -330,7 +330,7 @@ internal class FirKopyDeclarationGenerationExtension(
val iterableType: ConeClassLikeType =
(iterableClass.toFirTypeRef().coneType as ConeClassLikeType).withArguments { it.type!! }

val updateEachFunction: FirSimpleFunction =
val updateEachFunction: FirNamedFunction =
createMemberFunction(
owner = owner,
key = Key,
Expand Down Expand Up @@ -369,7 +369,7 @@ internal class FirKopyDeclarationGenerationExtension(
listOfNotNull(
createAnnotation(kopyOptInClassId),
createAnnotation(kopyFunctionUpdateEachClassId),
)
),
)
}
return updateEachFunction.symbol
Expand All @@ -390,7 +390,7 @@ internal class FirKopyDeclarationGenerationExtension(
.substituteOrSelf(function1Type)
.withAttributes(ConeAttributes.WithExtensionFunctionType)

val copyFunction: FirSimpleFunction =
val copyFunction: FirNamedFunction =
createMemberFunction(
owner = owner,
key = Key,
Expand All @@ -414,7 +414,7 @@ internal class FirKopyDeclarationGenerationExtension(
listOfNotNull(
createAnnotation(kopyOptInClassId),
createCopyOrInvokeAnnotation(callableId),
)
),
)
}
return copyFunction.symbol
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.javiersc.kotlin.kopy.compiler.ir.transformers

import com.javiersc.kotlin.compiler.extensions.ir.declarationIrBuilder
import com.javiersc.kotlin.compiler.extensions.ir.DeclarationIrBuilder
import com.javiersc.kotlin.compiler.extensions.ir.firstIrClassSymbolOrNull
import com.javiersc.kotlin.kopy.compiler.atomicReferenceClassId
import com.javiersc.kotlin.kopy.compiler.underscoreAtomicName
import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext
Expand Down Expand Up @@ -28,34 +29,36 @@ internal class IrAtomicPropertyTransformer(
private val pluginContext: IrPluginContext,
) : IrElementTransformerVoidWithContext() {

override fun visitPropertyNew(declaration: IrProperty): IrStatement {
fun originalProp(): IrStatement = super.visitPropertyNew(declaration)
if (declaration.name != underscoreAtomicName) return originalProp()
val atomicReference: IrClassSymbol =
pluginContext.referenceClass(atomicReferenceClassId) ?: return originalProp()
override fun visitPropertyNew(declaration: IrProperty): IrStatement =
context(pluginContext) {
fun originalProp(): IrStatement = super.visitPropertyNew(declaration)
if (declaration.name != underscoreAtomicName) return originalProp()
val atomicReference: IrClassSymbol =
firstIrClassSymbolOrNull(atomicReferenceClassId) ?: return originalProp()

val atomicReferenceConstructor: IrConstructor =
atomicReference.owner.primaryConstructor ?: return originalProp()
val atomicReferenceConstructor: IrConstructor =
atomicReference.owner.primaryConstructor ?: return originalProp()

val atomicInitializer: IrExpressionBody =
pluginContext.declarationIrBuilder(declaration).run {
val parentClass: IrClass = declaration.parentAsClass
val typeArg: IrSimpleType = parentClass.defaultType
val thisReceiver: IrValueParameter = parentClass.thisReceiver!!
val thisGet: IrGetValue = irGet(thisReceiver)
val atomicReferenceConstructorCall: IrConstructorCall =
irCallConstructor(
callee = atomicReferenceConstructor.symbol,
typeArguments = listOf(typeArg),
)
.apply {
val index: Int = thisReceiver.indexInParameters.takeIf { it >= 0 } ?: 0
arguments[index] = thisGet
}
irExprBody(atomicReferenceConstructorCall)
}
declaration.backingField?.initializer = atomicInitializer
val atomicInitializer: IrExpressionBody =
DeclarationIrBuilder(declaration).run {
val parentClass: IrClass = declaration.parentAsClass
val typeArg: IrSimpleType = parentClass.defaultType
val thisReceiver: IrValueParameter = parentClass.thisReceiver!!
val thisGet: IrGetValue = irGet(thisReceiver)
val atomicReferenceConstructorCall: IrConstructorCall =
irCallConstructor(
callee = atomicReferenceConstructor.symbol,
typeArguments = listOf(typeArg),
)
.apply {
val index: Int =
thisReceiver.indexInParameters.takeIf { it >= 0 } ?: 0
arguments[index] = thisGet
}
irExprBody(atomicReferenceConstructorCall)
}
declaration.backingField?.initializer = atomicInitializer

return declaration
}
return declaration
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

package com.javiersc.kotlin.kopy.compiler.ir.transformers

import com.javiersc.kotlin.compiler.extensions.ir.DeclarationIrBuilder
import com.javiersc.kotlin.compiler.extensions.ir.asIr
import com.javiersc.kotlin.compiler.extensions.ir.declarationIrBuilder
import com.javiersc.kotlin.compiler.extensions.ir.extensionReceiver
import com.javiersc.kotlin.compiler.extensions.ir.firstIrClass
import com.javiersc.kotlin.compiler.extensions.ir.regularParameters
Expand Down Expand Up @@ -68,42 +68,45 @@
private val mapFunction: IrSimpleFunction
get() =
pluginContext
.referenceFunctions(mapCallableId)

Check warning on line 71 in kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/ir/transformers/IrFunctionsTransformer.kt

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Deprecated code should not be used.

See more on https://sonarcloud.io/project/issues?id=com.javiersc.kotlin.kopy&issues=AZz4f5kys3vzZqbPmYxB&open=AZz4f5kys3vzZqbPmYxB&pullRequest=125
.firstIsInstance<IrSimpleFunctionSymbol>()
.owner

private val listClass: IrClass = pluginContext.referenceClass(listClassId)!!.owner

Check warning on line 75 in kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/ir/transformers/IrFunctionsTransformer.kt

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Deprecated code should not be used.

See more on https://sonarcloud.io/project/issues?id=com.javiersc.kotlin.kopy&issues=AZz4f5kys3vzZqbPmYxA&open=AZz4f5kys3vzZqbPmYxA&pullRequest=125

override fun visitSimpleFunction(declaration: IrSimpleFunction): IrStatement {
fun originalFunction(): IrStatement = super.visitSimpleFunction(declaration)
return when {
declaration.isKopyCopyOrInvoke -> transformCopyOrInvokeFunction(declaration)
declaration.isKopySet -> transformSetFunction(declaration)
declaration.isKopyUpdate -> transformUpdateFunction(declaration)
declaration.isKopyUpdateEach -> transformUpdateEachFunction(declaration)
runCatching { declaration.parentAsClass }.isFailure -> originalFunction()
!declaration.parentAsClass.isData -> originalFunction()
else -> originalFunction()
return context(pluginContext) {
when {
declaration.isKopyCopyOrInvoke -> transformCopyOrInvokeFunction(declaration)
declaration.isKopySet -> transformSetFunction(declaration)
declaration.isKopyUpdate -> transformUpdateFunction(declaration)
declaration.isKopyUpdateEach -> transformUpdateEachFunction(declaration)
runCatching { declaration.parentAsClass }.isFailure -> originalFunction()
!declaration.parentAsClass.isData -> originalFunction()
else -> originalFunction()
}
}
}

context(context: IrPluginContext)
private fun transformCopyOrInvokeFunction(declaration: IrSimpleFunction): IrSimpleFunction {
declaration.body =
pluginContext.declarationIrBuilder(declaration.symbol).irBlockBody {
DeclarationIrBuilder(declaration.symbol).irBlockBody {
val thisCopyIrVariable: IrVariable = thisCopyIrVariable(declaration)
+copyCall(declaration, thisCopyIrVariable)
+atomicValueIrReturn(declaration, thisCopyIrVariable)
}
return declaration
}

context(context: IrPluginContext)
private fun transformSetFunction(declaration: IrSimpleFunction): IrSimpleFunction {
val function: IrSimpleFunction =
declaration.apply {
body =
pluginContext.declarationIrBuilder(declaration.symbol).irBlockBody {
val unitClass: IrClassSymbol =
pluginContext.irBuiltIns.unitClass.owner.symbol
DeclarationIrBuilder(declaration.symbol).irBlockBody {
val unitClass: IrClassSymbol = context.irBuiltIns.unitClass.owner.symbol
val unitCall: IrGetObjectValue = irGetObject(unitClass)
val irReturn: IrReturn = irReturn(unitCall)
+irReturn
Expand All @@ -112,11 +115,12 @@
return function
}

context(context: IrPluginContext)
private fun transformUpdateFunction(declaration: IrSimpleFunction): IrSimpleFunction {
val function: IrSimpleFunction =
declaration.apply {
body =
pluginContext.declarationIrBuilder(declaration.symbol).irBlockBody {
DeclarationIrBuilder(declaration.symbol).irBlockBody {
val thisGet: IrGetValue = irGet(extensionReceiver!!)
val transformValueParameter: IrValueParameter = regularParameters.first()
val func1Invoke: IrSimpleFunction =
Expand Down Expand Up @@ -148,11 +152,12 @@
return function
}

context(context: IrPluginContext)
private fun transformUpdateEachFunction(declaration: IrSimpleFunction): IrSimpleFunction {
val function: IrSimpleFunction =
declaration.apply {
body =
pluginContext.declarationIrBuilder(declaration.symbol).irBlockBody {
DeclarationIrBuilder(declaration.symbol).irBlockBody {
val thisGet: IrGetValue = irGet(extensionReceiver!!)
val transformValueParameter: IrValueParameter = regularParameters.first()
val transformParameterIndex: Int =
Expand Down Expand Up @@ -220,11 +225,12 @@
return copyCall
}

context(context: IrPluginContext)
private fun atomicValueIrReturn(
declaration: IrSimpleFunction,
thisCopyIrVariable: IrVariable,
): IrReturn =
pluginContext.declarationIrBuilder(declaration.symbol).run {
DeclarationIrBuilder(declaration.symbol).run {
val thisCopyGetValue: IrGetValue = irGet(thisCopyIrVariable)
val atomicProperty: IrProperty? =
declaration.parent.asIr<IrClass>().findDeclaration<IrProperty> {
Expand All @@ -234,7 +240,7 @@
val getAtomicCall =
irCall(atomicProperty!!.getter!!).apply { dispatchReceiver = thisCopyGetValue }

val atomicReferenceClass: IrClass = pluginContext.firstIrClass(atomicReferenceClassId)
val atomicReferenceClass: IrClass = firstIrClass(atomicReferenceClassId)

val atomicReferenceLoadFunction: IrFunction =
atomicReferenceClass.findDeclaration<IrFunction> { it.name == loadName }!!
Expand Down
Loading
Loading