diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index 29ff23c..dc45792 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -44,7 +44,7 @@ object Dependencies { } object KotlinPoet { - private const val version = "1.6.0" + private const val version = "1.7.2" const val kotlinPoet = "com.squareup:kotlinpoet:$version" const val metadata = "com.squareup:kotlinpoet-metadata-specs:$version" const val metadataSpecs = "com.squareup:kotlinpoet-metadata-specs:$version" diff --git a/kotlin/codegen/build.gradle.kts b/kotlin/codegen/build.gradle.kts index 66c477d..1311a99 100644 --- a/kotlin/codegen/build.gradle.kts +++ b/kotlin/codegen/build.gradle.kts @@ -60,9 +60,11 @@ dependencies { exclude(group = "org.jetbrains.kotlin") exclude(group = "com.squareup", module = "kotlinpoet") } + api(Dependencies.KotlinPoet.elementsClassInspector) shade(Dependencies.KotlinPoet.elementsClassInspector) { exclude(group = "org.jetbrains.kotlin") exclude(group = "com.squareup", module = "kotlinpoet") + exclude(group = "com.google.guava") } api(Dependencies.asm) diff --git a/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/metadata.kt b/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/metadata.kt index 349518b..3531e4d 100644 --- a/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/metadata.kt +++ b/kotlin/codegen/src/main/java/com/squareup/moshi/kotlin/codegen/metadata.kt @@ -488,7 +488,10 @@ internal fun TargetProperty.generator( private fun List?.qualifiers(elements: Elements): Set { if (this == null) return setOf() return filterTo(mutableSetOf()) { - elements.getTypeElement(it.typeName.toString()).getAnnotation(JSON_QUALIFIER) != null + val typeElement = checkNotNull(elements.getTypeElement(it.typeName.rawType().canonicalName)) { + "Could not get the type element of $it" + } + typeElement.getAnnotation(JSON_QUALIFIER) != null } } diff --git a/kotlin/tests/src/test/kotlin/com/squareup/moshi/kotlin/codegen/GeneratedAdaptersTest.kt b/kotlin/tests/src/test/kotlin/com/squareup/moshi/kotlin/codegen/GeneratedAdaptersTest.kt index 410cda5..3632ca1 100644 --- a/kotlin/tests/src/test/kotlin/com/squareup/moshi/kotlin/codegen/GeneratedAdaptersTest.kt +++ b/kotlin/tests/src/test/kotlin/com/squareup/moshi/kotlin/codegen/GeneratedAdaptersTest.kt @@ -28,6 +28,8 @@ import com.squareup.moshi.Moshi import com.squareup.moshi.ToJson import com.squareup.moshi.adapter import com.squareup.moshi.internal.NullSafeJsonAdapter +import com.squareup.moshi.kotlin.codegen.annotation.UppercaseInAnnotationPackage +import com.squareup.moshi.kotlin.codegen.annotation.UppercaseInAnnotationPackageJsonAdapter import org.intellij.lang.annotations.Language import org.junit.Assert.assertNull import org.junit.Assert.fail @@ -510,6 +512,22 @@ class GeneratedAdaptersTest { @JsonClass(generateAdapter = true) class ConstructorParameterWithQualifier(@Uppercase(inFrench = true) var a: String, var b: String) + @Test fun constructorParameterWithQualifierInAnnotationPackage() { + val moshi = Moshi.Builder() + .add(UppercaseInAnnotationPackageJsonAdapter()) + .build() + val jsonAdapter = moshi.adapter() + + val encoded = ConstructorParameterWithQualifierInAnnotationPackage("Android") + assertThat(jsonAdapter.toJson(encoded)).isEqualTo("""{"a":"ANDROID"}""") + + val decoded = jsonAdapter.fromJson("""{"a":"Android"}""")!! + assertThat(decoded.a).isEqualTo("android") + } + + @JsonClass(generateAdapter = true) + class ConstructorParameterWithQualifierInAnnotationPackage(@UppercaseInAnnotationPackage var a: String) + @Test fun propertyWithQualifier() { val moshi = Moshi.Builder() .add(UppercaseJsonAdapter()) diff --git a/kotlin/tests/src/test/kotlin/com/squareup/moshi/kotlin/codegen/annotation/UppercaseInAnnotationPackage.kt b/kotlin/tests/src/test/kotlin/com/squareup/moshi/kotlin/codegen/annotation/UppercaseInAnnotationPackage.kt new file mode 100644 index 0000000..85f417f --- /dev/null +++ b/kotlin/tests/src/test/kotlin/com/squareup/moshi/kotlin/codegen/annotation/UppercaseInAnnotationPackage.kt @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2021 Square, Inc. + * + * 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 com.squareup.moshi.kotlin.codegen.annotation + +import com.squareup.moshi.FromJson +import com.squareup.moshi.JsonQualifier +import com.squareup.moshi.ToJson +import java.util.Locale + +@JsonQualifier +annotation class UppercaseInAnnotationPackage + +class UppercaseInAnnotationPackageJsonAdapter { + @ToJson fun toJson(@UppercaseInAnnotationPackage s: String): String { + return s.toUpperCase(Locale.US) + } + @FromJson @UppercaseInAnnotationPackage fun fromJson(s: String): String { + return s.toLowerCase(Locale.US) + } +}