Skip to content

Commit

Permalink
Cleanup annotation processor and codegen
Browse files Browse the repository at this point in the history
  • Loading branch information
geoff-powell committed Jan 8, 2025
1 parent c2dcc8a commit 009c737
Show file tree
Hide file tree
Showing 5 changed files with 253 additions and 156 deletions.

This file was deleted.

1 change: 1 addition & 0 deletions paparazzi-gradle-plugin/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ dependencies {
compileOnly libs.plugin.android

implementation platform(libs.kotlin.bom)
implementation libs.plugin.ksp
implementation(libs.tools.sdkCommon) {
because "SymbolUtils.getPackageNameFromManifest removed in AGP 7.0. Replace?"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ internal class PaparazziPoet(
preview: PreviewModel,
previewParam: KSValueParameter
) {
addStatement("%L.PaparazziPreviewData.Provider(", PACKAGE_NAME)
addStatement("%L.PaparazziPreviewData.Provider(", PREVIEW_RUNTIME_PACKAGE_NAME)
indent()
addStatement("snapshotName = %S,", snapshotName)
addStatement("composable = { %L(it) },", function.qualifiedName?.asString())
Expand All @@ -123,7 +123,7 @@ internal class PaparazziPoet(
}

private fun CodeBlock.Builder.addPreviewData(preview: PreviewModel) {
addStatement("preview = %L.PreviewData(", PACKAGE_NAME)
addStatement("preview = %L.PreviewData(", PREVIEW_RUNTIME_PACKAGE_NAME)
indent()

preview.fontScale.takeIf { it != 1f }
Expand Down Expand Up @@ -152,7 +152,7 @@ internal class PaparazziPoet(
}

private fun CodeBlock.Builder.addPreviewParameterData(previewParam: KSValueParameter) {
addStatement("previewParameter = %L.PreviewParameterData(", PACKAGE_NAME)
addStatement("previewParameter = %L.PreviewParameterData(", PREVIEW_RUNTIME_PACKAGE_NAME)
indent()
addStatement("name = %S,", previewParam.name?.asString())
val previewParamProvider = previewParam.previewParamProvider()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.tschuchort.compiletesting.kspAllWarningsAsErrors
import com.tschuchort.compiletesting.kspArgs
import com.tschuchort.compiletesting.kspIncremental
import com.tschuchort.compiletesting.symbolProcessorProviders
import org.jetbrains.kotlin.cli.common.collectSources
import org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi
import org.junit.Rule
import org.junit.Test
Expand Down Expand Up @@ -84,7 +85,7 @@ class PreviewProcessorProviderTest {
app.cash.paparazzi.preview.runtime.PaparazziPreviewData.Default(
snapshotName = "SamplePreview_SamplePreview",
composable = { test.SamplePreview() },
preview = app.cash.paparazzi.annotations.PreviewData(
preview = app.cash.paparazzi.preview.runtime.PreviewData(
),
),
)
Expand Down Expand Up @@ -154,15 +155,15 @@ class PreviewProcessorProviderTest {
"""
package test
internal val paparazziPreviews = listOf<app.cash.paparazzi.annotations.PaparazziPreviewData>(
app.cash.paparazzi.annotations.PaparazziPreviewData.Provider(
internal val paparazziPreviews = listOf<app.cash.paparazzi.preview.runtime.PaparazziPreviewData>(
app.cash.paparazzi.preview.runtime.PaparazziPreviewData.Provider(
snapshotName = "SamplePreview_SamplePreview",
composable = { test.SamplePreview(it) },
previewParameter = app.cash.paparazzi.annotations.PreviewParameterData(
previewParameter = app.cash.paparazzi.preview.runtime.PreviewParameterData(
name = "text",
values = test.SamplePreviewParameter.values,
),
preview = app.cash.paparazzi.annotations.PreviewData(
preview = app.cash.paparazzi.preview.runtime.PreviewData(
),
),
)
Expand Down Expand Up @@ -206,13 +207,13 @@ class PreviewProcessorProviderTest {
app.cash.paparazzi.preview.runtime.PaparazziPreviewData.Default(
snapshotName = "SamplePreview_SamplePreview",
composable = { test.SamplePreview() },
preview = app.cash.paparazzi.annotations.PreviewData(
preview = app.cash.paparazzi.preview.runtime.PreviewData(
),
),
app.cash.paparazzi.preview.runtime.PaparazziPreviewData.Default(
snapshotName = "SamplePreview_SamplePreview",
composable = { test.SamplePreview() },
preview = app.cash.paparazzi.annotations.PreviewData(
preview = app.cash.paparazzi.preview.runtime.PreviewData(
device = "id:pixel_4",
uiMode = 32,
),
Expand Down Expand Up @@ -324,10 +325,113 @@ class PreviewProcessorProviderTest {
import androidx.compose.runtime.Composable
data class PaparazziPreviewData(
val snapshotName: String,
val composable: @Composable () -> Unit
public object PaparazziPreviewDefaults {
public const val DEVICE_ID: String = "id:pixel_5"
}
/**
* Represents composables annotated with @Paparazzi annotation
*
* Default - Represents a composable with no parameters
* Provider - Represents a composable with parameters using @PreviewParameter
*/
sealed interface PaparazziPreviewData {
data class Default(
val snapshotName: String,
val preview: PreviewData,
val composable: @Composable () -> Unit
) : PaparazziPreviewData {
override fun toString(): String =
buildList {
add(snapshotName)
preview.toString().takeIf { it.isNotEmpty() }?.let(::add)
}.joinToString(",")
}
data class Provider<T>(
val snapshotName: String,
val preview: PreviewData,
val composable: @Composable (T) -> Unit,
val previewParameter: PreviewParameterData<T>
) : PaparazziPreviewData {
fun withPreviewParameterIndex(index: Int): Provider<T> =
copy(previewParameter = previewParameter.copy(index = index))
}
}
data class PreviewData(
val fontScale: Float? = null,
val device: String? = null,
val widthDp: Int? = null,
val heightDp: Int? = null,
val uiMode: Int? = null,
val locale: String? = null,
val backgroundColor: String? = null
)
data class PreviewParameterData<T>(
val name: String,
val values: Sequence<T>,
val index: Int = 0
)
/**
* Maps [fontScale] to enum values similar to Preview
* see:
https://android.googlesource.com/platform/tools/adt/idea/+/refs/heads/mirror-goog-studio-main/compose-designer/src/com/android/tools/idea/compose/pickers/preview/enumsupport/PsiEnumValues.kt
*/
internal fun Float.fontScale() = FontScale.CUSTOM.apply { value = this@fontScale }
internal enum class FontScale(val value: Float?) {
DEFAULT(1f),
SMALL(0.85f),
LARGE(1.15f),
LARGEST(1.30f),
CUSTOM(null);
fun displayName() =
when (this) {
CUSTOM -> "fs_"
else -> name
}
}
internal fun Int.lightDarkName() =
when (this and Configuration.UI_MODE_NIGHT_MASK) {
Configuration.UI_MODE_NIGHT_NO -> "Light"
Configuration.UI_MODE_NIGHT_YES -> "Dark"
else -> null
}
internal fun Int.uiModeName() =
when (this and Configuration.UI_MODE_TYPE_MASK) {
Configuration.UI_MODE_TYPE_NORMAL -> "Normal"
Configuration.UI_MODE_TYPE_CAR -> "Car"
Configuration.UI_MODE_TYPE_DESK -> "Desk"
Configuration.UI_MODE_TYPE_APPLIANCE -> "Appliance"
Configuration.UI_MODE_TYPE_WATCH -> "Watch"
Configuration.UI_MODE_TYPE_VR_HEADSET -> "VR_Headset"
else -> null
}
/***
* Values taken from `android.content.res.Configuration` to avoid dependency on Android SDK/LayoutLib
*/
private object Configuration {
const val UI_MODE_TYPE_MASK = 15
const val UI_MODE_NIGHT_MASK = 48
const val UI_MODE_TYPE_NORMAL = 1
const val UI_MODE_TYPE_CAR = 3
const val UI_MODE_TYPE_DESK = 2
const val UI_MODE_TYPE_APPLIANCE = 5
const val UI_MODE_TYPE_WATCH = 6
const val UI_MODE_TYPE_VR_HEADSET = 7
const val UI_MODE_NIGHT_NO = 16
const val UI_MODE_NIGHT_YES = 32
}
""".trimIndent()
)
}
Expand Down
Loading

0 comments on commit 009c737

Please sign in to comment.