Skip to content

Commit

Permalink
Remove various impl APIs (#694)
Browse files Browse the repository at this point in the history
  • Loading branch information
ZacSweers authored Dec 1, 2024
1 parent 4eaccb9 commit 0f0b8a8
Show file tree
Hide file tree
Showing 7 changed files with 208 additions and 281 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ Changelog
**Unreleased**
--------------

- Remove most IR internal/impl API usages.

0.29.0
------

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,12 @@ import dev.zacsweers.moshix.ir.compiler.api.FromJsonComponent.ParameterProperty
import dev.zacsweers.moshix.ir.compiler.api.FromJsonComponent.PropertyOnly
import dev.zacsweers.moshix.ir.compiler.util.NameAllocator
import dev.zacsweers.moshix.ir.compiler.util.addOverride
import dev.zacsweers.moshix.ir.compiler.util.buildBlockBody
import dev.zacsweers.moshix.ir.compiler.util.createIrBuilder
import dev.zacsweers.moshix.ir.compiler.util.defaultPrimitiveValue
import dev.zacsweers.moshix.ir.compiler.util.generateToStringFun
import dev.zacsweers.moshix.ir.compiler.util.irAnd
import dev.zacsweers.moshix.ir.compiler.util.irBinOp
import dev.zacsweers.moshix.ir.compiler.util.irConstructorBody
import dev.zacsweers.moshix.ir.compiler.util.irInstanceInitializerCall
import dev.zacsweers.moshix.ir.compiler.util.irType
import dev.zacsweers.moshix.ir.compiler.util.joinToIrAnd
import dev.zacsweers.moshix.ir.compiler.util.rawType
Expand All @@ -41,7 +40,6 @@ import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.builders.IrBuilderWithScope
import org.jetbrains.kotlin.ir.builders.declarations.addConstructor
import org.jetbrains.kotlin.ir.builders.declarations.addField
import org.jetbrains.kotlin.ir.builders.declarations.addTypeParameter
import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter
Expand All @@ -53,7 +51,6 @@ import org.jetbrains.kotlin.ir.builders.irBoolean
import org.jetbrains.kotlin.ir.builders.irBranch
import org.jetbrains.kotlin.ir.builders.irCall
import org.jetbrains.kotlin.ir.builders.irConcat
import org.jetbrains.kotlin.ir.builders.irDelegatingConstructorCall
import org.jetbrains.kotlin.ir.builders.irElseBranch
import org.jetbrains.kotlin.ir.builders.irEquals
import org.jetbrains.kotlin.ir.builders.irEqualsNull
Expand Down Expand Up @@ -81,24 +78,23 @@ import org.jetbrains.kotlin.ir.declarations.IrField
import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
import org.jetbrains.kotlin.ir.declarations.IrVariable
import org.jetbrains.kotlin.ir.expressions.IrDelegatingConstructorCall
import org.jetbrains.kotlin.ir.expressions.addArgument
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
import org.jetbrains.kotlin.ir.symbols.UnsafeDuringIrConstructionAPI
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.IrTypeArgument
import org.jetbrains.kotlin.ir.types.classifierOrFail
import org.jetbrains.kotlin.ir.types.createType
import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
import org.jetbrains.kotlin.ir.types.makeNotNull
import org.jetbrains.kotlin.ir.types.typeWith
import org.jetbrains.kotlin.ir.util.addSimpleDelegatingConstructor
import org.jetbrains.kotlin.ir.util.constructors
import org.jetbrains.kotlin.ir.util.deepCopyWithoutPatchingParents
import org.jetbrains.kotlin.ir.util.defaultType
import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
import org.jetbrains.kotlin.ir.util.getPropertyGetter
import org.jetbrains.kotlin.ir.util.getSimpleFunction
import org.jetbrains.kotlin.ir.util.packageFqName
import org.jetbrains.kotlin.ir.util.statements
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
Expand Down Expand Up @@ -172,13 +168,7 @@ internal class MoshiAdapterGenerator(
val adapterReceiver =
buildValueParameter(adapterCls) {
name = Name.special("<this>")
type =
IrSimpleTypeImpl(
classifier = adapterCls.symbol,
hasQuestionMark = false,
arguments = emptyList(),
annotations = emptyList(),
)
type = adapterCls.typeWith()
origin = IrDeclarationOrigin.INSTANCE_RECEIVER
}
adapterCls.thisReceiver = adapterReceiver
Expand Down Expand Up @@ -212,14 +202,16 @@ internal class MoshiAdapterGenerator(
return adapterCls
}

@OptIn(UnsafeDuringIrConstructionAPI::class)
private fun IrClass.generateConstructor(isGeneric: Boolean): IrConstructor {
val adapterCls = this
val ctor =
adapterCls
.addConstructor {
isPrimary = true
returnType = adapterCls.defaultType
}
.addSimpleDelegatingConstructor(
moshiSymbols.jsonAdapter.constructors.single().owner,
pluginContext.irBuiltIns,
isPrimary = true,
)
.apply {
addValueParameter {
name = Name.identifier("moshi")
Expand All @@ -234,55 +226,54 @@ internal class MoshiAdapterGenerator(
)
}
}
}
ctor.irConstructorBody(pluginContext) { statements ->
statements += generateJsonAdapterSuperConstructorCall()
statements +=
irInstanceInitializerCall(context = pluginContext, classSymbol = adapterCls.symbol)

// Size check for types array. Must be equal to the number of type parameters
// require(types.size == 1) {
// "TypeVariable mismatch: Expecting 1 type(s) for generic type variables [T], but received
// ${types.size} with values $types"
// }
if (isGeneric) {
val expectedSize = typeVariables.size
statements +=
DeclarationIrBuilder(pluginContext, ctor.symbol).irBlock {
val receivedSize =
irTemporary(
irCall(moshiSymbols.arraySizeGetter).apply {
dispatchReceiver = irGet(ctor.valueParameters[1])
},
nameHint = "receivedSize",
)
+irIfThen(
condition = irNotEquals(irGet(receivedSize), irInt(expectedSize)),
thenPart =
irThrow(
irCall(pluginContext.irBuiltIns.illegalArgumentExceptionSymbol).apply {
putValueArgument(
0,
irConcat().apply {
addArgument(irString("TypeVariable mismatch: Expecting "))
addArgument(irInt(expectedSize))
val typeWord = if (expectedSize == 1) "type" else "types"
addArgument(irString(" $typeWord for generic type variables ["))
addArgument(
irString(
typeVariables.joinToString(separator = ", ") { it.name.asString() }

// Replace the body with a new one that adds the size check
val originalBody = checkNotNull(body)
buildBlockBody(pluginContext) {
+originalBody.statements

// Size check for types array. Must be equal to the number of type parameters
// require(types.size == 1) {
// "TypeVariable mismatch: Expecting 1 type(s) for generic type variables [T], but
// received
// ${types.size} with values $types"
// }
if (isGeneric) {
val expectedSize = typeVariables.size
val receivedSize =
irTemporary(
irCall(moshiSymbols.arraySizeGetter).apply {
dispatchReceiver = irGet(valueParameters[1])
},
nameHint = "receivedSize",
)
+irIfThen(
condition = irNotEquals(irGet(receivedSize), irInt(expectedSize)),
thenPart =
irThrow(
irCall(pluginContext.irBuiltIns.illegalArgumentExceptionSymbol).apply {
putValueArgument(
0,
irConcat().apply {
addArgument(irString("TypeVariable mismatch: Expecting "))
addArgument(irInt(expectedSize))
val typeWord = if (expectedSize == 1) "type" else "types"
addArgument(irString(" $typeWord for generic type variables ["))
addArgument(
irString(
typeVariables.joinToString(separator = ", ") { it.name.asString() }
)
)
)
addArgument(irString("], but received "))
addArgument(irGet(receivedSize))
},
)
}
),
)
addArgument(irString("], but received "))
addArgument(irGet(receivedSize))
},
)
}
),
)
}
}
}
}
}

return ctor
}
Expand Down Expand Up @@ -877,12 +868,6 @@ internal class MoshiAdapterGenerator(
putValueArgument(++lastIndex, irNull())
}
}

@OptIn(UnsafeDuringIrConstructionAPI::class)
private fun IrBuilderWithScope.generateJsonAdapterSuperConstructorCall():
IrDelegatingConstructorCall {
return irDelegatingConstructorCall(moshiSymbols.jsonAdapter.constructors.single().owner)
}
}

private interface PropertyComponent {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,4 @@ package dev.zacsweers.moshix.ir.compiler.api
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOriginImpl

internal val MoshiOrigin: IrDeclarationOrigin =
IrDeclarationOriginImpl("GENERATED_MOSHI_ADAPTER_CLASS")
internal val MoshiOrigin: IrDeclarationOrigin by IrDeclarationOriginImpl
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,4 @@ package dev.zacsweers.moshix.ir.compiler.sealed
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOriginImpl

internal val MoshiSealedOrigin: IrDeclarationOrigin =
IrDeclarationOriginImpl("GENERATED_MOSHI_SEALED_ADAPTER_CLASS")
internal val MoshiSealedOrigin: IrDeclarationOrigin by IrDeclarationOriginImpl
Loading

0 comments on commit 0f0b8a8

Please sign in to comment.