diff --git a/Quick-annotations/src/main/java/com/wpf/app/quick/annotations/request/GenerateRequest.kt b/Quick-annotations/src/main/java/com/wpf/app/quick/annotations/request/GenerateRequest.kt new file mode 100644 index 00000000..413b79e0 --- /dev/null +++ b/Quick-annotations/src/main/java/com/wpf/app/quick/annotations/request/GenerateRequest.kt @@ -0,0 +1,8 @@ +package com.wpf.app.quick.annotations.request + +@Target(AnnotationTarget.CLASS) +@Retention(AnnotationRetention.RUNTIME) +annotation class GenerateRequest( + val fileName: String, + val funName: String = "request" +) \ No newline at end of file diff --git a/Quick-compiler-ksp/src/main/java/com/wpf/plugins/QuickKsp.kt b/Quick-compiler-ksp/src/main/java/com/wpf/plugins/QuickKsp.kt index 8376f74f..997bdf9d 100644 --- a/Quick-compiler-ksp/src/main/java/com/wpf/plugins/QuickKsp.kt +++ b/Quick-compiler-ksp/src/main/java/com/wpf/plugins/QuickKsp.kt @@ -11,10 +11,12 @@ import com.wpf.app.quick.annotations.getclass.GetClass import com.wpf.app.quick.annotations.getclass.GetFun import com.wpf.app.quick.annotations.request.GenerateCommonCall import com.wpf.app.quick.annotations.request.GenerateNormalCall +import com.wpf.app.quick.annotations.request.GenerateRequest import com.wpf.plugins.processor.BaseProcessor import com.wpf.plugins.processor.BindViewProcessor import com.wpf.plugins.processor.GenerateCommonCallProcessor import com.wpf.plugins.processor.GenerateNormalCallProcessor +import com.wpf.plugins.processor.GenerateRequestProcessor import com.wpf.plugins.processor.GetClassProcessor import com.wpf.plugins.processor.TabInitProcessor import kotlin.reflect.full.primaryConstructor @@ -33,6 +35,7 @@ internal class QuickSymbolProcessor(private val environment: SymbolProcessorEnvi Pair(arrayOf(TabInit::class), TabInitProcessor::class), Pair(arrayOf(GenerateNormalCall::class), GenerateNormalCallProcessor::class), Pair(arrayOf(GenerateCommonCall::class), GenerateCommonCallProcessor::class), + Pair(arrayOf(GenerateRequest::class), GenerateRequestProcessor::class), ) override fun process(resolver: Resolver): List { diff --git a/Quick-compiler-ksp/src/main/java/com/wpf/plugins/processor/GenerateRequestProcessor.kt b/Quick-compiler-ksp/src/main/java/com/wpf/plugins/processor/GenerateRequestProcessor.kt new file mode 100644 index 00000000..9b16754d --- /dev/null +++ b/Quick-compiler-ksp/src/main/java/com/wpf/plugins/processor/GenerateRequestProcessor.kt @@ -0,0 +1,67 @@ +package com.wpf.plugins.processor + +import com.google.devtools.ksp.processing.SymbolProcessorEnvironment +import com.google.devtools.ksp.symbol.KSClassDeclaration +import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.CodeBlock +import com.squareup.kotlinpoet.FileSpec +import com.squareup.kotlinpoet.FunSpec +import com.squareup.kotlinpoet.KModifier +import com.squareup.kotlinpoet.LambdaTypeName +import com.squareup.kotlinpoet.ParameterSpec +import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy +import com.squareup.kotlinpoet.TypeVariableName +import com.wpf.app.quick.annotations.request.GenerateRequest +import com.wpf.app.quick.annotations.tab.TabInit + +class GenerateRequestProcessor(environment: SymbolProcessorEnvironment) : + BaseProcessor(environment) { + private var funBuilder: FunSpec.Builder? = null + override fun visitClassDeclaration( + classDeclaration: KSClassDeclaration, + data: Unit, + packageName: String, + className: String + ) { + super.visitClassDeclaration(classDeclaration, data, packageName, className) + val generateRequestAnn = classDeclaration.annotations.find { + it.shortName.getShortName().contains(GenerateRequest::class.simpleName!!) + } ?: return + val fileName = generateRequestAnn.arguments.getOrNull(0)?.value as? String + val funName = generateRequestAnn.arguments.getOrNull(1)?.value as String + outFileName = fileName + val dataType = TypeVariableName("Data") + val failType = TypeVariableName("Fail") + val api = ClassName(packageName, className) + val baseRequest = ClassName("com.wpf.app.quicknetwork.base", "BaseRequest") + val retrofitCreateHelper = ClassName("com.wpf.app.quicknetwork.helper", "RetrofitCreateHelper") + val wpfRequest = ClassName("com.wpf.app.quicknetwork.base", "WpfRequest") + val realCall = ClassName("com.wpf.app.quicknetwork.call", "RealCall") + val requestCoroutineScope = + ClassName("com.wpf.app.quicknetwork.base", "RequestCoroutineScope") + funBuilder = FunSpec.builder(funName) + .addModifiers(KModifier.INLINE) + .addTypeVariable(dataType) + .addTypeVariable(failType) + .addParameter( + ParameterSpec.builder("context", requestCoroutineScope.copy(nullable = true)) + .defaultValue("null").build() + ).addParameter( + ParameterSpec.builder( + "run", + LambdaTypeName.get(api, listOf(), realCall.parameterizedBy(dataType, failType)) + ).build() + ).returns( + baseRequest.parameterizedBy(dataType, failType) + ).addCode(CodeBlock.of("return %T.getService<%T>().run(run).enqueue(%T(context))", retrofitCreateHelper, api, wpfRequest)) + } + + override fun visitEnd() { + if (outFileName.isNullOrEmpty() || funBuilder == null) return + if (outFileSpec == null) { + outFileSpec = FileSpec.builder(packageName, outFileName!!) + } + outFileSpec?.addFunction(funBuilder!!.build()) + super.visitEnd() + } +} \ No newline at end of file diff --git a/Quick-compiler-ksp/src/main/java/com/wpf/plugins/processor/TabInitProcessor.kt b/Quick-compiler-ksp/src/main/java/com/wpf/plugins/processor/TabInitProcessor.kt index ee15cc82..16bf4bb1 100644 --- a/Quick-compiler-ksp/src/main/java/com/wpf/plugins/processor/TabInitProcessor.kt +++ b/Quick-compiler-ksp/src/main/java/com/wpf/plugins/processor/TabInitProcessor.kt @@ -24,8 +24,6 @@ class TabInitProcessor(environment: SymbolProcessorEnvironment) : IdProcessor(en propertyName: String? ) { super.visitPropertyDeclaration(property, data, packageName, className, propertyName) - - val tabInitAnn = property.annotations.find { it.shortName.getShortName().contains(TabInit::class.simpleName!!) } diff --git a/QuickNetwork/src/main/java/com/wpf/app/quicknetwork/base/BaseRequest.kt b/QuickNetwork/src/main/java/com/wpf/app/quicknetwork/base/BaseRequest.kt index 27eb7059..ac254588 100644 --- a/QuickNetwork/src/main/java/com/wpf/app/quicknetwork/base/BaseRequest.kt +++ b/QuickNetwork/src/main/java/com/wpf/app/quicknetwork/base/BaseRequest.kt @@ -2,7 +2,7 @@ package com.wpf.app.quicknetwork.base /** * Created by 王朋飞 on 2022/7/22. - * + * 注解使用此类,移动需要修改注解代码 */ abstract class BaseRequest { diff --git a/app/src/main/java/com/wpf/app/quick/demo/http/TestApi.kt b/app/src/main/java/com/wpf/app/quick/demo/http/TestApi.kt index 037baf2a..015754e1 100644 --- a/app/src/main/java/com/wpf/app/quick/demo/http/TestApi.kt +++ b/app/src/main/java/com/wpf/app/quick/demo/http/TestApi.kt @@ -2,12 +2,14 @@ package com.wpf.app.quick.demo.http import com.wpf.app.quick.annotations.getclass.GetClass import com.wpf.app.quick.annotations.getclass.GetFun +import com.wpf.app.quick.annotations.request.GenerateRequest import com.wpf.app.quick.demo.wanandroid.model.首页文章 import retrofit2.http.GET import retrofit2.http.Path import retrofit2.http.Query @GetClass +@GenerateRequest(fileName = "TestService") interface TestApi { @GetFun diff --git a/app/src/main/java/com/wpf/app/quick/demo/http/TestService.kt b/app/src/main/java/com/wpf/app/quick/demo/http/TestService.kt deleted file mode 100644 index 20010da6..00000000 --- a/app/src/main/java/com/wpf/app/quick/demo/http/TestService.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.wpf.app.quick.demo.http - -import com.wpf.app.quicknetwork.base.* -import com.wpf.app.quicknetwork.call.RealCall -import com.wpf.app.quicknetwork.helper.RetrofitCreateHelper - -inline fun request(context: RequestCoroutineScope? = null, run: TestApi.() -> RealCall): BaseRequest { - return RetrofitCreateHelper.getService().run(run).enqueue(WpfRequest(context)) -} \ No newline at end of file