Support fake overrides
This commit is contained in:
committed by
Alexander Udalov
parent
ae4a3942df
commit
cff59a925b
+25
-8
@@ -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.ClassDescriptorBase;
|
||||||
import org.jetbrains.jet.lang.descriptors.impl.ReceiverParameterDescriptorImpl;
|
import org.jetbrains.jet.lang.descriptors.impl.ReceiverParameterDescriptorImpl;
|
||||||
import org.jetbrains.jet.lang.resolve.OverrideResolver;
|
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.name.Name;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver;
|
import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver;
|
||||||
@@ -223,33 +224,34 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements
|
|||||||
this.classDescriptor = classDescriptor;
|
this.classDescriptor = classDescriptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<FunctionDescriptor> getFunctions(@NotNull Name name) {
|
protected void computeNonDeclaredFunctions(
|
||||||
|
@NotNull Name name, @NotNull List<FunctionDescriptor> functions
|
||||||
|
) {
|
||||||
Collection<FunctionDescriptor> fromSupertypes = new ArrayList<FunctionDescriptor>();
|
Collection<FunctionDescriptor> fromSupertypes = new ArrayList<FunctionDescriptor>();
|
||||||
for (JetType supertype : classDescriptor.getTypeConstructor().getSupertypes()) {
|
for (JetType supertype : classDescriptor.getTypeConstructor().getSupertypes()) {
|
||||||
fromSupertypes.addAll(supertype.getMemberScope().getFunctions(name));
|
fromSupertypes.addAll(supertype.getMemberScope().getFunctions(name));
|
||||||
}
|
}
|
||||||
Collection<FunctionDescriptor> result = super.getFunctions(name);
|
generateFakeOverrides(name, fromSupertypes, functions);
|
||||||
generateFakeOverrides(name, fromSupertypes, result);
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private <D extends CallableMemberDescriptor> void generateFakeOverrides(
|
private <D extends CallableMemberDescriptor> void generateFakeOverrides(
|
||||||
@NotNull Name name,
|
@NotNull Name name,
|
||||||
@NotNull Collection<D> fromSupertypes,
|
@NotNull Collection<D> fromSupertypes,
|
||||||
@NotNull final Collection<D> fromCurrent
|
@NotNull final Collection<D> result
|
||||||
) {
|
) {
|
||||||
|
List<CallableMemberDescriptor> fromCurrent = new ArrayList<CallableMemberDescriptor>(result);
|
||||||
OverrideResolver.generateOverridesInFunctionGroup(
|
OverrideResolver.generateOverridesInFunctionGroup(
|
||||||
name,
|
name,
|
||||||
fromSupertypes,
|
fromSupertypes,
|
||||||
new ArrayList<CallableMemberDescriptor>(fromCurrent),
|
fromCurrent,
|
||||||
classDescriptor,
|
classDescriptor,
|
||||||
new OverrideResolver.DescriptorSink() {
|
new OverrideResolver.DescriptorSink() {
|
||||||
@Override
|
@Override
|
||||||
public void addToScope(@NotNull CallableMemberDescriptor fakeOverride) {
|
public void addToScope(@NotNull CallableMemberDescriptor fakeOverride) {
|
||||||
|
OverrideResolver.resolveUnknownVisibilityForMember(null, fakeOverride, TraceUtil.TRACE_STUB);
|
||||||
//noinspection unchecked
|
//noinspection unchecked
|
||||||
fromCurrent.add((D) fakeOverride);
|
result.add((D) fakeOverride);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -260,6 +262,21 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void addNonDeclaredDescriptors(@NotNull Collection<DeclarationDescriptor> 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
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
protected ClassifierDescriptor getClassDescriptor(@NotNull Name name) {
|
protected ClassifierDescriptor getClassDescriptor(@NotNull Name name) {
|
||||||
|
|||||||
+20
-11
@@ -91,22 +91,27 @@ public abstract class DeserializedMemberScope implements JetScope {
|
|||||||
@NotNull
|
@NotNull
|
||||||
private Collection<FunctionDescriptor> computeFunctions(@NotNull Name name) {
|
private Collection<FunctionDescriptor> computeFunctions(@NotNull Name name) {
|
||||||
List<ProtoBuf.Callable> functionProtos = membersProtos.get(name);
|
List<ProtoBuf.Callable> functionProtos = membersProtos.get(name);
|
||||||
if (functionProtos == null || functionProtos.isEmpty()) {
|
|
||||||
return Collections.emptyList();
|
List<FunctionDescriptor> functions = new ArrayList<FunctionDescriptor>(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<FunctionDescriptor> functions = new ArrayList<FunctionDescriptor>(functionProtos.size());
|
computeNonDeclaredFunctions(name, functions);
|
||||||
for (ProtoBuf.Callable memberProto : functionProtos) {
|
|
||||||
// TODO: check that the proto is a function, and not a property
|
|
||||||
functions.add(deserializer.loadFunction(memberProto));
|
|
||||||
}
|
|
||||||
|
|
||||||
return functions;
|
return functions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void computeNonDeclaredFunctions(@NotNull Name name, @NotNull List<FunctionDescriptor> functions) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Collection<FunctionDescriptor> getFunctions(@NotNull Name name) {
|
public final Collection<FunctionDescriptor> getFunctions(@NotNull Name name) {
|
||||||
return functions.fun(name);
|
return functions.fun(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -175,18 +180,22 @@ public abstract class DeserializedMemberScope implements JetScope {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Collection<DeclarationDescriptor> computeAllDescriptors() {
|
private Collection<DeclarationDescriptor> computeAllDescriptors() {
|
||||||
Collection<DeclarationDescriptor> result = new ArrayList<DeclarationDescriptor>();
|
Collection<DeclarationDescriptor> result = new LinkedHashSet<DeclarationDescriptor>(0);
|
||||||
|
|
||||||
for (Name name : membersProtos.keySet()) {
|
for (Name name : membersProtos.keySet()) {
|
||||||
result.addAll(functions.fun(name));
|
result.addAll(getFunctions(name));
|
||||||
result.addAll(properties.fun(name));
|
result.addAll(getProperties(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
addNonDeclaredDescriptors(result);
|
||||||
|
|
||||||
addAllClassDescriptors(result);
|
addAllClassDescriptors(result);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected abstract void addNonDeclaredDescriptors(@NotNull Collection<DeclarationDescriptor> result);
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public final Collection<DeclarationDescriptor> getAllDescriptors() {
|
public final Collection<DeclarationDescriptor> getAllDescriptors() {
|
||||||
|
|||||||
Reference in New Issue
Block a user