diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java index 047e44d64e4..a47d37d5097 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java @@ -22,6 +22,7 @@ import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.Modality; import org.jetbrains.jet.lang.descriptors.Visibility; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; +import org.jetbrains.jet.lang.descriptors.impl.PropertyDescriptorImpl; import org.jetbrains.jet.lang.descriptors.impl.SimpleFunctionDescriptorImpl; import org.jetbrains.jet.lang.descriptors.impl.TypeParameterDescriptorImpl; import org.jetbrains.jet.lang.descriptors.impl.ValueParameterDescriptorImpl; @@ -88,13 +89,38 @@ public class DescriptorDeserializer { return loadFunction(proto); case VAL: case VAR: - break; + return loadProperty(proto); case CONSTRUCTOR: break; } throw new IllegalArgumentException("Unsupported callable kind: " + callableKind); } + @NotNull + private PropertyDescriptor loadProperty(@NotNull Callable proto) { + int flags = proto.getFlags(); + PropertyDescriptorImpl property = new PropertyDescriptorImpl( + containingDeclaration, + // TODO: annotations + Collections.emptyList(), + modality(Flags.getModality(flags)), + visibility(Flags.getVisibility(flags)), + Flags.getCallableKind(flags) == Callable.CallableKind.VAR, + nameResolver.getName(proto.getName()), + memberKind(Flags.getMemberKind(flags)) + ); + DescriptorDeserializer local = new DescriptorDeserializer(this, property, nameResolver); + List typeParameters = local.typeParameters(proto.getTypeParametersList()); + property.setType( + local.typeDeserializer.type(proto.getReturnType()), + typeParameters, + // TODO: expected this object + null, + local.typeDeserializer.typeOrNull(proto.hasReceiverType() ? proto.getReceiverType() : null) + ); + return property; + } + @NotNull private CallableMemberDescriptor loadFunction(@NotNull Callable proto) { int flags = proto.getFlags(); @@ -106,11 +132,12 @@ public class DescriptorDeserializer { memberKind(Flags.getMemberKind(flags)) ); DescriptorDeserializer local = new DescriptorDeserializer(this, function, nameResolver); + List typeParameters = local.typeParameters(proto.getTypeParametersList()); function.initialize( local.typeDeserializer.typeOrNull(proto.hasReceiverType() ? proto.getReceiverType() : null), // TODO: expectedThisObject null, - local.typeParameters(proto.getTypeParametersList()), + typeParameters, local.valueParameters(proto.getValueParametersList()), local.typeDeserializer.type(proto.getReturnType()), modality(Flags.getModality(flags)), diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorSerializer.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorSerializer.java index add2d9d2c14..8648a569d94 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorSerializer.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorSerializer.java @@ -78,10 +78,10 @@ public class DescriptorSerializer { for (DeclarationDescriptor descriptor : classDescriptor.getDefaultType().getMemberScope().getAllDescriptors()) { // TODO: other than functions - if (descriptor instanceof FunctionDescriptor) { - FunctionDescriptor function = (FunctionDescriptor) descriptor; - if (function.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) continue; - builder.addMembers(local.functionProto(function)); + if (descriptor instanceof CallableMemberDescriptor) { + CallableMemberDescriptor member = (CallableMemberDescriptor) descriptor; + if (member.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) continue; + builder.addMembers(local.callableProto(member)); } } @@ -89,15 +89,16 @@ public class DescriptorSerializer { } @NotNull - public ProtoBuf.Callable.Builder functionProto(@NotNull FunctionDescriptor function) { + public ProtoBuf.Callable.Builder callableProto(@NotNull CallableMemberDescriptor descriptor) { ProtoBuf.Callable.Builder builder = ProtoBuf.Callable.newBuilder(); // TODO setter flags - builder.setFlags(Flags.getCallableFlags(function.getVisibility(), - function.getModality(), - function.getKind(), - callableKind(function), - function instanceof SimpleFunctionDescriptor && ((SimpleFunctionDescriptor) function).isInline()) + builder.setFlags(Flags.getCallableFlags(descriptor.getVisibility(), + descriptor.getModality(), + descriptor.getKind(), + callableKind(descriptor), + descriptor instanceof SimpleFunctionDescriptor && + ((SimpleFunctionDescriptor) descriptor).isInline()) ); //TODO builder.setExtraVisibility() @@ -105,22 +106,22 @@ public class DescriptorSerializer { DescriptorSerializer local = this;//createChildSerializer(); - for (TypeParameterDescriptor typeParameterDescriptor : function.getTypeParameters()) { + for (TypeParameterDescriptor typeParameterDescriptor : descriptor.getTypeParameters()) { builder.addTypeParameters(local.typeParameter(typeParameterDescriptor)); } - ReceiverParameterDescriptor receiverParameter = function.getReceiverParameter(); + ReceiverParameterDescriptor receiverParameter = descriptor.getReceiverParameter(); if (receiverParameter != null) { builder.setReceiverType(local.type(receiverParameter.getType())); } - builder.setName(nameTable.getSimpleNameIndex(function.getName())); + builder.setName(nameTable.getSimpleNameIndex(descriptor.getName())); - for (ValueParameterDescriptor valueParameterDescriptor : function.getValueParameters()) { + for (ValueParameterDescriptor valueParameterDescriptor : descriptor.getValueParameters()) { builder.addValueParameters(local.valueParameter(valueParameterDescriptor)); } - builder.setReturnType(local.type(function.getReturnType())); + builder.setReturnType(local.type(descriptor.getReturnType())); return builder; } diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.java index 0064aa7ca8b..72375fa6827 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.java @@ -31,10 +31,7 @@ import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.TypeConstructor; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; +import java.util.*; public class DeserializedClassDescriptor extends ClassDescriptorBase implements ClassDescriptor { @@ -227,7 +224,7 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements @Override protected void computeNonDeclaredFunctions( - @NotNull Name name, @NotNull List functions + @NotNull Name name, @NotNull Collection functions ) { Collection fromSupertypes = new ArrayList(); for (JetType supertype : classDescriptor.getTypeConstructor().getSupertypes()) { @@ -236,6 +233,18 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements generateFakeOverrides(name, fromSupertypes, functions); } + @Override + protected void computeNonDeclaredProperties( + @NotNull Name name, @NotNull Collection property + ) { + Collection fromSupertypes = new ArrayList(); + for (JetType supertype : classDescriptor.getTypeConstructor().getSupertypes()) { + //noinspection unchecked + fromSupertypes.addAll((Collection) supertype.getMemberScope().getProperties(name)); + } + generateFakeOverrides(name, fromSupertypes, property); + } + private void generateFakeOverrides( @NotNull Name name, @NotNull Collection fromSupertypes, diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedMemberScope.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedMemberScope.java index e63efdc6b25..1db334732db 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedMemberScope.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedMemberScope.java @@ -34,6 +34,19 @@ import java.util.*; public abstract class DeserializedMemberScope implements JetScope { + private static final Filter FUNCTION = new Filter() { + @Override + public boolean accept(ProtoBuf.Callable.CallableKind value) { + return value == ProtoBuf.Callable.CallableKind.FUN; + } + }; + private static final Filter PROPERTY = new Filter() { + @Override + public boolean accept(ProtoBuf.Callable.CallableKind value) { + return value == ProtoBuf.Callable.CallableKind.VAL || value == ProtoBuf.Callable.CallableKind.VAR; + } + }; + private final DeclarationDescriptor containingDeclaration; private final DescriptorDeserializer deserializer; private final Map> membersProtos; @@ -90,13 +103,13 @@ public abstract class DeserializedMemberScope implements JetScope { } @NotNull - private List computeMembersByName(Name name, ProtoBuf.Callable.CallableKind callableKind) { + private Collection computeMembersByName(Name name, Filter callableKind) { List memberProtos = membersProtos.get(name); - List descriptors = new ArrayList(memberProtos != null ? memberProtos.size() : 0); + Collection descriptors = new LinkedHashSet(memberProtos != null ? memberProtos.size() : 0); if (memberProtos != null) { for (ProtoBuf.Callable memberProto : memberProtos) { - if (Flags.getCallableKind(memberProto.getFlags()) == callableKind) { + if (callableKind.accept(Flags.getCallableKind(memberProto.getFlags()))) { //noinspection unchecked descriptors.add((D) deserializer.loadCallable(memberProto)); } @@ -107,13 +120,12 @@ public abstract class DeserializedMemberScope implements JetScope { @NotNull private Collection computeFunctions(@NotNull Name name) { - List descriptors = computeMembersByName(name, ProtoBuf.Callable.CallableKind.FUN); + Collection descriptors = computeMembersByName(name, FUNCTION); computeNonDeclaredFunctions(name, descriptors); return descriptors; } - protected void computeNonDeclaredFunctions(@NotNull Name name, @NotNull List functions) { - + protected void computeNonDeclaredFunctions(@NotNull Name name, @NotNull Collection functions) { } @NotNull @@ -124,7 +136,13 @@ public abstract class DeserializedMemberScope implements JetScope { @NotNull private Collection computeProperties(@NotNull Name name) { - return Collections.emptyList(); // TODO + Collection descriptors = computeMembersByName(name, PROPERTY); + computeNonDeclaredProperties(name, descriptors); + //noinspection unchecked + return (Collection) descriptors; + } + + protected void computeNonDeclaredProperties(@NotNull Name name, @NotNull Collection descriptors) { } @NotNull @@ -221,4 +239,8 @@ public abstract class DeserializedMemberScope implements JetScope { return getAllDescriptors(); } + private interface Filter { + boolean accept(T value); + } + }