Convert MemberDeserializer to Kotlin

This commit is contained in:
Alexander Udalov
2014-11-21 04:27:19 +03:00
parent 9c80801c3a
commit d3635de205
@@ -1,5 +1,5 @@
/* /*
* Copyright 2010-2013 JetBrains s.r.o. * Copyright 2010-2014 JetBrains s.r.o.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -14,261 +14,216 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.descriptors.serialization; package org.jetbrains.jet.descriptors.serialization
import kotlin.Function0; import org.jetbrains.jet.descriptors.serialization.*
import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.descriptors.serialization.context.DeserializationComponents
import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.descriptors.serialization.context.DeserializationContext
import org.jetbrains.jet.descriptors.serialization.context.DeserializationComponents; import org.jetbrains.jet.descriptors.serialization.descriptors.*
import org.jetbrains.jet.descriptors.serialization.context.DeserializationContext; import org.jetbrains.jet.lang.descriptors.*
import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotatedCallableKind; import org.jetbrains.jet.lang.descriptors.annotations.Annotations
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPropertyDescriptor; import org.jetbrains.jet.lang.descriptors.impl.*
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedSimpleFunctionDescriptor; import org.jetbrains.jet.lang.resolve.DescriptorFactory
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedTypeParameterDescriptor; import org.jetbrains.jet.descriptors.serialization.ProtoBuf.Callable
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.descriptors.serialization.ProtoBuf.Callable.CallableKind.*
import org.jetbrains.jet.lang.descriptors.annotations.Annotations; import org.jetbrains.jet.descriptors.serialization.ProtoBuf.TypeParameter
import org.jetbrains.jet.lang.descriptors.impl.ConstructorDescriptorImpl; import java.util.ArrayList
import org.jetbrains.jet.lang.descriptors.impl.PropertyGetterDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.impl.PropertySetterDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.impl.ValueParameterDescriptorImpl;
import org.jetbrains.jet.lang.resolve.DescriptorFactory;
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
import java.util.ArrayList; public class MemberDeserializer(private val context: DeserializationContext) {
import java.util.Collections; private val components: DeserializationComponents get() = context.components
import java.util.List;
import static org.jetbrains.jet.descriptors.serialization.ProtoBuf.Callable; public fun loadCallable(proto: Callable): CallableMemberDescriptor {
import static org.jetbrains.jet.descriptors.serialization.ProtoBuf.TypeParameter; val callableKind = Flags.CALLABLE_KIND.get(proto.getFlags())
import static org.jetbrains.jet.descriptors.serialization.SerializationPackage.*; return when (callableKind) {
FUN -> loadFunction(proto)
public class MemberDeserializer { VAL, VAR -> loadProperty(proto)
private final DeserializationContext context; CONSTRUCTOR -> loadConstructor(proto)
else -> throw IllegalArgumentException("Unsupported callable kind: $callableKind")
public MemberDeserializer(@NotNull DeserializationContext context) {
this.context = context;
}
@NotNull
private DeserializationComponents getComponents() {
return context.getComponents();
}
@NotNull
public CallableMemberDescriptor loadCallable(@NotNull Callable proto) {
Callable.CallableKind callableKind = Flags.CALLABLE_KIND.get(proto.getFlags());
switch (callableKind) {
case FUN:
return loadFunction(proto);
case VAL:
case VAR:
return loadProperty(proto);
case CONSTRUCTOR:
return loadConstructor(proto);
} }
throw new IllegalArgumentException("Unsupported callable kind: " + callableKind);
} }
@NotNull private fun loadProperty(proto: Callable): PropertyDescriptor {
private PropertyDescriptor loadProperty(@NotNull final Callable proto) { val flags = proto.getFlags()
int flags = proto.getFlags();
DeserializedPropertyDescriptor property = new DeserializedPropertyDescriptor( val property = DeserializedPropertyDescriptor(
context.getContainingDeclaration(), context.containingDeclaration, null,
null,
getAnnotations(proto, flags, AnnotatedCallableKind.PROPERTY), getAnnotations(proto, flags, AnnotatedCallableKind.PROPERTY),
modality(Flags.MODALITY.get(flags)), modality(Flags.MODALITY.get(flags)),
visibility(Flags.VISIBILITY.get(flags)), visibility(Flags.VISIBILITY.get(flags)),
Flags.CALLABLE_KIND.get(flags) == Callable.CallableKind.VAR, Flags.CALLABLE_KIND.get(flags) == Callable.CallableKind.VAR,
context.getNameResolver().getName(proto.getName()), context.nameResolver.getName(proto.getName()),
SerializationPackage.memberKind(Flags.MEMBER_KIND.get(flags)), memberKind(Flags.MEMBER_KIND.get(flags)),
proto, proto,
context.getNameResolver() context.nameResolver
); )
DeserializationContext local = context.childContext(property, proto.getTypeParameterList()); val local = context.childContext(property, proto.getTypeParameterList())
property.setType( property.setType(
local.getTypeDeserializer().type(proto.getReturnType()), local.typeDeserializer.type(proto.getReturnType()),
local.getTypeDeserializer().getOwnTypeParameters(), local.typeDeserializer.getOwnTypeParameters(),
getDispatchReceiverParameter(), getDispatchReceiverParameter(),
local.getTypeDeserializer().typeOrNull(proto.hasReceiverType() ? proto.getReceiverType() : null) local.typeDeserializer.typeOrNull(if (proto.hasReceiverType()) proto.getReceiverType() else null)
); )
PropertyGetterDescriptorImpl getter = null; val getter = if (Flags.HAS_GETTER.get(flags)) {
PropertySetterDescriptorImpl setter = null; val getterFlags = proto.getGetterFlags()
val isNotDefault = proto.hasGetterFlags() && Flags.IS_NOT_DEFAULT.get(getterFlags)
if (Flags.HAS_GETTER.get(flags)) { val getter = if (isNotDefault) {
int getterFlags = proto.getGetterFlags(); PropertyGetterDescriptorImpl(
boolean isNotDefault = proto.hasGetterFlags() && Flags.IS_NOT_DEFAULT.get(getterFlags); property,
if (isNotDefault) { getAnnotations(proto, getterFlags, AnnotatedCallableKind.PROPERTY_GETTER),
getter = new PropertyGetterDescriptorImpl(property, modality(Flags.MODALITY.get(getterFlags)),
getAnnotations(proto, getterFlags, AnnotatedCallableKind.PROPERTY_GETTER), visibility(Flags.VISIBILITY.get(getterFlags)),
modality(Flags.MODALITY.get(getterFlags)), /* hasBody = */ isNotDefault,
visibility(Flags.VISIBILITY.get(getterFlags)), /* isDefault = */ !isNotDefault,
isNotDefault, !isNotDefault, property.getKind(), null, SourceElement.NO_SOURCE
property.getKind(), null, SourceElement.NO_SOURCE); )
} }
else { else {
getter = DescriptorFactory.createDefaultGetter(property); DescriptorFactory.createDefaultGetter(property)
} }
getter.initialize(property.getReturnType()); getter.initialize(property.getReturnType())
getter
}
else {
null
} }
if (Flags.HAS_SETTER.get(flags)) { val setter = if (Flags.HAS_SETTER.get(flags)) {
int setterFlags = proto.getSetterFlags(); val setterFlags = proto.getSetterFlags()
boolean isNotDefault = proto.hasSetterFlags() && Flags.IS_NOT_DEFAULT.get(setterFlags); val isNotDefault = proto.hasSetterFlags() && Flags.IS_NOT_DEFAULT.get(setterFlags)
if (isNotDefault) { if (isNotDefault) {
setter = new PropertySetterDescriptorImpl(property, val setter = PropertySetterDescriptorImpl(
getAnnotations(proto, setterFlags, AnnotatedCallableKind.PROPERTY_SETTER), property,
modality(Flags.MODALITY.get(setterFlags)), getAnnotations(proto, setterFlags, AnnotatedCallableKind.PROPERTY_SETTER),
visibility(Flags.VISIBILITY.get(setterFlags)), isNotDefault, modality(Flags.MODALITY.get(setterFlags)),
!isNotDefault, visibility(Flags.VISIBILITY.get(setterFlags)),
property.getKind(), null, SourceElement.NO_SOURCE); /* hasBody = */ isNotDefault,
DeserializationContext setterLocal = local.childContext(setter, Collections.<TypeParameter>emptyList()); /* isDefault = */ !isNotDefault,
List<ValueParameterDescriptor> valueParameters = property.getKind(), null, SourceElement.NO_SOURCE
setterLocal.getMemberDeserializer().valueParameters(proto, AnnotatedCallableKind.PROPERTY_SETTER); )
assert valueParameters.size() == 1 : "Property setter should have a single value parameter: " + setter; val setterLocal = local.childContext(setter, listOf())
setter.initialize(valueParameters.get(0)); val valueParameters = setterLocal.memberDeserializer.valueParameters(proto, AnnotatedCallableKind.PROPERTY_SETTER)
assert(valueParameters.size() == 1) { "Property setter should have a single value parameter: $setter" }
setter.initialize(valueParameters.single())
setter
} }
else { else {
setter = DescriptorFactory.createDefaultSetter(property); DescriptorFactory.createDefaultSetter(property)
} }
} }
else {
null
}
if (Flags.HAS_CONSTANT.get(flags)) { if (Flags.HAS_CONSTANT.get(flags)) {
property.setCompileTimeInitializer( property.setCompileTimeInitializer(
getComponents().getStorageManager().createNullableLazyValue(new Function0<CompileTimeConstant<?>>() { components.storageManager.createNullableLazyValue {
@Nullable val containingDeclaration =
@Override context.containingDeclaration as? ClassOrPackageFragmentDescriptor
public CompileTimeConstant<?> invoke() { ?: error("Only members in classes or package fragments should be serialized: ${context.containingDeclaration}")
DeclarationDescriptor containingDeclaration = context.getContainingDeclaration(); components.constantLoader.loadPropertyConstant(
assert containingDeclaration instanceof ClassOrPackageFragmentDescriptor containingDeclaration, proto, context.nameResolver, AnnotatedCallableKind.PROPERTY
: "Only members in classes or package fragments should be serialized: " + containingDeclaration; )
return getComponents().getConstantLoader().loadPropertyConstant( }
(ClassOrPackageFragmentDescriptor) containingDeclaration, proto, )
context.getNameResolver(), AnnotatedCallableKind.PROPERTY);
}
})
);
} }
property.initialize(getter, setter); property.initialize(getter, setter)
return property; return property
} }
@NotNull private fun loadFunction(proto: Callable): CallableMemberDescriptor {
private CallableMemberDescriptor loadFunction(@NotNull Callable proto) { val annotations = getAnnotations(proto, proto.getFlags(), AnnotatedCallableKind.FUNCTION)
Annotations annotations = getAnnotations(proto, proto.getFlags(), AnnotatedCallableKind.FUNCTION); val function = DeserializedSimpleFunctionDescriptor.create(context.containingDeclaration, proto, context.nameResolver, annotations)
DeserializedSimpleFunctionDescriptor function = DeserializedSimpleFunctionDescriptor.create( val local = context.childContext(function, proto.getTypeParameterList())
context.getContainingDeclaration(), proto, context.getNameResolver(), annotations
);
DeserializationContext local = context.childContext(function, proto.getTypeParameterList());
function.initialize( function.initialize(
local.getTypeDeserializer().typeOrNull(proto.hasReceiverType() ? proto.getReceiverType() : null), local.typeDeserializer.typeOrNull(if (proto.hasReceiverType()) proto.getReceiverType() else null),
getDispatchReceiverParameter(), getDispatchReceiverParameter(),
local.getTypeDeserializer().getOwnTypeParameters(), local.typeDeserializer.getOwnTypeParameters(),
local.getMemberDeserializer().valueParameters(proto, AnnotatedCallableKind.FUNCTION), local.memberDeserializer.valueParameters(proto, AnnotatedCallableKind.FUNCTION),
local.getTypeDeserializer().type(proto.getReturnType()), local.typeDeserializer.type(proto.getReturnType()),
modality(Flags.MODALITY.get(proto.getFlags())), modality(Flags.MODALITY.get(proto.getFlags())),
visibility(Flags.VISIBILITY.get(proto.getFlags())) visibility(Flags.VISIBILITY.get(proto.getFlags()))
); )
return function; return function
} }
@Nullable private fun getDispatchReceiverParameter(): ReceiverParameterDescriptor? {
private ReceiverParameterDescriptor getDispatchReceiverParameter() { return (context.containingDeclaration as? ClassDescriptor)?.getThisAsReceiverParameter()
DeclarationDescriptor containingDeclaration = context.getContainingDeclaration();
return containingDeclaration instanceof ClassDescriptor
? ((ClassDescriptor) containingDeclaration).getThisAsReceiverParameter() : null;
} }
@NotNull private fun loadConstructor(proto: Callable): CallableMemberDescriptor {
private CallableMemberDescriptor loadConstructor(@NotNull Callable proto) { val classDescriptor = context.containingDeclaration as ClassDescriptor
ClassDescriptor classDescriptor = (ClassDescriptor) context.getContainingDeclaration(); val descriptor = ConstructorDescriptorImpl.create(
ConstructorDescriptorImpl descriptor = ConstructorDescriptorImpl.create( classDescriptor, getAnnotations(proto, proto.getFlags(), AnnotatedCallableKind.FUNCTION), // TODO: primary
classDescriptor,
getAnnotations(proto, proto.getFlags(), AnnotatedCallableKind.FUNCTION),
// TODO: primary
true, SourceElement.NO_SOURCE true, SourceElement.NO_SOURCE
); )
DeserializationContext local = context.childContext(descriptor, Collections.<TypeParameter>emptyList()); val local = context.childContext(descriptor, listOf())
descriptor.initialize( descriptor.initialize(
classDescriptor.getTypeConstructor().getParameters(), classDescriptor.getTypeConstructor().getParameters(),
local.getMemberDeserializer().valueParameters(proto, AnnotatedCallableKind.FUNCTION), local.memberDeserializer.valueParameters(proto, AnnotatedCallableKind.FUNCTION),
visibility(Flags.VISIBILITY.get(proto.getFlags())) visibility(Flags.VISIBILITY.get(proto.getFlags()))
); )
descriptor.setReturnType(local.getTypeDeserializer().type(proto.getReturnType())); descriptor.setReturnType(local.typeDeserializer.type(proto.getReturnType()))
return descriptor; return descriptor
} }
@NotNull private fun getAnnotations(proto: Callable, flags: Int, kind: AnnotatedCallableKind): Annotations {
private Annotations getAnnotations(@NotNull Callable proto, int flags, @NotNull AnnotatedCallableKind kind) { val containingDeclaration =
DeclarationDescriptor containingDeclaration = context.getContainingDeclaration(); context.containingDeclaration as? ClassOrPackageFragmentDescriptor
assert containingDeclaration instanceof ClassOrPackageFragmentDescriptor ?: error("Only members in classes or package fragments should be serialized: ${context.containingDeclaration}")
: "Only members in classes or package fragments should be serialized: " + containingDeclaration; return if (Flags.HAS_ANNOTATIONS.get(flags))
return Flags.HAS_ANNOTATIONS.get(flags) ? components.annotationLoader.loadCallableAnnotations(containingDeclaration, proto, context.nameResolver, kind)
getComponents().getAnnotationLoader().loadCallableAnnotations( else
(ClassOrPackageFragmentDescriptor) containingDeclaration, proto, context.getNameResolver(), kind Annotations.EMPTY
) :
Annotations.EMPTY;
} }
@NotNull public fun typeParameters(protos: List<TypeParameter>): List<DeserializedTypeParameterDescriptor> {
public List<DeserializedTypeParameterDescriptor> typeParameters(@NotNull List<TypeParameter> protos) { val result = ArrayList<DeserializedTypeParameterDescriptor>(protos.size())
List<DeserializedTypeParameterDescriptor> result = new ArrayList<DeserializedTypeParameterDescriptor>(protos.size()); for (i in protos.indices) {
for (int i = 0; i < protos.size(); i++) { val proto = protos.get(i)
TypeParameter proto = protos.get(i); result.add(DeserializedTypeParameterDescriptor(
DeserializedTypeParameterDescriptor descriptor = new DeserializedTypeParameterDescriptor( components.storageManager, context.typeDeserializer, proto, context.containingDeclaration,
getComponents().getStorageManager(), context.nameResolver.getName(proto.getName()),
context.getTypeDeserializer(), variance(proto.getVariance()), proto.getReified(), i
proto, ))
context.getContainingDeclaration(),
context.getNameResolver().getName(proto.getName()),
variance(proto.getVariance()),
proto.getReified(),
i
);
result.add(descriptor);
} }
return result; return result
} }
@NotNull private fun valueParameters(callable: Callable, kind: AnnotatedCallableKind): List<ValueParameterDescriptor> {
private List<ValueParameterDescriptor> valueParameters(@NotNull Callable callable, @NotNull AnnotatedCallableKind kind) { val classOrPackage =
DeclarationDescriptor containerOfCallable = context.getContainingDeclaration().getContainingDeclaration(); context.containingDeclaration.getContainingDeclaration() as? ClassOrPackageFragmentDescriptor
assert containerOfCallable instanceof ClassOrPackageFragmentDescriptor ?: error("Only members in classes or package fragments should be serialized: ${context.containingDeclaration}")
: "Only members in classes or package fragments should be serialized: " + containerOfCallable;
ClassOrPackageFragmentDescriptor classOrPackage = (ClassOrPackageFragmentDescriptor) containerOfCallable;
List<Callable.ValueParameter> protos = callable.getValueParameterList(); val protos = callable.getValueParameterList()
List<ValueParameterDescriptor> result = new ArrayList<ValueParameterDescriptor>(protos.size()); val result = ArrayList<ValueParameterDescriptor>(protos.size())
for (int i = 0; i < protos.size(); i++) { for (i in protos.indices) {
Callable.ValueParameter proto = protos.get(i); val proto = protos.get(i)
result.add(new ValueParameterDescriptorImpl( result.add(ValueParameterDescriptorImpl(
context.getContainingDeclaration(), context.containingDeclaration, null, i,
null, getParameterAnnotations(classOrPackage, callable, kind, proto),
i, context.nameResolver.getName(proto.getName()),
getAnnotations(classOrPackage, callable, kind, proto), context.typeDeserializer.type(proto.getType()),
context.getNameResolver().getName(proto.getName()),
context.getTypeDeserializer().type(proto.getType()),
Flags.DECLARES_DEFAULT_VALUE.get(proto.getFlags()), Flags.DECLARES_DEFAULT_VALUE.get(proto.getFlags()),
context.getTypeDeserializer().typeOrNull(proto.hasVarargElementType() ? proto.getVarargElementType() : null), context.typeDeserializer.typeOrNull(if (proto.hasVarargElementType()) proto.getVarargElementType() else null),
SourceElement.NO_SOURCE) SourceElement.NO_SOURCE
); ))
} }
return result; return result
} }
@NotNull private fun getParameterAnnotations(
private Annotations getAnnotations( classOrPackage: ClassOrPackageFragmentDescriptor,
@NotNull ClassOrPackageFragmentDescriptor classOrPackage, callable: Callable,
@NotNull Callable callable, kind: AnnotatedCallableKind,
@NotNull AnnotatedCallableKind kind, valueParameter: Callable.ValueParameter
@NotNull Callable.ValueParameter valueParameter ): Annotations {
) { return if (Flags.HAS_ANNOTATIONS.get(valueParameter.getFlags()))
return Flags.HAS_ANNOTATIONS.get(valueParameter.getFlags()) ? getComponents().getAnnotationLoader() components.annotationLoader.loadValueParameterAnnotations(classOrPackage, callable, context.nameResolver, kind, valueParameter)
.loadValueParameterAnnotations(classOrPackage, callable, context.getNameResolver(), kind, valueParameter) else
: Annotations.EMPTY; Annotations.EMPTY
} }
} }