Make AnnotationsImpl internal, introduce Annotations.create

This commit is contained in:
Alexander Udalov
2018-08-27 13:41:41 +02:00
parent eef11c669a
commit 7658ddafd8
8 changed files with 27 additions and 18 deletions
@@ -29,7 +29,7 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor;
import org.jetbrains.kotlin.descriptors.annotations.Annotated; import org.jetbrains.kotlin.descriptors.annotations.Annotated;
import org.jetbrains.kotlin.descriptors.annotations.AnnotatedImpl; import org.jetbrains.kotlin.descriptors.annotations.AnnotatedImpl;
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor; 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.load.kotlin.header.KotlinClassHeader;
import org.jetbrains.kotlin.metadata.ProtoBuf; import org.jetbrains.kotlin.metadata.ProtoBuf;
import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.FqName;
@@ -84,7 +84,7 @@ public class PackagePartCodegen extends MemberCodegen<KtFile> {
fileAnnotationDescriptors.add(annotationDescriptor); 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); AnnotationCodegen.forClass(v.getVisitor(), this, state.getTypeMapper()).genAnnotations(annotatedFile, null);
} }
@@ -114,7 +114,7 @@ class AnnotationSplitter(
} }
} }
map to AnnotationsImpl(other) map to Annotations.create(other)
} }
fun getOtherAnnotations(): Annotations = LazySplitAnnotations(storageManager, null) fun getOtherAnnotations(): Annotations = LazySplitAnnotations(storageManager, null)
@@ -129,7 +129,7 @@ class AnnotationSplitter(
val (targeted, other) = this@AnnotationSplitter.splitAnnotations() val (targeted, other) = this@AnnotationSplitter.splitAnnotations()
if (target != null) { if (target != null) {
targeted[target]?.let(::AnnotationsImpl) ?: Annotations.EMPTY targeted[target]?.let((Annotations)::create) ?: Annotations.EMPTY
} else { } else {
other other
} }
@@ -17,7 +17,10 @@
package org.jetbrains.kotlin.resolve package org.jetbrains.kotlin.resolve
import com.intellij.psi.PsiElement 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.AnalysisFlag
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings 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.AnnotationSplitter
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.descriptors.annotations.Annotations 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.ClassConstructorDescriptorImpl
import org.jetbrains.kotlin.descriptors.impl.FunctionExpressionDescriptor import org.jetbrains.kotlin.descriptors.impl.FunctionExpressionDescriptor
import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl 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.ModifiersChecker.resolveVisibilityFromModifiers
import org.jetbrains.kotlin.resolve.bindingContextUtil.recordScope import org.jetbrains.kotlin.resolve.bindingContextUtil.recordScope
import org.jetbrains.kotlin.resolve.calls.DslMarkerUtils 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.smartcasts.DataFlowInfo
import org.jetbrains.kotlin.resolve.calls.util.createValueParametersForInvokeInFunctionType import org.jetbrains.kotlin.resolve.calls.util.createValueParametersForInvokeInFunctionType
import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil
@@ -308,7 +309,7 @@ class FunctionDescriptorResolver(
private fun KotlinType.removeParameterNameAnnotation(): KotlinType { private fun KotlinType.removeParameterNameAnnotation(): KotlinType {
if (this is TypeUtils.SpecialType) return this if (this is TypeUtils.SpecialType) return this
val parameterNameAnnotation = annotations.findAnnotation(KotlinBuiltIns.FQ_NAMES.parameterName) ?: 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 private fun KotlinType.functionTypeExpected() = !TypeUtils.noExpectedType(this) && isBuiltinFunctionalType
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.builtins.jvm
import org.jetbrains.kotlin.builtins.BuiltInsInitializer import org.jetbrains.kotlin.builtins.BuiltInsInitializer
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.* 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.annotations.createDeprecatedAnnotation
import org.jetbrains.kotlin.descriptors.deserialization.AdditionalClassPartsProvider import org.jetbrains.kotlin.descriptors.deserialization.AdditionalClassPartsProvider
import org.jetbrains.kotlin.descriptors.deserialization.PLATFORM_DEPENDENT_ANNOTATION_FQ_NAME 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 // Most this properties are lazy because they depends on KotlinBuiltIns initialization that depends on JvmBuiltInsSettings object
private val notConsideredDeprecation by storageManager.createLazyValue { 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" "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 { private fun StorageManager.createMockJavaIoSerializableType(): KotlinType {
@@ -10,7 +10,6 @@ import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.annotations.Annotations 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.descriptors.annotations.BuiltInAnnotationDescriptor
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqNameUnsafe import org.jetbrains.kotlin.name.FqNameUnsafe
@@ -165,7 +164,7 @@ fun getFunctionTypeArgumentProjections(
KotlinBuiltIns.FQ_NAMES.parameterName, KotlinBuiltIns.FQ_NAMES.parameterName,
mapOf(Name.identifier("name") to StringValue(name.asString())) mapOf(Name.identifier("name") to StringValue(name.asString()))
) )
type.replaceAnnotations(AnnotationsImpl(type.annotations + parameterNameAnnotation)) type.replaceAnnotations(Annotations.create(type.annotations + parameterNameAnnotation))
} }
else { else {
type type
@@ -199,8 +198,9 @@ fun createFunctionType(
annotations annotations
} }
else { else {
AnnotationsImpl(annotations + Annotations.create(
BuiltInAnnotationDescriptor(builtIns, KotlinBuiltIns.FQ_NAMES.extensionFunctionType, emptyMap())) annotations + BuiltInAnnotationDescriptor(builtIns, KotlinBuiltIns.FQ_NAMES.extensionFunctionType, emptyMap())
)
} }
return KotlinTypeFactory.simpleNotNullType(typeAnnotations, classDescriptor, arguments) return KotlinTypeFactory.simpleNotNullType(typeAnnotations, classDescriptor, arguments)
@@ -41,6 +41,9 @@ interface Annotations : Iterable<AnnotationDescriptor> {
override fun toString() = "EMPTY" override fun toString() = "EMPTY"
} }
fun create(annotations: List<AnnotationDescriptor>): Annotations =
if (annotations.isEmpty()) EMPTY else AnnotationsImpl(annotations)
} }
} }
@@ -16,7 +16,10 @@
package org.jetbrains.kotlin.descriptors.annotations package org.jetbrains.kotlin.descriptors.annotations
class AnnotationsImpl(private val annotations: List<AnnotationDescriptor>) : Annotations { /**
* Use [Annotations.create] to create an instance of this class if necessary.
*/
internal class AnnotationsImpl(private val annotations: List<AnnotationDescriptor>) : Annotations {
override fun isEmpty(): Boolean = annotations.isEmpty() override fun isEmpty(): Boolean = annotations.isEmpty()
override fun iterator(): Iterator<AnnotationDescriptor> = annotations.iterator() override fun iterator(): Iterator<AnnotationDescriptor> = annotations.iterator()
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.serialization.deserialization
import org.jetbrains.kotlin.builtins.isSuspendFunctionType import org.jetbrains.kotlin.builtins.isSuspendFunctionType
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotations 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.FieldDescriptorImpl
import org.jetbrains.kotlin.descriptors.impl.PropertyGetterDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.PropertyGetterDescriptorImpl
import org.jetbrains.kotlin.descriptors.impl.PropertySetterDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.PropertySetterDescriptorImpl
@@ -291,7 +290,9 @@ class MemberDeserializer(private val c: DeserializationContext) {
} }
fun loadTypeAlias(proto: ProtoBuf.TypeAlias): TypeAliasDescriptor { 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 visibility = ProtoEnumFlags.visibility(Flags.VISIBILITY.get(proto.flags))
val typeAlias = DeserializedTypeAliasDescriptor( val typeAlias = DeserializedTypeAliasDescriptor(