Skip to content

Commit

Permalink
Inline sealed KSP support to the main codegen artifact (#156)
Browse files Browse the repository at this point in the history
  • Loading branch information
ZacSweers committed Sep 3, 2021
1 parent 1481db0 commit f4ca5c7
Show file tree
Hide file tree
Showing 18 changed files with 72 additions and 169 deletions.
9 changes: 5 additions & 4 deletions moshi-sealed/README.md
Expand Up @@ -101,16 +101,17 @@ natively.

##### KSP support

There is an experimental [KSP](https://github.com/google/ksp) implementation available as `moshi-sealed-ksp`.
There is an experimental [KSP](https://github.com/google/ksp) implementation available in the `moshi-sealed-codegen`
artifact.
Note that KSP itself is experimental, so expect this API to break regularly.

Add this dependency as a `ksp` dependency instead of the `moshi-sealed-codegen` dependency.
Add this dependency as a `ksp` dependency.

[![Maven Central](https://img.shields.io/maven-central/v/dev.zacsweers.moshix/moshi-sealed-ksp.svg)](https://mvnrepository.com/artifact/dev.zacsweers.moshix/moshi-sealed-ksp)
[![Maven Central](https://img.shields.io/maven-central/v/dev.zacsweers.moshix/moshi-sealed-codegen.svg)](https://mvnrepository.com/artifact/dev.zacsweers.moshix/moshi-sealed-codegen)
```diff
dependencies {
- kapt("dev.zacsweers.moshix:moshi-sealed-codegen:<version>")
+ ksp("dev.zacsweers.moshix:moshi-sealed-ksp:<version>")
+ ksp("dev.zacsweers.moshix:moshi-sealed-codegen:<version>")
}
```

Expand Down
11 changes: 0 additions & 11 deletions moshi-sealed/codegen-ksp/api/codegen-ksp.api

This file was deleted.

43 changes: 0 additions & 43 deletions moshi-sealed/codegen-ksp/build.gradle.kts

This file was deleted.

19 changes: 0 additions & 19 deletions moshi-sealed/codegen-ksp/gradle.properties

This file was deleted.

This file was deleted.

11 changes: 11 additions & 0 deletions moshi-sealed/codegen/api/codegen.api
Expand Up @@ -12,3 +12,14 @@ public final class dev/zacsweers/moshix/sealed/codegen/MoshiSealedProcessor : ja
public final class dev/zacsweers/moshix/sealed/codegen/MoshiSealedProcessor$Companion {
}

public final class dev/zacsweers/moshix/sealed/codegen/ksp/MoshiSealedSymbolProcessorProvider : com/google/devtools/ksp/processing/SymbolProcessorProvider {
public static final field Companion Ldev/zacsweers/moshix/sealed/codegen/ksp/MoshiSealedSymbolProcessorProvider$Companion;
public static final field OPTION_GENERATED Ljava/lang/String;
public static final field OPTION_GENERATE_PROGUARD_RULES Ljava/lang/String;
public fun <init> ()V
public fun create (Lcom/google/devtools/ksp/processing/SymbolProcessorEnvironment;)Lcom/google/devtools/ksp/processing/SymbolProcessor;
}

public final class dev/zacsweers/moshix/sealed/codegen/ksp/MoshiSealedSymbolProcessorProvider$Companion {
}

10 changes: 9 additions & 1 deletion moshi-sealed/codegen/build.gradle.kts
Expand Up @@ -23,6 +23,10 @@ plugins {
dependencies {
implementation(libs.autoService)
ksp(libs.autoService.ksp)
// For access to MessageCollectorBasedKSPLogger
compileOnly(libs.ksp)
compileOnly(libs.ksp.api)
compileOnly(libs.kotlin.compilerEmbeddable)

implementation(libs.autoCommon)
implementation(libs.kotlinpoet)
Expand All @@ -31,7 +35,11 @@ dependencies {
implementation(libs.moshi)
implementation(project(":moshi-sealed:runtime"))

testImplementation(libs.kotlinCompileTesting)
testImplementation(libs.ksp.api)
testImplementation(libs.ksp)
testImplementation(libs.truth)
testImplementation(libs.junit)
testImplementation(libs.kotlinCompileTesting)
testImplementation(libs.kotlinCompileTesting.ksp)
testImplementation(libs.kotlin.compilerEmbeddable)
}
Expand Up @@ -57,10 +57,12 @@ import javax.annotation.processing.Processor
import javax.annotation.processing.RoundEnvironment
import javax.annotation.processing.SupportedOptions
import javax.lang.model.SourceVersion
import javax.lang.model.element.Element
import javax.lang.model.element.TypeElement
import javax.lang.model.util.Elements
import javax.lang.model.util.Types
import javax.tools.Diagnostic
import javax.tools.StandardLocation

@KotlinPoetMetadataPreview
@SupportedOptions(OPTION_GENERATED)
Expand Down Expand Up @@ -390,4 +392,9 @@ public class MoshiSealedProcessor : AbstractProcessor() {
}
}

internal data class PreparedAdapter(val spec: FileSpec, val proguardConfig: ProguardConfig?)
/** Writes this to `filer`. */
internal fun ProguardConfig.writeTo(filer: Filer, vararg originatingElements: Element) {
filer.createResource(StandardLocation.CLASS_OUTPUT, "", outputFile, *originatingElements)
.openWriter()
.use(::writeTo)
}
@@ -0,0 +1,20 @@
/*
* Copyright (C) 2021 Zac Sweers
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dev.zacsweers.moshix.sealed.codegen

import com.squareup.kotlinpoet.FileSpec

internal data class PreparedAdapter(val spec: FileSpec, val proguardConfig: ProguardConfig?)
Expand Up @@ -16,9 +16,6 @@
package dev.zacsweers.moshix.sealed.codegen

import com.squareup.kotlinpoet.ClassName
import javax.annotation.processing.Filer
import javax.lang.model.element.Element
import javax.tools.StandardLocation

/**
* Represents a proguard configuration for a given spec. This covers two main areas:
Expand All @@ -36,16 +33,9 @@ internal data class ProguardConfig(
val adapterName: String,
val adapterConstructorParams: List<String>
) {
private val outputFile = "META-INF/proguard/moshi-sealed-${targetClass.canonicalName}.pro"
internal val outputFile = "META-INF/proguard/moshi-sealed-${targetClass.canonicalName}.pro"

/** Writes this to `filer`. */
fun writeTo(filer: Filer, vararg originatingElements: Element) {
filer.createResource(StandardLocation.CLASS_OUTPUT, "", outputFile, *originatingElements)
.openWriter()
.use(::writeTo)
}

private fun writeTo(out: Appendable): Unit = out.run {
internal fun writeTo(out: Appendable): Unit = out.run {
//
// -if class {the target class}
// -keepnames class {the target class}
Expand Down
Expand Up @@ -16,24 +16,27 @@
package dev.zacsweers.moshix.sealed.codegen.ksp

import com.google.auto.service.AutoService
import com.google.devtools.ksp.processing.CodeGenerator
import com.google.devtools.ksp.processing.Dependencies
import com.google.devtools.ksp.processing.Resolver
import com.google.devtools.ksp.processing.SymbolProcessor
import com.google.devtools.ksp.processing.SymbolProcessorEnvironment
import com.google.devtools.ksp.processing.SymbolProcessorProvider
import com.google.devtools.ksp.symbol.ClassKind.OBJECT
import com.google.devtools.ksp.symbol.KSAnnotated
import com.google.devtools.ksp.symbol.KSClassDeclaration
import com.google.devtools.ksp.symbol.KSFile
import com.google.devtools.ksp.symbol.Modifier
import com.squareup.kotlinpoet.AnnotationSpec
import com.squareup.kotlinpoet.ClassName
import com.squareup.kotlinpoet.CodeBlock
import com.squareup.kotlinpoet.FileSpec
import com.squareup.kotlinpoet.MemberName
import com.squareup.kotlinpoet.asClassName
import com.squareup.moshi.JsonClass
import dev.zacsweers.moshix.sealed.annotations.DefaultNull
import dev.zacsweers.moshix.sealed.annotations.DefaultObject
import dev.zacsweers.moshix.sealed.annotations.TypeLabel
import dev.zacsweers.moshix.sealed.codegen.ProguardConfig
import dev.zacsweers.moshix.sealed.codegen.ksp.MoshiSealedSymbolProcessorProvider.Companion.OPTION_GENERATED
import dev.zacsweers.moshix.sealed.codegen.ksp.MoshiSealedSymbolProcessorProvider.Companion.OPTION_GENERATE_PROGUARD_RULES
import dev.zacsweers.moshix.sealed.runtime.internal.ObjectJsonAdapter
Expand Down Expand Up @@ -277,4 +280,12 @@ private class MoshiSealedSymbolProcessor(
}
}

internal data class PreparedAdapter(val spec: FileSpec, val proguardConfig: ProguardConfig?)
/** Writes this to `filer`. */
internal fun ProguardConfig.writeTo(codeGenerator: CodeGenerator, originatingKSFile: KSFile) {
codeGenerator.createNewFile(
Dependencies(false, originatingKSFile),
"",
outputFile,
""
).bufferedWriter().use(::writeTo)
}
Expand Up @@ -36,6 +36,8 @@ import com.squareup.moshi.JsonWriter
import com.squareup.moshi.Moshi
import com.squareup.moshi.Types
import com.squareup.moshi.adapters.PolymorphicJsonAdapterFactory
import dev.zacsweers.moshix.sealed.codegen.PreparedAdapter
import dev.zacsweers.moshix.sealed.codegen.ProguardConfig
import dev.zacsweers.moshix.sealed.codegen.ksp.Subtype.ClassType
import dev.zacsweers.moshix.sealed.codegen.ksp.Subtype.ObjectType

Expand Down
4 changes: 2 additions & 2 deletions moshi-sealed/sample/build.gradle.kts
Expand Up @@ -31,9 +31,9 @@ val generatedAnnotation = if (JavaVersion.current().isJava10Compatible) {

dependencies {
if (useKsp) {
ksp(project(":moshi-sealed:codegen-ksp"))
ksp(project(":moshi-sealed:codegen"))
ksp(project(":moshi-ksp:moshi-ksp"))
kspTest(project(":moshi-sealed:codegen-ksp"))
kspTest(project(":moshi-sealed:codegen"))
kspTest(project(":moshi-ksp:moshi-ksp"))
} else {
kapt(project(":moshi-sealed:codegen"))
Expand Down
1 change: 0 additions & 1 deletion settings.gradle.kts
Expand Up @@ -39,7 +39,6 @@ include(":moshi-ksp:tests")
include(":moshi-metadata-reflect")
include(":moshi-records-reflect")
include(":moshi-sealed:codegen")
include(":moshi-sealed:codegen-ksp")
include(":moshi-sealed:java-sealed-reflect")
include(":moshi-sealed:metadata-reflect")
include(":moshi-sealed:reflect")
Expand Down

0 comments on commit f4ca5c7

Please sign in to comment.