Skip to content

Commit

Permalink
Merge pull request #9 from 2BAB/dev
Browse files Browse the repository at this point in the history
v2.1 Stability and Doc improvement
  • Loading branch information
2BAB committed Jul 18, 2022
2 parents b19a47f + 13d74b4 commit 04e6400
Show file tree
Hide file tree
Showing 23 changed files with 161 additions and 66 deletions.
2 changes: 0 additions & 2 deletions .github/workflows/ci.yml
Expand Up @@ -70,7 +70,6 @@ jobs:
runs-on: ubuntu-latest
env:
JAVA_TOOL_OPTIONS: -Xmx4g
AGP_VERSION: ${{ matrix.agp-version }}

steps:
- uses: actions/checkout@v2
Expand All @@ -95,7 +94,6 @@ jobs:
runs-on: ubuntu-latest
env:
JAVA_TOOL_OPTIONS: -Xmx4g
AGP_VERSION: ${{ matrix.agp-version }}

steps:
- uses: actions/checkout@v2
Expand Down
9 changes: 5 additions & 4 deletions README.md
Expand Up @@ -16,7 +16,7 @@ Aggregate Kotlin Symbols based on KSP for multi-modules development in compile-t
// Add `mavenCentral` to `pluginManagement{}` on settings.gradle.kts,
// and koncat plugins ids.
pluginManagement {
val koncatVer = "2.0.1"
val koncatVer = "2.1.0"
repositories {
...
mavenCentral()
Expand All @@ -39,7 +39,7 @@ buildscript {
}
dependencies {
...
classpath("me.2bab:koncat-gradle-plugin:2.0.1")
classpath("me.2bab:koncat-gradle-plugin:2.1.0")
}
}
```
Expand Down Expand Up @@ -244,8 +244,9 @@ ScratchPaper is only supported & tested on LATEST 2 Minor versions of Android Gr

Koncat (Per minor version) |Suggested Env
-----------|-----------------
2.0.x | AGP 7.1/7.2 x KSP 1.6.21-1.0.5
1.0.x | AGP 7.1/7.2 x KSP 1.6.10-1.0.4
2.1.x | KSP 1.6.21-1.0.5 x AGP 7.2/7.3
2.0.x | KSP 1.6.21-1.0.5 x AGP 7.1/7.2
1.0.x | KSP 1.6.10-1.0.4 x AGP 7.1/7.2


## Why Koncat?
Expand Down
6 changes: 3 additions & 3 deletions deps.versions.toml
@@ -1,8 +1,8 @@
[versions]
koncatVer = "2.0.1"
koncatVer = "2.1.0"
kotlinVer = "1.6.21"
agpVer = "7.1.3"
agpBetaVer = "7.2.0"
agpVer = "7.2.1"
agpBetaVer = "7.3.0-beta03"
polyfillVer = "0.6.2"
mockitoVer = "3.9.0"
kspVer = "1.6.21-1.0.5"
Expand Down
Expand Up @@ -21,9 +21,9 @@ class SampleProjectTest {
private const val baseTestProjectPath = "../sample"

private const val aggregatedMetaData1OutputPathForKoncatProc =
"%s/app/build/generated/ksp/debug/kotlin/me/xx2bab/koncat/runtime/meta/KoncatAggregatedMeta1.kt"
"%s/app/build/generated/ksp/debug/resources/KoncatAggregatedMeta1.koncat"
private const val aggregatedMetaData2OutputPathForKoncatProc =
"%s/app/build/generated/ksp/debug/kotlin/me/xx2bab/koncat/runtime/meta/KoncatAggregatedMeta2.kt"
"%s/app/build/generated/ksp/debug/resources/KoncatAggregatedMeta2.koncat"
private const val aggregatedClassOutputPathForKoncatProc =
"%s/app/build/generated/ksp/debug/kotlin/me/xx2bab/koncat/runtime/KoncatAggregation.kt"
private const val aggregatedClassOutputPathForCustomProc =
Expand Down
1 change: 0 additions & 1 deletion koncat-gradle-plugin/build.gradle.kts
Expand Up @@ -15,7 +15,6 @@ dependencies {
implementation(projects.koncatCompileContract)
implementation(deps.kotlin.std)
implementation(deps.kotlin.serialization)
implementation(deps.polyfill.main)
compileOnly(deps.android.gradle.plugin)
compileOnly(deps.ksp.gradle)
}
Expand Down
@@ -1,8 +1,8 @@
package me.xx2bab.koncat.gradle

import com.android.build.api.variant.ApplicationAndroidComponentsExtension
import me.xx2bab.koncat.gradle.base.KoncatAndroidPlugin
import me.xx2bab.koncat.gradle.base.KoncatBaseExtension
import me.xx2bab.polyfill.PolyfillPlugin
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply
Expand All @@ -11,20 +11,18 @@ import org.gradle.kotlin.dsl.getByType
class KoncatAndroidApplicationPlugin : Plugin<Project> {

override fun apply(project: Project) {
// Set up Polyfill to provide additional Artifacts
project.apply<PolyfillPlugin>()
// Apply KoncatAndroidPlugin for common logic like extension/processor arguments
project.apply<KoncatAndroidPlugin>()
val baseExt = project.extensions.getByType<KoncatBaseExtension>()
baseExt.declaredAsMainProject.set(true)

// val androidExtension = project.extensions
// .getByType(ApplicationAndroidComponentsExtension::class.java)
val androidExtension = project.extensions
.getByType(ApplicationAndroidComponentsExtension::class.java)

// Prevent all Koncat intermediates from being packaged into the final package(.apk/.aab).
// androidExtension.finalizeDsl { appExt ->
//
// }
androidExtension.finalizeDsl {
it.packagingOptions.resources.excludes += "**/*.koncat"
}
}

}
Expand Up @@ -6,10 +6,16 @@ import me._bab.koncat_gradle_plugin.BuildConfig
import me.xx2bab.koncat.contract.*
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.tasks.InputDirectory
import org.gradle.api.tasks.InputFile
import org.gradle.api.tasks.PathSensitive
import org.gradle.api.tasks.PathSensitivity
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.create
import org.gradle.kotlin.dsl.register
import org.gradle.kotlin.dsl.withType
import org.gradle.process.CommandLineArgumentProvider
import java.io.File

class KoncatBasePlugin : Plugin<Project> {

Expand Down Expand Up @@ -37,9 +43,18 @@ class KoncatBasePlugin : Plugin<Project> {
targetPropertyTypes = baseExt.propertyTypes.get()
)
project.plugins.findPlugin(KSP_PLUGIN_NAME)?.run {
class ConfigFileProvider(
@InputDirectory
@PathSensitive(PathSensitivity.RELATIVE)
val config: File
):CommandLineArgumentProvider {
override fun asArguments(): Iterable<String> {
return listOf("$KONCAT_ARGUMENT_INTERMEDIATES_DIR=${config.path}")
}
}
project.extensions.configure<KspExtension> {
val dir = baseExt.mainProjectOutputDir.get().asFile
arg(KONCAT_ARGUMENT_INTERMEDIATES_DIR, dir.absolutePath)
arg(ConfigFileProvider(dir))
}
val genBaseArgsTask = project.tasks.register<GenerateArgumentsContractTask>(
BASE_ARGUMENTS_CONTRACT_GEN_TASK
Expand All @@ -50,7 +65,7 @@ class KoncatBasePlugin : Plugin<Project> {
})
}
project.tasks.withType<KspTask> {
inputs.files(genBaseArgsTask.flatMap { it.target })
dependsOn(genBaseArgsTask)
}
}
}
Expand Down
Expand Up @@ -28,4 +28,6 @@ interface KoncatProcAPI {
fun getTargetClassTypes(): List<String>

fun getTargetPropertyTypes(): List<String>

fun getResourceByFileName(fileName: String): File
}
Expand Up @@ -64,5 +64,8 @@ class KoncatProcAPIImpl(private val adapter: ProcessorAdapter) :
it.extension == KONCAT_FILE_EXTENSION
}

override fun getResourceByFileName(fileName: String): File {
return File(adapter.resourceDir, fileName)
}

}
Expand Up @@ -3,6 +3,7 @@ package me.xx2bab.koncat.api
import com.google.devtools.ksp.containingFile
import com.google.devtools.ksp.symbol.KSAnnotated
import com.google.devtools.ksp.symbol.KSFile
import java.io.File
import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient
import kotlinx.serialization.decodeFromString
Expand All @@ -12,12 +13,15 @@ class KoncatProcMetadataHolder(private val koncatExtendAnnotatedElement: KSAnnot

val dependency: KSFile = koncatExtendAnnotatedElement.containingFile!!

fun resolve(): KoncatProcMetadata = Json.decodeFromString(
koncatExtendAnnotatedElement
fun resolve(): KoncatProcMetadata {
val mergedMetadataJsonFile = koncatExtendAnnotatedElement
.annotations.first()
.arguments.first()
.value.toString()
)
return Json.decodeFromString(
File(mergedMetadataJsonFile).readText()
)
}

}

Expand Down
Expand Up @@ -45,4 +45,5 @@ class KSPAdapter(private val env: SymbolProcessorEnvironment) : ProcessorAdapter

override val variantName: String = variantAwareness.variantName

override val resourceDir: File = File(variantAwareness.resourcesDirPath)
}
Expand Up @@ -10,5 +10,6 @@ interface ProcessorAdapter {
val intermediateDir: File
val arguments: KoncatArgumentsContract
val variantName: String
val resourceDir: File
}

Expand Up @@ -9,14 +9,15 @@ import kotlin.reflect.jvm.isAccessible
class VariantAwareness(env: SymbolProcessorEnvironment) {

val variantName: String
val resourcesDirPath: String

init {
val resourcesDir = CodeGeneratorImpl::class.memberProperties
resourcesDirPath = CodeGeneratorImpl::class.memberProperties
.first { it.name == "resourcesDir" }
.also { it.isAccessible = true }
.getter(env.codeGenerator as CodeGeneratorImpl)
.toString()
variantName = File(resourcesDir).parentFile.name
variantName = File(resourcesDirPath).parentFile.name
}

}
Expand Up @@ -40,19 +40,22 @@ class KoncatAggregationProcessorIntegrationTest {
assertThat(result.exitCode, `is`(KotlinCompilation.ExitCode.OK))

// Generated file check
val koncatMetaForDummyApp = compilation.kspSourcesDir
val koncatMetaForDummyAppList = compilation.kspSourcesDir
.walk()
.filter { !it.isDirectory }
.first()
.toList()
koncatMetaForDummyAppList.forEach {
println("[KoncatAggregationProcessorIntegrationTest] gen list: ${it.path}")
}
assertThat(
koncatMetaForDummyApp.name,
`is`("KoncatAggregatedMeta1.kt")
koncatMetaForDummyAppList.size,
`is`(2)
)

val fileContent = koncatMetaForDummyApp.readText()
val metaInJsonText = Regex("(?<=\"\"\").+(?=\"\"\")").find(fileContent)!!.groupValues[0]
println("[KoncatAggregationProcessorIntegrationTest] extension: $metaInJsonText")
val metadata = Json.decodeFromString<KoncatProcMetadata>(metaInJsonText)
val fileContent = koncatMetaForDummyAppList.first { it.extension == "koncat" }.readText()
// val metaInJsonText = Regex("(?<=\"\"\").+(?=\"\"\")").find(fileContent)!!.groupValues[0]
println("[KoncatAggregationProcessorIntegrationTest] extension: $fileContent")
val metadata = Json.decodeFromString<KoncatProcMetadata>(fileContent)

assertThat(metadata.annotatedClasses.size, `is`(1))
val suppressList = metadata.annotatedClasses["kotlin.Suppress"]!!
Expand Down
Expand Up @@ -15,7 +15,7 @@ import me.xx2bab.koncat.api.KoncatProcAPI
import me.xx2bab.koncat.api.KoncatProcMetadata
import me.xx2bab.koncat.contract.KLogger
import me.xx2bab.koncat.processor.anno.AnnotationSubProcessor
import me.xx2bab.koncat.processor.interfaze.ClassTypeSubProcessor
import me.xx2bab.koncat.processor.clazz.ClassTypeSubProcessor
import me.xx2bab.koncat.processor.property.PropertyTypeSubProcessor
import me.xx2bab.koncat.runtime.KoncatExtend
import me.xx2bab.koncat.runtime.KoncatMeta
Expand Down Expand Up @@ -58,7 +58,7 @@ class KoncatAggregationProcessor(
if (koncat.generateExtensionClassEnabled() && exportMetadata.elementSize() > lastMapSize) {
roundCount++
lastMapSize = exportMetadata.elementSize()
val os = codeGenerator.createNewFile(
val osForKt = codeGenerator.createNewFile(
dependencies = Dependencies(
aggregating = true,
*exportMetadata.mapKSFiles.toTypedArray()
Expand All @@ -67,19 +67,31 @@ class KoncatAggregationProcessor(
fileName = aggregationMetadataFileName + roundCount
)
val annotation = KoncatExtend::class.simpleName!!
os.overwrite(
osForKt.overwrite(
"""
package $metadataPackage
import me.xx2bab.koncat.runtime.$annotation
@$annotation(metaDataInJson = ${'"'}""${
Json.encodeToString(exportMetadata).replace("$", "\${'$'}")
koncat.getResourceByFileName(aggregationMetadataFileName + roundCount + ".koncat")
}""${'"'})
val voidProp$roundCount = null // DO NOT use voidProp directly, the valuable information is placing in `metaDataInJson` above.
""".trimIndent()
)
os.close()
osForKt.close()

val osForRes = codeGenerator.createNewFile(
dependencies = Dependencies(
aggregating = true,
*exportMetadata.mapKSFiles.toTypedArray()
),
packageName = "",
fileName = aggregationMetadataFileName + roundCount,
extensionName = "koncat"
)
osForRes.overwrite(Json.encodeToString(exportMetadata))
osForRes.close()
}

return ret
Expand Down Expand Up @@ -130,12 +142,14 @@ class KoncatAggregationProcessor(
.map {
logger.info("Aggregate from ${it.qualifiedName?.asString()}")
it.containingFile?.let { mainMetadata.mapKSFiles.add(it) }
val meta =
it.annotations.first { anno -> anno.shortName.asString() == KoncatMeta::class.simpleName }
val meta = it.annotations.first { anno ->
anno.shortName.asString() == KoncatMeta::class.simpleName
}
Json.decodeFromString<KoncatProcMetadata>(
meta.arguments.first().value.toString()
)
}.toList()
}
.toList()
}

}
Expand Down

0 comments on commit 04e6400

Please sign in to comment.