diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java index 1ea3eb67888..e67e18a3f2d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java @@ -29,7 +29,7 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; import org.jetbrains.kotlin.descriptors.annotations.Annotated; import org.jetbrains.kotlin.descriptors.annotations.AnnotatedImpl; import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor; -import org.jetbrains.kotlin.descriptors.annotations.AnnotationsImpl; +import org.jetbrains.kotlin.descriptors.annotations.Annotations; import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader; import org.jetbrains.kotlin.metadata.ProtoBuf; import org.jetbrains.kotlin.name.FqName; @@ -84,7 +84,7 @@ public class PackagePartCodegen extends MemberCodegen { fileAnnotationDescriptors.add(annotationDescriptor); } } - Annotated annotatedFile = new AnnotatedImpl(new AnnotationsImpl(fileAnnotationDescriptors)); + Annotated annotatedFile = new AnnotatedImpl(Annotations.Companion.create(fileAnnotationDescriptors)); AnnotationCodegen.forClass(v.getVisitor(), this, state.getTypeMapper()).genAnnotations(annotatedFile, null); } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationSplitter.kt b/compiler/frontend/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationSplitter.kt index 42d760bca55..e1841e3c6a5 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationSplitter.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationSplitter.kt @@ -114,7 +114,7 @@ class AnnotationSplitter( } } - map to AnnotationsImpl(other) + map to Annotations.create(other) } fun getOtherAnnotations(): Annotations = LazySplitAnnotations(storageManager, null) @@ -129,7 +129,7 @@ class AnnotationSplitter( val (targeted, other) = this@AnnotationSplitter.splitAnnotations() if (target != null) { - targeted[target]?.let(::AnnotationsImpl) ?: Annotations.EMPTY + targeted[target]?.let((Annotations)::create) ?: Annotations.EMPTY } else { other } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt index 524e04f104e..dd3cc902c45 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt @@ -17,7 +17,10 @@ package org.jetbrains.kotlin.resolve import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.builtins.* +import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.builtins.getReceiverTypeFromFunctionType +import org.jetbrains.kotlin.builtins.getValueParameterTypesFromFunctionType +import org.jetbrains.kotlin.builtins.isBuiltinFunctionalType import org.jetbrains.kotlin.config.AnalysisFlag import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageVersionSettings @@ -28,7 +31,6 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.AnnotationSplitter import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.descriptors.annotations.Annotations -import org.jetbrains.kotlin.descriptors.annotations.AnnotationsImpl import org.jetbrains.kotlin.descriptors.impl.ClassConstructorDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.FunctionExpressionDescriptor import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl @@ -48,7 +50,6 @@ import org.jetbrains.kotlin.resolve.ModifiersChecker.resolveMemberModalityFromMo import org.jetbrains.kotlin.resolve.ModifiersChecker.resolveVisibilityFromModifiers import org.jetbrains.kotlin.resolve.bindingContextUtil.recordScope import org.jetbrains.kotlin.resolve.calls.DslMarkerUtils -import org.jetbrains.kotlin.resolve.calls.checkers.DslScopeViolationCallChecker import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo import org.jetbrains.kotlin.resolve.calls.util.createValueParametersForInvokeInFunctionType import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil @@ -308,7 +309,7 @@ class FunctionDescriptorResolver( private fun KotlinType.removeParameterNameAnnotation(): KotlinType { if (this is TypeUtils.SpecialType) return this val parameterNameAnnotation = annotations.findAnnotation(KotlinBuiltIns.FQ_NAMES.parameterName) ?: return this - return replaceAnnotations(AnnotationsImpl(annotations.filter { it != parameterNameAnnotation })) + return replaceAnnotations(Annotations.create(annotations.filter { it != parameterNameAnnotation })) } private fun KotlinType.functionTypeExpected() = !TypeUtils.noExpectedType(this) && isBuiltinFunctionalType diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/builtins/jvm/JvmBuiltInsSettings.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/builtins/jvm/JvmBuiltInsSettings.kt index 4af1c60c296..9ea7877be4d 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/builtins/jvm/JvmBuiltInsSettings.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/builtins/jvm/JvmBuiltInsSettings.kt @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.builtins.jvm import org.jetbrains.kotlin.builtins.BuiltInsInitializer import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.descriptors.annotations.AnnotationsImpl +import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.annotations.createDeprecatedAnnotation import org.jetbrains.kotlin.descriptors.deserialization.AdditionalClassPartsProvider import org.jetbrains.kotlin.descriptors.deserialization.PLATFORM_DEPENDENT_ANNOTATION_FQ_NAME @@ -64,9 +64,10 @@ open class JvmBuiltInsSettings( // Most this properties are lazy because they depends on KotlinBuiltIns initialization that depends on JvmBuiltInsSettings object private val notConsideredDeprecation by storageManager.createLazyValue { - moduleDescriptor.builtIns.createDeprecatedAnnotation( + val annotation = moduleDescriptor.builtIns.createDeprecatedAnnotation( "This member is not fully supported by Kotlin compiler, so it may be absent or have different signature in next major version" - ).let { AnnotationsImpl(listOf(it)) } + ) + Annotations.create(listOf(annotation)) } private fun StorageManager.createMockJavaIoSerializableType(): KotlinType { diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/functionTypes.kt b/core/descriptors/src/org/jetbrains/kotlin/builtins/functionTypes.kt index 4c0a53075fa..7c704524dc5 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/functionTypes.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/functionTypes.kt @@ -10,7 +10,6 @@ import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.annotations.Annotations -import org.jetbrains.kotlin.descriptors.annotations.AnnotationsImpl import org.jetbrains.kotlin.descriptors.annotations.BuiltInAnnotationDescriptor import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqNameUnsafe @@ -165,7 +164,7 @@ fun getFunctionTypeArgumentProjections( KotlinBuiltIns.FQ_NAMES.parameterName, mapOf(Name.identifier("name") to StringValue(name.asString())) ) - type.replaceAnnotations(AnnotationsImpl(type.annotations + parameterNameAnnotation)) + type.replaceAnnotations(Annotations.create(type.annotations + parameterNameAnnotation)) } else { type @@ -199,8 +198,9 @@ fun createFunctionType( annotations } else { - AnnotationsImpl(annotations + - BuiltInAnnotationDescriptor(builtIns, KotlinBuiltIns.FQ_NAMES.extensionFunctionType, emptyMap())) + Annotations.create( + annotations + BuiltInAnnotationDescriptor(builtIns, KotlinBuiltIns.FQ_NAMES.extensionFunctionType, emptyMap()) + ) } return KotlinTypeFactory.simpleNotNullType(typeAnnotations, classDescriptor, arguments) diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/Annotations.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/Annotations.kt index aee9d6dc195..b03cbcfa075 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/Annotations.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/Annotations.kt @@ -41,6 +41,9 @@ interface Annotations : Iterable { override fun toString() = "EMPTY" } + + fun create(annotations: List): Annotations = + if (annotations.isEmpty()) EMPTY else AnnotationsImpl(annotations) } } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationsImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationsImpl.kt index 05767127852..0e0ec58c9f6 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationsImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationsImpl.kt @@ -16,7 +16,10 @@ package org.jetbrains.kotlin.descriptors.annotations -class AnnotationsImpl(private val annotations: List) : Annotations { +/** + * Use [Annotations.create] to create an instance of this class if necessary. + */ +internal class AnnotationsImpl(private val annotations: List) : Annotations { override fun isEmpty(): Boolean = annotations.isEmpty() override fun iterator(): Iterator = annotations.iterator() diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt index e7a26d476a1..5a55536b04b 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.serialization.deserialization import org.jetbrains.kotlin.builtins.isSuspendFunctionType import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotations -import org.jetbrains.kotlin.descriptors.annotations.AnnotationsImpl import org.jetbrains.kotlin.descriptors.impl.FieldDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.PropertyGetterDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.PropertySetterDescriptorImpl @@ -291,7 +290,9 @@ class MemberDeserializer(private val c: DeserializationContext) { } fun loadTypeAlias(proto: ProtoBuf.TypeAlias): TypeAliasDescriptor { - val annotations = AnnotationsImpl(proto.annotationList.map { annotationDeserializer.deserializeAnnotation(it, c.nameResolver) }) + val annotations = Annotations.create( + proto.annotationList.map { annotationDeserializer.deserializeAnnotation(it, c.nameResolver) } + ) val visibility = ProtoEnumFlags.visibility(Flags.VISIBILITY.get(proto.flags)) val typeAlias = DeserializedTypeAliasDescriptor(