Skip to content

Commit

Permalink
Fix compile errors because of missing import #490 #486 (#492)
Browse files Browse the repository at this point in the history
  • Loading branch information
Foso authored Nov 29, 2023
1 parent f9525bd commit 7225938
Show file tree
Hide file tree
Showing 18 changed files with 211 additions and 129 deletions.
5 changes: 5 additions & 0 deletions docs/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ and this project orients towards [Semantic Versioning](http://semver.org/spec/v2
Note: This project needs KSP to work and every new Ktorfit with an update of the KSP version is technically a breaking change.
But there is no intent to bump the Ktorfit major version for every KSP update.

1.10.2 - 2023-11-15
========================================
### Fixed
- fix compile errors because of missing import #490 #486

1.10.1 - 2023-11-15
========================================

Expand Down
4 changes: 2 additions & 2 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ kotlin = "1.9.20"
kotlinPoet = "1.14.2"
kspVersion = "1.9.20-1.0.14"
ktorfit = "1.10.1"
ktorfitGradlePlugin = "1.8.1"
ktorfitGradlePlugin = "1.10.1"
ktorVersion = "2.3.6"
mockk = "1.13.8"
mockito-kotlin = "4.1.0"
Expand All @@ -23,7 +23,7 @@ auto-service-ksp = { module = "dev.zacsweers.autoservice:auto-service-ksp", vers
autoService = { module = "com.google.auto.service:auto-service", version.ref = "autoService" }
gradle-maven-publish-plugin = { module = "com.vanniktech:gradle-maven-publish-plugin", version.ref = "gradleMavenPublishPlugin" }
kotlin-gradle-plugin-api = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin-api", version.ref = "kotlin" }
ktorfit-gradle-plugin = { module = "de.jensklingenberg.ktorfit:gradle-plugin", version.ref = "ktorfitGradlePlugin" }
ktorfit-gradle-plugin = { module = "de.jensklingenberg.ktorfit:ktorfit-gradle-plugin", version.ref = "ktorfitGradlePlugin" }
junit = { module = "junit:junit", version.ref = "junit" }
kctfork-core = { module = "dev.zacsweers.kctfork:core", version.ref = "kctfork" }
kctfork-ksp = { module = "dev.zacsweers.kctfork:ksp", version.ref = "kctfork" }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@ import com.google.devtools.ksp.symbol.KSFunctionDeclaration
import com.squareup.kotlinpoet.FunSpec
import com.squareup.kotlinpoet.KModifier
import com.squareup.kotlinpoet.ParameterSpec
import com.squareup.kotlinpoet.ParameterizedTypeName
import com.squareup.kotlinpoet.ksp.toTypeName
import de.jensklingenberg.ktorfit.model.annotations.*
import de.jensklingenberg.ktorfit.model.annotations.ParameterAnnotation.*
import de.jensklingenberg.ktorfit.reqBuilderExtension.getReqBuilderExtensionText
import de.jensklingenberg.ktorfit.typeData.addRequestConverterText
import de.jensklingenberg.ktorfit.typeData.getTypeDataArgumentText
import de.jensklingenberg.ktorfit.utils.*

data class FunctionData(
Expand All @@ -24,8 +24,9 @@ data class FunctionData(
) {

fun toFunSpec(resolver: Resolver): FunSpec {
val returnTypeName = this.returnType.name
val innerReturnType = this.returnType.innerTypeName
val returnTypeName = this.returnType.parameterType?.toTypeName()
val innerReturnType =
(returnTypeName as? ParameterizedTypeName)?.typeArguments?.first()?.toString() ?: returnTypeName

return FunSpec.builder(this.name)
.addModifiers(mutableListOf(KModifier.OVERRIDE).also {
Expand All @@ -45,10 +46,13 @@ data class FunctionData(
)
)
.addStatement(
getTypeDataArgumentText(
this.returnType,
)
"val ${typeDataClass.objectName} = ${typeDataClass.name}.createTypeData("
)
.addStatement(
"qualifiedTypename = \"%L\",",
this.returnType.parameterType.toTypeName().toString().removeWhiteSpaces()
)
.addStatement("typeInfo = typeInfo<%L>())\n", this.returnType.parameterType.toTypeName())
.addStatement(
"return %L.%L<${returnTypeName}, ${innerReturnType}>(%L,${extDataClass.objectName})%L",
converterHelper.objectName,
Expand All @@ -58,7 +62,7 @@ data class FunctionData(
"request"
},
typeDataClass.objectName,
if (this.returnType.isNullable) {
if (this.returnType.parameterType.isMarkedNullable) {
""
} else {
"!!"
Expand Down Expand Up @@ -97,7 +101,6 @@ fun KSFunctionDeclaration.toFunctionData(

val returnType = ReturnTypeData(
name = resolvedReturnType.resolveTypeName(),
qualifiedName = resolvedReturnType?.toTypeName().toString(),
parameterType = funcDeclaration.returnType?.resolve()
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,14 +52,12 @@ fun KSValueParameter.createParameterData(logger: KSPLogger): ParameterData {

val type = if (hasRequestBuilderAnno) {
ReturnTypeData(
"HttpRequestBuilder.()->Unit",
"HttpRequestBuilder.()->Unit",
parameterType,
)
} else {
ReturnTypeData(
parameterType.resolveTypeName(),
parameterType.declaration.qualifiedName?.asString().orEmpty(),
parameterType,
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,6 @@ import com.google.devtools.ksp.symbol.KSType

data class ReturnTypeData(
val name: String,
val qualifiedName: String,
val parameterType: KSType?
) {
val isNullable: Boolean = name.endsWith("?")
val innerTypeName = name.substringAfter("<").substringBeforeLast(">")
}
)

Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ fun getAttributeCode(parameterDataList: List<ParameterData>): String {
return parameterDataList.filter { it.hasAnnotation<ParameterAnnotation.Tag>() }
.joinToString("\n") {
val tag = it.findAnnotationOrNull<ParameterAnnotation.Tag>()!!
if (it.type.isNullable) {
if (it.type.parameterType?.isMarkedNullable == true) {
"${it.name}?.let{ attributes.put(io.ktor.util.AttributeKey(\"${tag.value}\"), it) }"
} else {
"attributes.put(io.ktor.util.AttributeKey(\"${tag.value}\"), ${it.name})"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
package de.jensklingenberg.ktorfit.reqBuilderExtension

import com.google.devtools.ksp.symbol.KSType
import com.squareup.kotlinpoet.ParameterizedTypeName
import com.squareup.kotlinpoet.ksp.toTypeName
import de.jensklingenberg.ktorfit.model.ParameterData
import de.jensklingenberg.ktorfit.model.annotations.*
import de.jensklingenberg.ktorfit.model.annotations.ParameterAnnotation.*
import de.jensklingenberg.ktorfit.model.annotations.FormUrlEncoded
import de.jensklingenberg.ktorfit.model.annotations.FunctionAnnotation
import de.jensklingenberg.ktorfit.model.annotations.Headers
import de.jensklingenberg.ktorfit.model.annotations.ParameterAnnotation.Header
import de.jensklingenberg.ktorfit.model.annotations.ParameterAnnotation.HeaderMap
import de.jensklingenberg.ktorfit.utils.anyInstance
import de.jensklingenberg.ktorfit.utils.surroundIfNotEmpty

Expand All @@ -29,19 +34,27 @@ fun getHeadersCode(
val isArray = starProj?.isAssignableFrom(arrayType) ?: false

val headerName = parameterData.findAnnotationOrNull<Header>()?.path.orEmpty()
val isStringType = parameterData.type.qualifiedName == "kotlin.String"

val isStringType = (parameterData.type.parameterType?.toTypeName().toString() == "kotlin.String") || (parameterData.type.parameterType?.toTypeName().toString() == "kotlin.String?")

when {
isList || isArray -> {
val hasNullableInnerType = parameterData.type.innerTypeName.endsWith("?")
val isStringListOrArray = when (parameterData.type.innerTypeName) {
"String", "String?" -> true
else -> false
}

val innerType =
(parameterData.type.parameterType?.toTypeName() as? ParameterizedTypeName)?.typeArguments?.joinToString { it.toString() }
.orEmpty()
val hasNullableInnerType =
innerType.endsWith("?")
val isStringListOrArray =
when ((parameterData.type.parameterType?.toTypeName() as? ParameterizedTypeName)?.typeArguments?.joinToString { it.toString() }
.orEmpty()) {
"kotlin.String", "kotlin.String?" -> true
else -> false
}
val headerListStringBuilder = StringBuilder()

headerListStringBuilder.append(
if (parameterData.type.isNullable) {
if (parameterData.type.parameterType?.isMarkedNullable ?: false) {
"$paramName?"
} else {
paramName
Expand All @@ -50,7 +63,7 @@ fun getHeadersCode(

if (hasNullableInnerType) {
headerListStringBuilder.append(
if (parameterData.type.isNullable) {
if (parameterData.type.parameterType?.isMarkedNullable ?: false) {
".filterNotNull()?"
} else {
".filterNotNull()"
Expand All @@ -74,7 +87,7 @@ fun getHeadersCode(
val headerValue =
if (isStringType) paramName else "\"\$$paramName\""

if (parameterData.type.isNullable) {
if (parameterData.type.parameterType?.isMarkedNullable ?: false) {
"%s?.let{ append(\"%s\", %s) }\n".format(
paramName,
headerName,
Expand All @@ -98,12 +111,14 @@ fun getHeadersCode(
val headerMapAnnotationText = parameterDataList
.filter { it.hasAnnotation<HeaderMap>() }
.joinToString("") { parameterData ->
val mapValueType = parameterData.type.innerTypeName.split(",")[1].trim()
val valueIsString = (mapValueType == "String" || mapValueType == "String?")
val mapValueType =
(parameterData.type.parameterType?.toTypeName() as? ParameterizedTypeName)?.typeArguments?.joinToString { it.toString() }
.orEmpty().split(",").getOrNull(1)?.trim().orEmpty()
val valueIsString = (mapValueType == "kotlin.String" || mapValueType == "kotlin.String?")

val headerMapStringBuilder = StringBuilder()
headerMapStringBuilder.append(
if (parameterData.type.isNullable) {
if (parameterData.type.parameterType?.isMarkedNullable ?: false) {
"${parameterData.name}?"
} else {
parameterData.name
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package de.jensklingenberg.ktorfit

import com.google.devtools.ksp.symbol.KSClassDeclaration
import com.google.devtools.ksp.symbol.KSName
import com.google.devtools.ksp.symbol.KSType
import com.google.devtools.ksp.symbol.*
import com.squareup.kotlinpoet.FunSpec
import de.jensklingenberg.ktorfit.model.ParameterData
import de.jensklingenberg.ktorfit.model.ReturnTypeData
Expand All @@ -23,47 +21,58 @@ class RequestConverterTextKtTest {
}
"""

val mockDec = mock<KSClassDeclaration>()
val packagemockKSName = object : KSName {
override fun asString(): String {
return "com.example"
}
val ksType = createKsType("Test","com.example")
val parameterAnnotations = listOf<ParameterAnnotation>(RequestType(ksType))
val parameterData =
ParameterData("test1", ReturnTypeData("String", null), annotations = parameterAnnotations)
val params = listOf(parameterData)


val actualSource = FunSpec.builder("TestFunction").addRequestConverterText(params).build().toString()

assertEquals(expected, actualSource)
}


}

override fun getQualifier(): String {
return ""
}
fun createKsType(name: String, packageName: String): KSType {
val mockDec = mock<KSClassDeclaration>()

override fun getShortName(): String {
return ""
}
whenever(mockDec.simpleName).thenAnswer { name }

val packagemockKSName = object : KSName {
override fun asString(): String {
return packageName
}
val qualifiedMockKSName = object : KSName {
override fun asString(): String {
return "com.example.Test"
}

override fun getQualifier(): String {
return ""
}
override fun getQualifier(): String {
return ""
}

override fun getShortName(): String {
return ""
}
override fun getShortName(): String {
return ""
}

}
val qualifiedMockKSName = object : KSName {
override fun asString(): String {
return name
}
whenever(mockDec.packageName).thenAnswer { packagemockKSName }
whenever(mockDec.qualifiedName).thenAnswer { qualifiedMockKSName }
val ksType = mock<KSType>()
whenever(ksType.declaration).thenAnswer { mockDec }
val parameterAnnotations = listOf<ParameterAnnotation>(RequestType(ksType))
val parameterData =
ParameterData("test1", ReturnTypeData("String", "kotlin.String", null), annotations = parameterAnnotations)
val params = listOf(parameterData)

override fun getQualifier(): String {
return ""
}

val actualSource = FunSpec.builder("TestFunction").addRequestConverterText(params).build().toString()
override fun getShortName(): String {
return ""
}

assertEquals(expected, actualSource)
}
whenever(mockDec.packageName).thenAnswer { packagemockKSName }
whenever(mockDec.qualifiedName).thenAnswer { qualifiedMockKSName }

val ksType = mock<KSType>()
whenever(ksType.declaration).thenAnswer { mockDec }
return ksType
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ interface TestService {
)


val expectedFunctionText = """return _converter.suspendRequest<HttpStatement, HttpStatement>(_typeData,_ext)!!"""
val expectedFunctionText = """return _converter.suspendRequest<io.ktor.client.statement.HttpStatement,
io.ktor.client.statement.HttpStatement>(_typeData,_ext)!!"""

val compilation = getCompilation(listOf(httpStatement, source))
val result = compilation.compile()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package de.jensklingenberg.ktorfit.reqBuilderExtension

import com.google.devtools.ksp.symbol.KSType
import de.jensklingenberg.ktorfit.createKsType
import de.jensklingenberg.ktorfit.model.ParameterData
import de.jensklingenberg.ktorfit.model.ReturnTypeData
import de.jensklingenberg.ktorfit.model.annotations.ParameterAnnotation.Field
Expand All @@ -16,7 +17,8 @@ class FieldArgumentsTextKtTest {

@Test
fun testWithoutFieldAnnotation() {
val parameterData = ParameterData("test1", ReturnTypeData("String", "kotlin.String", null))
val stringType = createKsType("String", "kotlin")
val parameterData = ParameterData("test1", ReturnTypeData("String", stringType))
val params = listOf(parameterData)
val text = getFieldArgumentsText(params, listType, arrayType)
assertEquals("", text)
Expand All @@ -29,12 +31,12 @@ class FieldArgumentsTextKtTest {

val parameterData1 = ParameterData(
"test1",
ReturnTypeData("String", "kotlin.String", null),
ReturnTypeData("String", null),
annotations = listOf(fieldAnnotation)
)
val parameterData2 = ParameterData(
"test1",
ReturnTypeData("String", "kotlin.String", null),
ReturnTypeData("String", null),
annotations = listOf(fieldAnnotationEncoded)
)

Expand All @@ -58,17 +60,17 @@ class FieldArgumentsTextKtTest {

val parameterData1 = ParameterData(
"test1",
ReturnTypeData("String", "kotlin.String", null),
ReturnTypeData("String", null),
annotations = listOf(fieldAnnotation)
)
val parameterData2 = ParameterData(
"test2",
ReturnTypeData("String", "kotlin.String", null),
ReturnTypeData("String", null),
annotations = listOf(fieldAnnotationEncoded)
)
val parameterData3 = ParameterData(
"test3",
ReturnTypeData("String", "kotlin.String", null),
ReturnTypeData("String", null),
annotations = listOf(fieldMapAnnotation)
)

Expand Down
Loading

0 comments on commit 7225938

Please sign in to comment.