From cff59a925b94c0abcaa3a63050f9698614c0ccda Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Wed, 15 May 2013 16:10:23 +0400 Subject: [PATCH] Support fake overrides --- .../DeserializedClassDescriptor.java | 33 ++++++++++++++----- .../descriptors/DeserializedMemberScope.java | 31 ++++++++++------- 2 files changed, 45 insertions(+), 19 deletions(-) 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 248749b7f97..15d0a1bfc78 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 @@ -24,6 +24,7 @@ import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.impl.ClassDescriptorBase; import org.jetbrains.jet.lang.descriptors.impl.ReceiverParameterDescriptorImpl; import org.jetbrains.jet.lang.resolve.OverrideResolver; +import org.jetbrains.jet.lang.resolve.TraceUtil; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver; @@ -223,33 +224,34 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements this.classDescriptor = classDescriptor; } - @NotNull @Override - public Collection getFunctions(@NotNull Name name) { + protected void computeNonDeclaredFunctions( + @NotNull Name name, @NotNull List functions + ) { Collection fromSupertypes = new ArrayList(); for (JetType supertype : classDescriptor.getTypeConstructor().getSupertypes()) { fromSupertypes.addAll(supertype.getMemberScope().getFunctions(name)); } - Collection result = super.getFunctions(name); - generateFakeOverrides(name, fromSupertypes, result); - return result; + generateFakeOverrides(name, fromSupertypes, functions); } private void generateFakeOverrides( @NotNull Name name, @NotNull Collection fromSupertypes, - @NotNull final Collection fromCurrent + @NotNull final Collection result ) { + List fromCurrent = new ArrayList(result); OverrideResolver.generateOverridesInFunctionGroup( name, fromSupertypes, - new ArrayList(fromCurrent), + fromCurrent, classDescriptor, new OverrideResolver.DescriptorSink() { @Override public void addToScope(@NotNull CallableMemberDescriptor fakeOverride) { + OverrideResolver.resolveUnknownVisibilityForMember(null, fakeOverride, TraceUtil.TRACE_STUB); //noinspection unchecked - fromCurrent.add((D) fakeOverride); + result.add((D) fakeOverride); } @Override @@ -260,6 +262,21 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements ); } + @Override + protected void addNonDeclaredDescriptors(@NotNull Collection result) { + for (JetType supertype : classDescriptor.getTypeConstructor().getSupertypes()) { + for (DeclarationDescriptor descriptor : supertype.getMemberScope().getAllDescriptors()) { + if (descriptor instanceof FunctionDescriptor) { + result.addAll(getFunctions(descriptor.getName())); + } + else if (descriptor instanceof PropertyDescriptor) { + result.addAll(getProperties(descriptor.getName())); + } + // Nothing else is inherited + } + } + } + @Nullable @Override protected ClassifierDescriptor getClassDescriptor(@NotNull Name name) { 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 d0c64c0ba7d..4db00d82369 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 @@ -91,22 +91,27 @@ public abstract class DeserializedMemberScope implements JetScope { @NotNull private Collection computeFunctions(@NotNull Name name) { List functionProtos = membersProtos.get(name); - if (functionProtos == null || functionProtos.isEmpty()) { - return Collections.emptyList(); + + List functions = new ArrayList(functionProtos != null ? functionProtos.size() : 0); + if (functionProtos != null) { + for (ProtoBuf.Callable memberProto : functionProtos) { + // TODO: check that the proto is a function, and not a property + functions.add(deserializer.loadFunction(memberProto)); + } } - List functions = new ArrayList(functionProtos.size()); - for (ProtoBuf.Callable memberProto : functionProtos) { - // TODO: check that the proto is a function, and not a property - functions.add(deserializer.loadFunction(memberProto)); - } + computeNonDeclaredFunctions(name, functions); return functions; } + protected void computeNonDeclaredFunctions(@NotNull Name name, @NotNull List functions) { + + } + @NotNull @Override - public Collection getFunctions(@NotNull Name name) { + public final Collection getFunctions(@NotNull Name name) { return functions.fun(name); } @@ -175,18 +180,22 @@ public abstract class DeserializedMemberScope implements JetScope { } private Collection computeAllDescriptors() { - Collection result = new ArrayList(); + Collection result = new LinkedHashSet(0); for (Name name : membersProtos.keySet()) { - result.addAll(functions.fun(name)); - result.addAll(properties.fun(name)); + result.addAll(getFunctions(name)); + result.addAll(getProperties(name)); } + addNonDeclaredDescriptors(result); + addAllClassDescriptors(result); return result; } + protected abstract void addNonDeclaredDescriptors(@NotNull Collection result); + @NotNull @Override public final Collection getAllDescriptors() {