Skip to content

Commit

Permalink
Treat warnings as errors (#251)
Browse files Browse the repository at this point in the history
  • Loading branch information
ansman authored Jul 17, 2023
1 parent f55b583 commit 9da23d0
Show file tree
Hide file tree
Showing 8 changed files with 112 additions and 43 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ import com.google.common.collect.SetMultimap
import com.squareup.kotlinpoet.metadata.isData
import com.squareup.kotlinpoet.metadata.isEnum
import com.squareup.kotlinpoet.metadata.isObject
import com.squareup.kotlinpoet.metadata.isSealed
import kotlinx.metadata.Modality
import kotlinx.metadata.modality
import se.ansman.kotshi.Errors
import se.ansman.kotshi.JsonDefaultValue
import se.ansman.kotshi.JsonSerializable
Expand Down Expand Up @@ -131,7 +132,7 @@ class AdaptersProcessingStep(
messager = messager
)

metadata.flags.isSealed -> SealedClassAdapterGenerator(
metadata.modality == Modality.SEALED -> SealedClassAdapterGenerator(
metadataAccessor = metadataAccessor,
types = types,
element = typeElement,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,38 @@
package se.ansman.kotshi.kapt

import com.google.auto.common.MoreTypes
import com.squareup.kotlinpoet.*
import com.squareup.kotlinpoet.BOOLEAN_ARRAY
import com.squareup.kotlinpoet.BYTE_ARRAY
import com.squareup.kotlinpoet.CHAR_ARRAY
import com.squareup.kotlinpoet.ClassName
import com.squareup.kotlinpoet.DOUBLE_ARRAY
import com.squareup.kotlinpoet.DelicateKotlinPoetApi
import com.squareup.kotlinpoet.FLOAT_ARRAY
import com.squareup.kotlinpoet.INT_ARRAY
import com.squareup.kotlinpoet.LONG_ARRAY
import com.squareup.kotlinpoet.ParameterizedTypeName
import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
import com.squareup.kotlinpoet.SHORT_ARRAY
import com.squareup.kotlinpoet.STAR
import com.squareup.kotlinpoet.TypeName
import com.squareup.kotlinpoet.U_BYTE
import com.squareup.kotlinpoet.U_BYTE_ARRAY
import com.squareup.kotlinpoet.U_INT
import com.squareup.kotlinpoet.U_INT_ARRAY
import com.squareup.kotlinpoet.U_LONG
import com.squareup.kotlinpoet.U_LONG_ARRAY
import com.squareup.kotlinpoet.U_SHORT
import com.squareup.kotlinpoet.U_SHORT_ARRAY
import com.squareup.kotlinpoet.WildcardTypeName
import com.squareup.kotlinpoet.asTypeName
import com.squareup.kotlinpoet.metadata.isNullable
import com.squareup.kotlinpoet.metadata.isPrimaryConstructor
import com.squareup.kotlinpoet.tags.TypeAliasTag
import kotlinx.metadata.*
import kotlinx.metadata.KmClassifier
import kotlinx.metadata.KmFlexibleTypeUpperBound
import kotlinx.metadata.KmType
import kotlinx.metadata.KmTypeProjection
import kotlinx.metadata.KmVariance
import kotlinx.metadata.isSecondary
import se.ansman.kotshi.model.AnnotationModel
import javax.lang.model.element.AnnotationMirror
import javax.lang.model.element.AnnotationValue
Expand Down Expand Up @@ -87,7 +112,7 @@ class AnnotationModelValueVisitor(

val typesByName = metadata
?.constructors
?.find { it.flags.isPrimaryConstructor }
?.find { !it.isSecondary }
?.valueParameters
?.associateBy({ it.name }) { it.type.toAnnotationTypeName() }
?: emptyMap()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,16 @@ import com.google.common.collect.SetMultimap
import com.squareup.kotlinpoet.DelicateKotlinPoetApi
import com.squareup.kotlinpoet.asTypeName
import com.squareup.kotlinpoet.asTypeVariableName
import com.squareup.kotlinpoet.metadata.isAbstract
import com.squareup.kotlinpoet.metadata.isClass
import com.squareup.kotlinpoet.metadata.isCompanionObjectClass
import com.squareup.kotlinpoet.metadata.isEnumClass
import com.squareup.kotlinpoet.metadata.isInnerClass
import com.squareup.kotlinpoet.metadata.isInterface
import com.squareup.kotlinpoet.metadata.isInternal
import com.squareup.kotlinpoet.metadata.isLocal
import com.squareup.kotlinpoet.metadata.isObject
import com.squareup.kotlinpoet.metadata.isObjectClass
import com.squareup.kotlinpoet.metadata.isPublic
import com.squareup.kotlinpoet.metadata.isSealed
import com.squareup.moshi.JsonAdapter
import kotlinx.metadata.ClassKind
import kotlinx.metadata.Modality
import kotlinx.metadata.Visibility
import kotlinx.metadata.isInner
import kotlinx.metadata.kind
import kotlinx.metadata.modality
import kotlinx.metadata.visibility
import se.ansman.kotshi.Errors
import se.ansman.kotshi.Errors.abstractFactoriesAreDeprecated
import se.ansman.kotshi.ExperimentalKotshiApi
Expand Down Expand Up @@ -73,7 +70,10 @@ class FactoryProcessingStep(
.map(MoreElements::asType)
val manuallyRegisteredAdapters = elementsByAnnotation.getManualAdapters(elements.isNotEmpty()).toList()
if (elements.size > 1) {
messager.logKotshiError(Errors.multipleFactories(elements.map { it.qualifiedName.toString() }), elements.first())
messager.logKotshiError(
Errors.multipleFactories(elements.map { it.qualifiedName.toString() }),
elements.first()
)
} else for (element in elements) {
try {
generateFactory(element, manuallyRegisteredAdapters)
Expand All @@ -92,7 +92,10 @@ class FactoryProcessingStep(
Modifier.ABSTRACT in element.modifiers
) {
messager.logKotshiWarning(abstractFactoriesAreDeprecated, element)
JsonAdapterFactory.UsageType.Subclass(elementClassName, parentIsInterface = element.kind == ElementKind.INTERFACE)
JsonAdapterFactory.UsageType.Subclass(
elementClassName,
parentIsInterface = element.kind == ElementKind.INTERFACE
)
} else {
JsonAdapterFactory.UsageType.Standalone
},
Expand All @@ -101,7 +104,8 @@ class FactoryProcessingStep(
)

val createAnnotationsUsingConstructor =
createAnnotationsUsingConstructor ?: metadataAccessor.getMetadata(element).supportsCreatingAnnotationsWithConstructor
createAnnotationsUsingConstructor
?: metadataAccessor.getMetadata(element).supportsCreatingAnnotationsWithConstructor

JsonAdapterFactoryRenderer(factory, createAnnotationsUsingConstructor)
.render(generatedAnnotation) {
Expand All @@ -127,19 +131,29 @@ class FactoryProcessingStep(
return@mapNotNull null
}
if (!kmClass.isObject && (!kmClass.isClass ||
kmClass.flags.isAbstract ||
kmClass.flags.isLocal ||
kmClass.flags.isInnerClass ||
kmClass.flags.isSealed ||
kmClass.flags.isEnumClass
kmClass.modality == Modality.ABSTRACT ||
kmClass.visibility == Visibility.LOCAL ||
kmClass.isInner ||
kmClass.modality == Modality.SEALED ||
kmClass.kind == ClassKind.ENUM_CLASS
)
) {
messager.logKotshiError(Errors.invalidRegisterAdapterType, element)
return@mapNotNull null
}
if (!kmClass.flags.isPublic && !kmClass.flags.isInternal) {
messager.logKotshiError(Errors.invalidRegisterAdapterVisibility, element)
return@mapNotNull null
when (kmClass.visibility) {
Visibility.PUBLIC,
Visibility.INTERNAL -> {
// no-op
}

Visibility.PRIVATE,
Visibility.PROTECTED,
Visibility.PRIVATE_TO_THIS,
Visibility.LOCAL -> {
messager.logKotshiError(Errors.invalidRegisterAdapterVisibility, element)
return@mapNotNull null
}
}

if (!hasFactory) {
Expand All @@ -152,11 +166,31 @@ class FactoryProcessingStep(
getSuperClass = {
superclass.takeUnless { it.kind == TypeKind.NONE }?.let(MoreTypes::asTypeElement)
},
getSuperTypeName = { metadataAccessor.getTypeSpecOrNull(this)?.superclass ?: superclass.asTypeName() },
getSuperTypeName = {
metadataAccessor.getTypeSpecOrNull(this)?.superclass ?: superclass.asTypeName()
},
adapterClassName = createClassName(kmClass.name),
typeVariables = { metadataAccessor.getTypeSpecOrNull(this)?.typeVariables ?: typeParameters.map { it.asTypeVariableName() } },
isObject = kmClass.flags.isObjectClass || kmClass.flags.isCompanionObjectClass,
isAbstract = kmClass.flags.isInterface || kmClass.flags.isAbstract || kmClass.flags.isSealed,
typeVariables = {
metadataAccessor.getTypeSpecOrNull(this)?.typeVariables
?: typeParameters.map { it.asTypeVariableName() }
},
isObject = when (kmClass.kind) {
ClassKind.CLASS,
ClassKind.INTERFACE,
ClassKind.ENUM_CLASS,
ClassKind.ENUM_ENTRY,
ClassKind.ANNOTATION_CLASS -> false

ClassKind.OBJECT,
ClassKind.COMPANION_OBJECT -> true
},
isAbstract = kmClass.kind == ClassKind.INTERFACE || when (kmClass.modality) {
Modality.FINAL,
Modality.OPEN -> false

Modality.ABSTRACT,
Modality.SEALED -> true
},
priority = annotation.priority,
getKotshiConstructor = {
metadataAccessor.getTypeSpec(this).constructors().findKotshiConstructor(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package se.ansman.kotshi.kapt

import com.squareup.kotlinpoet.*
import com.squareup.kotlinpoet.ClassName
import com.squareup.kotlinpoet.DelicateKotlinPoetApi
import com.squareup.kotlinpoet.TypeSpec
import com.squareup.kotlinpoet.asClassName
import com.squareup.kotlinpoet.metadata.specs.ClassInspector
import com.squareup.kotlinpoet.metadata.specs.toTypeSpec
import com.squareup.kotlinpoet.metadata.toKmClass
import com.squareup.kotlinpoet.tag
import kotlinx.metadata.KmClass
import kotlinx.metadata.isLocal
import kotlinx.metadata.isLocalClassName
import se.ansman.kotshi.Errors.javaClassNotSupported
import javax.lang.model.element.Element
import javax.lang.model.element.TypeElement
Expand Down Expand Up @@ -42,7 +46,7 @@ class MetadataAccessor(private val classInspector: ClassInspector) {
}

fun createClassName(kotlinMetadataName: String): ClassName {
require(!kotlinMetadataName.isLocal) {
require(!kotlinMetadataName.isLocalClassName()) {
"Local/anonymous classes are not supported!"
}
// Top-level: package/of/class/MyClass
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,10 @@ import com.squareup.kotlinpoet.TypeName
import com.squareup.kotlinpoet.TypeSpec
import com.squareup.kotlinpoet.TypeVariableName
import com.squareup.kotlinpoet.metadata.isInner
import com.squareup.kotlinpoet.metadata.isInternal
import com.squareup.kotlinpoet.metadata.isLocal
import com.squareup.kotlinpoet.metadata.isPublic
import com.squareup.kotlinpoet.tag
import kotlinx.metadata.KmClass
import kotlinx.metadata.Visibility
import kotlinx.metadata.visibility
import se.ansman.kotshi.Errors
import se.ansman.kotshi.Polymorphic
import se.ansman.kotshi.PolymorphicLabel
Expand Down Expand Up @@ -69,9 +68,9 @@ abstract class AdapterGenerator(
when {
kmClass.isInner ->
throw KaptProcessingError(Errors.dataClassCannotBeInner, targetElement)
kmClass.flags.isLocal ->
kmClass.visibility == Visibility.LOCAL ->
throw KaptProcessingError(Errors.dataClassCannotBeLocal, targetElement)
!kmClass.flags.isPublic && !kmClass.flags.isInternal ->
kmClass.visibility != Visibility.PUBLIC && kmClass.visibility != Visibility.INTERNAL->
throw KaptProcessingError(Errors.privateClass, targetElement)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,11 @@ import kotlinx.metadata.jvm.signature
import se.ansman.kotshi.Errors
import se.ansman.kotshi.Errors.privateDataClassProperty
import se.ansman.kotshi.JsonSerializable
import se.ansman.kotshi.kapt.*
import se.ansman.kotshi.kapt.KaptProcessingError
import se.ansman.kotshi.kapt.MetadataAccessor
import se.ansman.kotshi.kapt.isJsonIgnore
import se.ansman.kotshi.kapt.jsonName
import se.ansman.kotshi.kapt.qualifiers
import se.ansman.kotshi.model.DataClassJsonAdapter
import se.ansman.kotshi.model.GeneratableJsonAdapter
import se.ansman.kotshi.model.GlobalConfig
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@ package se.ansman.kotshi.kapt.generators
import com.squareup.kotlinpoet.ClassName
import com.squareup.kotlinpoet.KModifier
import com.squareup.kotlinpoet.STAR
import com.squareup.kotlinpoet.metadata.isSealed
import com.squareup.kotlinpoet.tag
import kotlinx.metadata.KmClass
import kotlinx.metadata.Modality
import kotlinx.metadata.modality
import se.ansman.kotshi.Errors
import se.ansman.kotshi.Errors.defaultSealedValueIsGeneric
import se.ansman.kotshi.Errors.multipleJsonDefaultValueInSealedClass
Expand Down Expand Up @@ -34,7 +35,7 @@ class SealedClassAdapterGenerator(
messager: Messager,
) : AdapterGenerator(metadataAccessor, types, elements, element, metadata, globalConfig, messager) {
init {
require(metadata.flags.isSealed)
require(metadata.modality == Modality.SEALED)
}

override fun getGeneratableJsonAdapter(): GeneratableJsonAdapter {
Expand Down Expand Up @@ -104,7 +105,7 @@ class SealedClassAdapterGenerator(
typeElement to metadataAccessor.getKmClass(typeElement)
}
},
isSealed = { second.flags.isSealed },
isSealed = { second.modality == Modality.SEALED },
hasAnnotation = { first.getAnnotation(it) != null },
getPolymorphicLabelKey = { first.getAnnotation(Polymorphic::class.java)?.labelKey },
getPolymorphicLabel = { first.getAnnotation(PolymorphicLabel::class.java)?.value },
Expand Down
1 change: 1 addition & 0 deletions gradle-plugin/src/main/kotlin/library.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ extensions.configure<JavaPluginExtension> {
tasks.withType<KotlinCompile>().configureEach {
kotlinOptions {
jvmTarget = "1.8"
allWarningsAsErrors = true
freeCompilerArgs = freeCompilerArgs + listOf(
"-opt-in=kotlin.RequiresOptIn",
"-Xjvm-default=all"
Expand Down

0 comments on commit 9da23d0

Please sign in to comment.