Skip to content

Commit

Permalink
fix #489 合理使用Aggregating、Isolating两种编译模式
Browse files Browse the repository at this point in the history
  • Loading branch information
liujingxing committed Mar 25, 2024
1 parent 5ef9537 commit a7e09e5
Show file tree
Hide file tree
Showing 13 changed files with 110 additions and 43 deletions.
33 changes: 17 additions & 16 deletions rxhttp-compiler/src/main/java/com/rxhttp/compiler/KspProcessor.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import com.google.devtools.ksp.processing.SymbolProcessorEnvironment
import com.google.devtools.ksp.processing.SymbolProcessorProvider
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.KSPropertyDeclaration
import com.rxhttp.compiler.ksp.BaseRxHttpGenerator
import com.rxhttp.compiler.ksp.ClassHelper
Expand Down Expand Up @@ -51,18 +50,24 @@ class KspProcessor(private val env: SymbolProcessorEnvironment) : SymbolProcesso
)
}
androidPlatform = (options[rxhttp_android_platform] ?: "true").toBoolean()
if (processed || resolver.getAllFiles().toList().isEmpty()) return emptyList()
if (processed) return emptyList()
processed = true

rxHttpPackage = options[rxhttp_package] ?: defaultPackageName
initRxJavaVersion(options[rxhttp_rxjava])

val ksFileSet = HashSet<KSFile>()
ClassHelper().generatorStaticClass(codeGenerator)
KClassHelper(androidPlatform).generatorStaticClass(codeGenerator)

if (resolver.getAllFiles().toList().isEmpty()) {
return emptyList()
}

val rxHttpWrapper = RxHttpWrapper(logger)

