From ed7dd6fccb8b244e1d6cb4eec2d62ac1273be129 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 18 Sep 2018 14:38:34 +0300 Subject: [PATCH] Minor. Move serialization annotation fq-names to IDE light-classes They are a kind of a hack applied in light-classes and it'd be nice to prevent them being used in irrelevant contexts kotlin-serialization-compiler module should not depend on idea, thus we can't use annotations directly there. So, we copy-paste them and add a test on names consistency --- build.gradle.kts | 3 ++- .../jetbrains/kotlin/resolve/AnnotationUtil.kt | 3 --- .../lightClasses/IDELightClassContexts.kt | 4 ++-- .../idea/caches/lightClasses/annotations.kt | 11 +++++++++++ .../compiler/resolve/NamingConventions.kt | 11 ++++++----- .../kotlin-serialization-ide/build.gradle.kts | 2 +- .../AnnotationNamesConsistencyTest.kt | 18 ++++++++++++++++++ 7 files changed, 40 insertions(+), 12 deletions(-) create mode 100644 idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/annotations.kt create mode 100644 plugins/kotlin-serialization/kotlin-serialization-ide/test/org.jetbrains.kotlinx.serialization.idea/AnnotationNamesConsistencyTest.kt diff --git a/build.gradle.kts b/build.gradle.kts index 13c010b8b0f..59a4d60bfc7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -511,7 +511,8 @@ tasks { ":kotlin-noarg-compiler-plugin:test", ":kotlin-sam-with-receiver-compiler-plugin:test", ":plugins:uast-kotlin:test", - ":kotlin-annotation-processing-gradle:test") + ":kotlin-annotation-processing-gradle:test", + ":kotlinx-serialization-ide-plugin:test") } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationUtil.kt index 5a52742cb2f..578943d85b6 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationUtil.kt @@ -42,6 +42,3 @@ fun AnnotationDescriptor.argumentValue(parameterName: String): ConstantValue<*>? DeprecationLevel.ERROR ) val JVM_FIELD_ANNOTATION_FQ_NAME = FqName("kotlin.jvm.JvmField") - -val KOTLINX_SERIALIZABLE_FQ_NAME = FqName("kotlinx.serialization.Serializable") -val KOTLINX_SERIALIZER_FQ_NAME = FqName("kotlinx.serialization.Serializer") diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/IDELightClassContexts.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/IDELightClassContexts.kt index c58bec7e76a..00ff6905f7e 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/IDELightClassContexts.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/IDELightClassContexts.kt @@ -36,6 +36,8 @@ import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.frontend.di.configureModule import org.jetbrains.kotlin.idea.caches.lightClasses.IDELightClassConstructionContext.Mode.EXACT import org.jetbrains.kotlin.idea.caches.lightClasses.IDELightClassConstructionContext.Mode.LIGHT +import org.jetbrains.kotlin.idea.caches.lightClasses.annotations.KOTLINX_SERIALIZABLE_FQ_NAME +import org.jetbrains.kotlin.idea.caches.lightClasses.annotations.KOTLINX_SERIALIZER_FQ_NAME import org.jetbrains.kotlin.idea.caches.project.getModuleInfo import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.compiler.IDELanguageSettingsProvider @@ -52,8 +54,6 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext import org.jetbrains.kotlin.resolve.* -import org.jetbrains.kotlin.resolve.annotations.KOTLINX_SERIALIZABLE_FQ_NAME -import org.jetbrains.kotlin.resolve.annotations.KOTLINX_SERIALIZER_FQ_NAME import org.jetbrains.kotlin.resolve.calls.CallResolver import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext import org.jetbrains.kotlin.resolve.calls.context.CheckArgumentTypesMode diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/annotations.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/annotations.kt new file mode 100644 index 00000000000..d8974327822 --- /dev/null +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/annotations.kt @@ -0,0 +1,11 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.caches.lightClasses.annotations + +import org.jetbrains.kotlin.name.FqName + +val KOTLINX_SERIALIZABLE_FQ_NAME = FqName("kotlinx.serialization.Serializable") +val KOTLINX_SERIALIZER_FQ_NAME = FqName("kotlinx.serialization.Serializer") diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/NamingConventions.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/NamingConventions.kt index f54b836639e..750747adae4 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/NamingConventions.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/NamingConventions.kt @@ -1,10 +1,7 @@ package org.jetbrains.kotlinx.serialization.compiler.resolve -import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.resolve.annotations.KOTLINX_SERIALIZABLE_FQ_NAME -import org.jetbrains.kotlin.resolve.annotations.KOTLINX_SERIALIZER_FQ_NAME object SerializationPackages { internal val packageFqName = FqName("kotlinx.serialization") @@ -13,8 +10,12 @@ object SerializationPackages { } object SerializationAnnotations { - internal val serializableAnnotationFqName = KOTLINX_SERIALIZABLE_FQ_NAME - internal val serializerAnnotationFqName = KOTLINX_SERIALIZER_FQ_NAME + // When changing names for these annotations, please change + // org.jetbrains.kotlin.idea.caches.lightClasses.annotations.KOTLINX_SERIALIZABLE_FQ_NAME and + // org.jetbrains.kotlin.idea.caches.lightClasses.annotations.KOTLINX_SERIALIZER_FQ_NAME accordingly. + // Otherwise, there it might lead to exceptions from light classes when building them for serializer/serializable classes + val serializableAnnotationFqName = FqName("kotlinx.serialization.Serializable") + val serializerAnnotationFqName = FqName("kotlinx.serialization.Serializer") internal val serialNameAnnotationFqName = FqName("kotlinx.serialization.SerialName") internal val serialOptionalFqName = FqName("kotlinx.serialization.Optional") internal val serialTransientFqName = FqName("kotlinx.serialization.Transient") diff --git a/plugins/kotlin-serialization/kotlin-serialization-ide/build.gradle.kts b/plugins/kotlin-serialization/kotlin-serialization-ide/build.gradle.kts index df115696d5b..19fbd07aac6 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-ide/build.gradle.kts +++ b/plugins/kotlin-serialization/kotlin-serialization-ide/build.gradle.kts @@ -20,7 +20,7 @@ dependencies { sourceSets { "main" { projectDefault() } - "test" {} + "test" { projectDefault() } } runtimeJar() diff --git a/plugins/kotlin-serialization/kotlin-serialization-ide/test/org.jetbrains.kotlinx.serialization.idea/AnnotationNamesConsistencyTest.kt b/plugins/kotlin-serialization/kotlin-serialization-ide/test/org.jetbrains.kotlinx.serialization.idea/AnnotationNamesConsistencyTest.kt new file mode 100644 index 00000000000..dbdf6ca56a9 --- /dev/null +++ b/plugins/kotlin-serialization/kotlin-serialization-ide/test/org.jetbrains.kotlinx.serialization.idea/AnnotationNamesConsistencyTest.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ +package org.jetbrains.kotlinx.serialization.idea + +import junit.framework.TestCase +import org.jetbrains.kotlin.idea.caches.lightClasses.annotations.KOTLINX_SERIALIZABLE_FQ_NAME +import org.jetbrains.kotlin.idea.caches.lightClasses.annotations.KOTLINX_SERIALIZER_FQ_NAME +import org.jetbrains.kotlinx.serialization.compiler.resolve.SerializationAnnotations + + +class AnnotationNamesConsistencyTest : TestCase() { + fun testConsistency() { + assertEquals(KOTLINX_SERIALIZABLE_FQ_NAME, SerializationAnnotations.serializableAnnotationFqName) + assertEquals(KOTLINX_SERIALIZER_FQ_NAME, SerializationAnnotations.serializerAnnotationFqName) + } +}