val domainVisitor = DomainVisitor(resolver, logger)
resolver.getSymbolsWithAnnotation(Domain::class.java.name).forEach {
if (it is KSPropertyDeclaration) {
ksFileSet.add(it.containingFile!!)
it.accept(domainVisitor, Unit)
rxHttpWrapper.addDomain(it)
}
Expand All @@ -71,15 +76,13 @@ class KspProcessor(private val env: SymbolProcessorEnvironment) : SymbolProcesso
val defaultDomainVisitor = DefaultDomainVisitor(resolver, logger)
resolver.getSymbolsWithAnnotation(DefaultDomain::class.java.name).forEach {
if (it is KSPropertyDeclaration) {
ksFileSet.add(it.containingFile!!)
it.accept(defaultDomainVisitor, Unit)
}
}

val okClientVisitor = OkClientVisitor(resolver, logger)
resolver.getSymbolsWithAnnotation(OkClient::class.java.name).forEach {
if (it is KSPropertyDeclaration) {
ksFileSet.add(it.containingFile!!)
it.accept(okClientVisitor, Unit)
rxHttpWrapper.addOkClient(it)
}
Expand All @@ -88,7 +91,6 @@ class KspProcessor(private val env: SymbolProcessorEnvironment) : SymbolProcesso
val converterVisitor = ConverterVisitor(resolver, logger)
resolver.getSymbolsWithAnnotation(Converter::class.java.name).forEach {
if (it is KSPropertyDeclaration) {
ksFileSet.add(it.containingFile!!)
it.accept(converterVisitor, Unit)
rxHttpWrapper.addConverter(it)
}
Expand All @@ -97,34 +99,33 @@ class KspProcessor(private val env: SymbolProcessorEnvironment) : SymbolProcesso
val parserVisitor = ParserVisitor(resolver, logger)
resolver.getSymbolsWithAnnotation(Parser::class.java.name).forEach {
if (it is KSClassDeclaration) {
ksFileSet.add(it.containingFile!!)
it.accept(parserVisitor, Unit)
}
}

val paramsVisitor = ParamsVisitor(logger, resolver)
resolver.getSymbolsWithAnnotation(Param::class.java.name).forEach {
if (it is KSClassDeclaration) {
ksFileSet.add(it.containingFile!!)
it.accept(paramsVisitor, Unit)
rxHttpWrapper.add(it)
}
}
rxHttpWrapper.generateRxWrapper(codeGenerator)
ClassHelper(ksFileSet).generatorStaticClass(codeGenerator)
KClassHelper(androidPlatform, ksFileSet).generatorStaticClass(codeGenerator)
RxHttpGenerator(logger, ksFileSet).apply {

//取第一个源文件做为输出文件的关联文件(如果有使用注解,则忽略该变量)
//以修复https://github.com/liujingxing/rxhttp/issues/489提到的bug
val defaultKsFile = resolver.getAllFiles().firstOrNull()

RxHttpGenerator(logger, defaultKsFile).apply {
this.paramsVisitor = paramsVisitor
this.domainVisitor = domainVisitor
this.okClientVisitor = okClientVisitor
this.converterVisitor = converterVisitor
this.defaultDomainVisitor = defaultDomainVisitor
}.generateCode(codeGenerator)

BaseRxHttpGenerator(logger, androidPlatform, ksFileSet).apply {
this.parserVisitor = parserVisitor
}.generateCode(codeGenerator)
processed = true
BaseRxHttpGenerator(logger, androidPlatform, defaultKsFile, parserVisitor)
.generateCode(codeGenerator)
return emptyList()
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package com.rxhttp.compiler.ksp

import com.google.devtools.ksp.KspExperimental
import com.google.devtools.ksp.processing.CodeGenerator
import com.google.devtools.ksp.processing.Dependencies
import com.google.devtools.ksp.processing.KSPLogger
import com.google.devtools.ksp.symbol.KSFile
import com.rxhttp.compiler.getClassPath
Expand All @@ -28,10 +27,9 @@ import java.io.IOException
class BaseRxHttpGenerator(
private val logger: KSPLogger,
private val isAndroidPlatform: Boolean,
private val ksFiles: Collection<KSFile>
private val defaultKsFile: KSFile?,
private val parserVisitor: ParserVisitor,
) {
var parserVisitor: ParserVisitor? = null

//生成BaseRxHttp类
@KspExperimental
@Throws(IOException::class)
Expand Down Expand Up @@ -152,7 +150,7 @@ class BaseRxHttpGenerator(

val companionFunList = mutableListOf<FunSpec>()
parserVisitor?.apply {
methodList.addAll(getFunList(codeGenerator, companionFunList))
methodList.addAll(getFunList(codeGenerator, companionFunList, defaultKsFile))
}

FunSpec.builder("execute")
Expand Down Expand Up @@ -249,12 +247,17 @@ class BaseRxHttpGenerator(
""".trimIndent()
)

val dependencies = Dependencies(true, *ksFiles.toTypedArray())
val kSFiles = mutableListOf<KSFile>()
kSFiles.addAll(parserVisitor.originatingKSFiles)
if (kSFiles.isEmpty()) {
defaultKsFile?.let { kSFiles.add(it) }
}

FileSpec.builder(rxHttpPackage, fileName)
.addImport("rxhttp.wrapper.utils", "parameterizedBy")
.addType(typeSpecBuilder.build())
.indent(" ")
.build()
.writeTo(codeGenerator, dependencies)
.writeTo(codeGenerator, true, kSFiles)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import com.rxhttp.compiler.rxHttpPackage
* Date: 2020/3/31
* Time: 23:36
*/
class ClassHelper(private val ksFiles: Collection<KSFile>) {
class ClassHelper {

fun generatorStaticClass(codeGenerator: CodeGenerator) {
if (isDependenceRxJava()) {
Expand All @@ -25,7 +25,7 @@ class ClassHelper(private val ksFiles: Collection<KSFile>) {

private fun generatorClass(codeGenerator: CodeGenerator, className: String, content: String) {
codeGenerator.createNewFile(
Dependencies(false, *ksFiles.toTypedArray()),
Dependencies(false, *emptyList<KSFile>().toTypedArray()),
rxHttpPackage,
className,
"java"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ class ConverterVisitor(

private val elementMap = LinkedHashMap<String, KSPropertyDeclaration>()

val originatingKSFiles: List<KSFile>
get() = elementMap.values.map { it.containingFile!! }

@KspExperimental
override fun visitPropertyDeclaration(property: KSPropertyDeclaration, data: Unit) {
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.rxhttp.compiler.ksp

import com.google.devtools.ksp.processing.KSPLogger
import com.google.devtools.ksp.processing.Resolver
import com.google.devtools.ksp.symbol.KSFile
import com.google.devtools.ksp.symbol.KSPropertyDeclaration
import com.google.devtools.ksp.symbol.KSVisitorVoid
import com.squareup.kotlinpoet.FunSpec
Expand All @@ -19,6 +20,9 @@ class DefaultDomainVisitor(

private var property: KSPropertyDeclaration? = null

val originatingKSFile: KSFile?
get() = property?.containingFile

override fun visitPropertyDeclaration(property: KSPropertyDeclaration, data: Unit) {
try {
if (this.property != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ class DomainVisitor(

private val elementMap = LinkedHashMap<String, KSPropertyDeclaration>()

val originatingKSFiles: List<KSFile>
get() = elementMap.values.map { it.containingFile!! }

@KspExperimental
override fun visitPropertyDeclaration(property: KSPropertyDeclaration, data: Unit) {
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@ import com.rxhttp.compiler.rxHttpPackage
* Time: 23:36
*/
class KClassHelper(
private val isAndroidPlatform: Boolean,
private val ksFiles: Collection<KSFile>
private val isAndroidPlatform: Boolean
) {

private fun isAndroid(s: String) = if (isAndroidPlatform) s else ""
Expand Down Expand Up @@ -420,7 +419,7 @@ class KClassHelper(

private fun generatorClass(codeGenerator: CodeGenerator, className: String, content: String) {
codeGenerator.createNewFile(
Dependencies(false, *ksFiles.toTypedArray()),
Dependencies(false, *emptyList<KSFile>().toTypedArray()),
rxHttpPackage,
className,
).use {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ class OkClientVisitor(

private val elementMap = LinkedHashMap<String, KSPropertyDeclaration>()

val originatingKSFiles: List<KSFile>
get() = elementMap.values.map { it.containingFile!! }

@KspExperimental
override fun visitPropertyDeclaration(property: KSPropertyDeclaration, data: Unit) {
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ import com.google.devtools.ksp.isAbstract
import com.google.devtools.ksp.isConstructor
import com.google.devtools.ksp.isPublic
import com.google.devtools.ksp.processing.CodeGenerator
import com.google.devtools.ksp.processing.Dependencies
import com.google.devtools.ksp.processing.KSPLogger
import com.google.devtools.ksp.processing.Resolver
import com.google.devtools.ksp.symbol.KSClassDeclaration
import com.google.devtools.ksp.symbol.KSFile
import com.google.devtools.ksp.symbol.KSVisitorVoid
import com.google.devtools.ksp.symbol.Modifier
import com.rxhttp.compiler.common.joinToStringIndexed
Expand All @@ -28,6 +28,7 @@ import com.squareup.kotlinpoet.TypeSpec
import com.squareup.kotlinpoet.UNIT
import com.squareup.kotlinpoet.jvm.jvmStatic
import com.squareup.kotlinpoet.jvm.throws
import com.squareup.kotlinpoet.ksp.addOriginatingKSFile
import com.squareup.kotlinpoet.ksp.toClassName
import com.squareup.kotlinpoet.ksp.toKModifier
import com.squareup.kotlinpoet.ksp.toTypeName
Expand All @@ -44,6 +45,9 @@ class ParamsVisitor(

private val ksClassMap = LinkedHashMap<String, KSClassDeclaration>()

val originatingKSFiles: List<KSFile>
get() = ksClassMap.values.map { it.containingFile!! }

@KspExperimental
override fun visitClassDeclaration(classDeclaration: KSClassDeclaration, data: Unit) {
try {
Expand Down Expand Up @@ -193,14 +197,16 @@ class ParamsVisitor(
https://github.com/liujingxing/rxlife
""".trimIndent()
)
.addOriginatingKSFile(ksClass.containingFile!!)
.addTypeVariables(rxHttpTypeNames)
.superclass(rxHttpParam)
.addFunctions(rxHttpPostCustomFun)
.build()

FileSpec.builder(rxHttpPackage, rxHttpName)
.addType(rxHttpPostEncryptFormParamSpec)
.build().writeTo(codeGenerator, Dependencies(false, ksClass.containingFile!!))
.build()
.writeTo(codeGenerator, false)
}
return funList
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import com.google.devtools.ksp.processing.CodeGenerator
import com.google.devtools.ksp.processing.KSPLogger
import com.google.devtools.ksp.processing.Resolver
import com.google.devtools.ksp.symbol.KSClassDeclaration
import com.google.devtools.ksp.symbol.KSFile
import com.google.devtools.ksp.symbol.KSVisitorVoid
import com.rxhttp.compiler.K_TYPE
import com.rxhttp.compiler.common.flapTypeParameterSpecTypes
Expand All @@ -35,6 +36,7 @@ import com.squareup.kotlinpoet.asClassName
import com.squareup.kotlinpoet.javapoet.JClassName
import com.squareup.kotlinpoet.javapoet.KotlinPoetJavaPoetPreview
import com.squareup.kotlinpoet.javapoet.toKClassName
import com.squareup.kotlinpoet.ksp.addOriginatingKSFile
import com.squareup.kotlinpoet.ksp.toClassName
import com.squareup.kotlinpoet.ksp.toTypeParameterResolver
import com.squareup.kotlinpoet.ksp.toTypeVariableName
Expand All @@ -54,6 +56,9 @@ class ParserVisitor(
private val ksClassMap = LinkedHashMap<String, KSClassDeclaration>()
private val classNameMap = LinkedHashMap<String, List<ClassName>>()

val originatingKSFiles: List<KSFile>
get() = ksClassMap.values.map { it.containingFile!! }

@OptIn(KotlinPoetJavaPoetPreview::class)
@KspExperimental
override fun visitClassDeclaration(classDeclaration: KSClassDeclaration, data: Unit) {
Expand Down Expand Up @@ -83,7 +88,11 @@ class ParserVisitor(
}

@KspExperimental
fun getFunList(codeGenerator: CodeGenerator, companionFunList: MutableList<FunSpec>): List<FunSpec> {
fun getFunList(
codeGenerator: CodeGenerator,
companionFunList: MutableList<FunSpec>,
defaultKsFile: KSFile?
): List<FunSpec> {
val funList = ArrayList<FunSpec>()
val rxHttpExtensions = RxHttpExtensions(logger)
//遍历自定义解析器
Expand All @@ -95,7 +104,7 @@ class ParserVisitor(
.getToObservableXxxFun(parserAlias, classNameMap, companionFunList)
funList.addAll(toObservableXxxFunList)
}
rxHttpExtensions.generateClassFile(codeGenerator)
rxHttpExtensions.generateClassFile(codeGenerator, defaultKsFile)
return funList
}
}
Expand Down Expand Up @@ -148,7 +157,9 @@ private fun KSClassDeclaration.getToObservableXxxFun(
}

if (isDependenceRxJava()) {
//生成toObservableXxx(Type)方法
FunSpec.builder(funName)
.addOriginatingKSFile(containingFile!!)
.addTypeVariables(typeVariableNames)
.addParameters(typeParameterSpecs)
.addCode(toObservableXxxFunBody)
Expand All @@ -172,6 +183,7 @@ private fun KSClassDeclaration.getToObservableXxxFun(
.replace(firstParamName, "actualType")

FunSpec.builder("wrap${customParser.simpleName}")
.addOriginatingKSFile(containingFile!!)
.addAnnotation(suppressAnnotation)
.addTypeVariable(t)
.addParameters(typeParameterSpecs)
Expand All @@ -192,8 +204,9 @@ private fun KSClassDeclaration.getToObservableXxxFun(
val paramNames = classParameterSpecs.toParamNames(typeCount)
val typeOfs = typeVariableNames.getTypeVariableString()

//生成Class类型参数的toObservableXxx方法
//生成toObservableXxx(Class<T>)方法
val funSpec = FunSpec.builder(funName)
.addOriginatingKSFile(containingFile!!)
.addTypeVariables(typeVariableNames)
.addParameters(classParameterSpecs)
.addStatement("return $funName$typeOfs($paramNames)") //方法里面的表达式
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import com.google.devtools.ksp.getConstructors
import com.google.devtools.ksp.processing.CodeGenerator
import com.google.devtools.ksp.processing.KSPLogger
import com.google.devtools.ksp.symbol.KSClassDeclaration
import com.google.devtools.ksp.symbol.KSFile
import com.rxhttp.compiler.common.flapTypeParameterSpecTypes
import com.rxhttp.compiler.common.getRxHttpExtensionFileSpec
import com.rxhttp.compiler.common.getTypeOfString
Expand All @@ -22,7 +23,7 @@ import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
import com.squareup.kotlinpoet.TypeName
import com.squareup.kotlinpoet.TypeVariableName
import com.squareup.kotlinpoet.ksp.addOriginatingKSFile
import com.squareup.kotlinpoet.ksp.kspDependencies
import com.squareup.kotlinpoet.ksp.originatingKSFiles
import com.squareup.kotlinpoet.ksp.toClassName
import com.squareup.kotlinpoet.ksp.toTypeParameterResolver
import com.squareup.kotlinpoet.ksp.toTypeVariableName
Expand Down Expand Up @@ -142,10 +143,13 @@ class RxHttpExtensions(private val logger: KSPLogger) {
}


fun generateClassFile(codeGenerator: CodeGenerator) {
fun generateClassFile(codeGenerator: CodeGenerator, defaultKsFile: KSFile?) {
val fileSpec =
getRxHttpExtensionFileSpec(toObservableXxxFunList, toAwaitXxxFunList, toFlowXxxFunList)
val dependencies = fileSpec.kspDependencies(false)
fileSpec.writeTo(codeGenerator, dependencies)
val originatingKSFiles = fileSpec.originatingKSFiles().toMutableList()
if (originatingKSFiles.isEmpty()) {
defaultKsFile?.let { originatingKSFiles.add(it) }
}
fileSpec.writeTo(codeGenerator, true, originatingKSFiles)
}
}
Loading

0 comments on commit a7e09e5

Please sign in to comment.