Support properties in serialized classes
This commit is contained in:
committed by
Alexander Udalov
parent
c610695612
commit
2a928a2bfe
+29
-2
@@ -22,6 +22,7 @@ import org.jetbrains.jet.lang.descriptors.*;
|
|||||||
import org.jetbrains.jet.lang.descriptors.Modality;
|
import org.jetbrains.jet.lang.descriptors.Modality;
|
||||||
import org.jetbrains.jet.lang.descriptors.Visibility;
|
import org.jetbrains.jet.lang.descriptors.Visibility;
|
||||||
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
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.SimpleFunctionDescriptorImpl;
|
||||||
import org.jetbrains.jet.lang.descriptors.impl.TypeParameterDescriptorImpl;
|
import org.jetbrains.jet.lang.descriptors.impl.TypeParameterDescriptorImpl;
|
||||||
import org.jetbrains.jet.lang.descriptors.impl.ValueParameterDescriptorImpl;
|
import org.jetbrains.jet.lang.descriptors.impl.ValueParameterDescriptorImpl;
|
||||||
@@ -88,13 +89,38 @@ public class DescriptorDeserializer {
|
|||||||
return loadFunction(proto);
|
return loadFunction(proto);
|
||||||
case VAL:
|
case VAL:
|
||||||
case VAR:
|
case VAR:
|
||||||
break;
|
return loadProperty(proto);
|
||||||
case CONSTRUCTOR:
|
case CONSTRUCTOR:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
throw new IllegalArgumentException("Unsupported callable kind: " + callableKind);
|
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.<AnnotationDescriptor>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<TypeParameterDescriptor> 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
|
@NotNull
|
||||||
private CallableMemberDescriptor loadFunction(@NotNull Callable proto) {
|
private CallableMemberDescriptor loadFunction(@NotNull Callable proto) {
|
||||||
int flags = proto.getFlags();
|
int flags = proto.getFlags();
|
||||||
@@ -106,11 +132,12 @@ public class DescriptorDeserializer {
|
|||||||
memberKind(Flags.getMemberKind(flags))
|
memberKind(Flags.getMemberKind(flags))
|
||||||
);
|
);
|
||||||
DescriptorDeserializer local = new DescriptorDeserializer(this, function, nameResolver);
|
DescriptorDeserializer local = new DescriptorDeserializer(this, function, nameResolver);
|
||||||
|
List<TypeParameterDescriptor> typeParameters = local.typeParameters(proto.getTypeParametersList());
|
||||||
function.initialize(
|
function.initialize(
|
||||||
local.typeDeserializer.typeOrNull(proto.hasReceiverType() ? proto.getReceiverType() : null),
|
local.typeDeserializer.typeOrNull(proto.hasReceiverType() ? proto.getReceiverType() : null),
|
||||||
// TODO: expectedThisObject
|
// TODO: expectedThisObject
|
||||||
null,
|
null,
|
||||||
local.typeParameters(proto.getTypeParametersList()),
|
typeParameters,
|
||||||
local.valueParameters(proto.getValueParametersList()),
|
local.valueParameters(proto.getValueParametersList()),
|
||||||
local.typeDeserializer.type(proto.getReturnType()),
|
local.typeDeserializer.type(proto.getReturnType()),
|
||||||
modality(Flags.getModality(flags)),
|
modality(Flags.getModality(flags)),
|
||||||
|
|||||||
+16
-15
@@ -78,10 +78,10 @@ public class DescriptorSerializer {
|
|||||||
|
|
||||||
for (DeclarationDescriptor descriptor : classDescriptor.getDefaultType().getMemberScope().getAllDescriptors()) {
|
for (DeclarationDescriptor descriptor : classDescriptor.getDefaultType().getMemberScope().getAllDescriptors()) {
|
||||||
// TODO: other than functions
|
// TODO: other than functions
|
||||||
if (descriptor instanceof FunctionDescriptor) {
|
if (descriptor instanceof CallableMemberDescriptor) {
|
||||||
FunctionDescriptor function = (FunctionDescriptor) descriptor;
|
CallableMemberDescriptor member = (CallableMemberDescriptor) descriptor;
|
||||||
if (function.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) continue;
|
if (member.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) continue;
|
||||||
builder.addMembers(local.functionProto(function));
|
builder.addMembers(local.callableProto(member));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,15 +89,16 @@ public class DescriptorSerializer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public ProtoBuf.Callable.Builder functionProto(@NotNull FunctionDescriptor function) {
|
public ProtoBuf.Callable.Builder callableProto(@NotNull CallableMemberDescriptor descriptor) {
|
||||||
ProtoBuf.Callable.Builder builder = ProtoBuf.Callable.newBuilder();
|
ProtoBuf.Callable.Builder builder = ProtoBuf.Callable.newBuilder();
|
||||||
|
|
||||||
// TODO setter flags
|
// TODO setter flags
|
||||||
builder.setFlags(Flags.getCallableFlags(function.getVisibility(),
|
builder.setFlags(Flags.getCallableFlags(descriptor.getVisibility(),
|
||||||
function.getModality(),
|
descriptor.getModality(),
|
||||||
function.getKind(),
|
descriptor.getKind(),
|
||||||
callableKind(function),
|
callableKind(descriptor),
|
||||||
function instanceof SimpleFunctionDescriptor && ((SimpleFunctionDescriptor) function).isInline())
|
descriptor instanceof SimpleFunctionDescriptor &&
|
||||||
|
((SimpleFunctionDescriptor) descriptor).isInline())
|
||||||
);
|
);
|
||||||
//TODO builder.setExtraVisibility()
|
//TODO builder.setExtraVisibility()
|
||||||
|
|
||||||
@@ -105,22 +106,22 @@ public class DescriptorSerializer {
|
|||||||
|
|
||||||
DescriptorSerializer local = this;//createChildSerializer();
|
DescriptorSerializer local = this;//createChildSerializer();
|
||||||
|
|
||||||
for (TypeParameterDescriptor typeParameterDescriptor : function.getTypeParameters()) {
|
for (TypeParameterDescriptor typeParameterDescriptor : descriptor.getTypeParameters()) {
|
||||||
builder.addTypeParameters(local.typeParameter(typeParameterDescriptor));
|
builder.addTypeParameters(local.typeParameter(typeParameterDescriptor));
|
||||||
}
|
}
|
||||||
|
|
||||||
ReceiverParameterDescriptor receiverParameter = function.getReceiverParameter();
|
ReceiverParameterDescriptor receiverParameter = descriptor.getReceiverParameter();
|
||||||
if (receiverParameter != null) {
|
if (receiverParameter != null) {
|
||||||
builder.setReceiverType(local.type(receiverParameter.getType()));
|
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.addValueParameters(local.valueParameter(valueParameterDescriptor));
|
||||||
}
|
}
|
||||||
|
|
||||||
builder.setReturnType(local.type(function.getReturnType()));
|
builder.setReturnType(local.type(descriptor.getReturnType()));
|
||||||
|
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
|||||||
+14
-5
@@ -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.JetType;
|
||||||
import org.jetbrains.jet.lang.types.TypeConstructor;
|
import org.jetbrains.jet.lang.types.TypeConstructor;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class DeserializedClassDescriptor extends ClassDescriptorBase implements ClassDescriptor {
|
public class DeserializedClassDescriptor extends ClassDescriptorBase implements ClassDescriptor {
|
||||||
|
|
||||||
@@ -227,7 +224,7 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void computeNonDeclaredFunctions(
|
protected void computeNonDeclaredFunctions(
|
||||||
@NotNull Name name, @NotNull List<FunctionDescriptor> functions
|
@NotNull Name name, @NotNull Collection<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()) {
|
||||||
@@ -236,6 +233,18 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements
|
|||||||
generateFakeOverrides(name, fromSupertypes, functions);
|
generateFakeOverrides(name, fromSupertypes, functions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void computeNonDeclaredProperties(
|
||||||
|
@NotNull Name name, @NotNull Collection<PropertyDescriptor> property
|
||||||
|
) {
|
||||||
|
Collection<PropertyDescriptor> fromSupertypes = new ArrayList<PropertyDescriptor>();
|
||||||
|
for (JetType supertype : classDescriptor.getTypeConstructor().getSupertypes()) {
|
||||||
|
//noinspection unchecked
|
||||||
|
fromSupertypes.addAll((Collection) supertype.getMemberScope().getProperties(name));
|
||||||
|
}
|
||||||
|
generateFakeOverrides(name, fromSupertypes, property);
|
||||||
|
}
|
||||||
|
|
||||||
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,
|
||||||
|
|||||||
+29
-7
@@ -34,6 +34,19 @@ import java.util.*;
|
|||||||
|
|
||||||
public abstract class DeserializedMemberScope implements JetScope {
|
public abstract class DeserializedMemberScope implements JetScope {
|
||||||
|
|
||||||
|
private static final Filter<ProtoBuf.Callable.CallableKind> FUNCTION = new Filter<ProtoBuf.Callable.CallableKind>() {
|
||||||
|
@Override
|
||||||
|
public boolean accept(ProtoBuf.Callable.CallableKind value) {
|
||||||
|
return value == ProtoBuf.Callable.CallableKind.FUN;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
private static final Filter<ProtoBuf.Callable.CallableKind> PROPERTY = new Filter<ProtoBuf.Callable.CallableKind>() {
|
||||||
|
@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 DeclarationDescriptor containingDeclaration;
|
||||||
private final DescriptorDeserializer deserializer;
|
private final DescriptorDeserializer deserializer;
|
||||||
private final Map<Name, List<ProtoBuf.Callable>> membersProtos;
|
private final Map<Name, List<ProtoBuf.Callable>> membersProtos;
|
||||||
@@ -90,13 +103,13 @@ public abstract class DeserializedMemberScope implements JetScope {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private <D extends CallableMemberDescriptor> List<D> computeMembersByName(Name name, ProtoBuf.Callable.CallableKind callableKind) {
|
private <D extends CallableMemberDescriptor> Collection<D> computeMembersByName(Name name, Filter<ProtoBuf.Callable.CallableKind> callableKind) {
|
||||||
List<ProtoBuf.Callable> memberProtos = membersProtos.get(name);
|
List<ProtoBuf.Callable> memberProtos = membersProtos.get(name);
|
||||||
|
|
||||||
List<D> descriptors = new ArrayList<D>(memberProtos != null ? memberProtos.size() : 0);
|
Collection<D> descriptors = new LinkedHashSet<D>(memberProtos != null ? memberProtos.size() : 0);
|
||||||
if (memberProtos != null) {
|
if (memberProtos != null) {
|
||||||
for (ProtoBuf.Callable memberProto : memberProtos) {
|
for (ProtoBuf.Callable memberProto : memberProtos) {
|
||||||
if (Flags.getCallableKind(memberProto.getFlags()) == callableKind) {
|
if (callableKind.accept(Flags.getCallableKind(memberProto.getFlags()))) {
|
||||||
//noinspection unchecked
|
//noinspection unchecked
|
||||||
descriptors.add((D) deserializer.loadCallable(memberProto));
|
descriptors.add((D) deserializer.loadCallable(memberProto));
|
||||||
}
|
}
|
||||||
@@ -107,13 +120,12 @@ public abstract class DeserializedMemberScope implements JetScope {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private Collection<FunctionDescriptor> computeFunctions(@NotNull Name name) {
|
private Collection<FunctionDescriptor> computeFunctions(@NotNull Name name) {
|
||||||
List<FunctionDescriptor> descriptors = computeMembersByName(name, ProtoBuf.Callable.CallableKind.FUN);
|
Collection<FunctionDescriptor> descriptors = computeMembersByName(name, FUNCTION);
|
||||||
computeNonDeclaredFunctions(name, descriptors);
|
computeNonDeclaredFunctions(name, descriptors);
|
||||||
return descriptors;
|
return descriptors;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void computeNonDeclaredFunctions(@NotNull Name name, @NotNull List<FunctionDescriptor> functions) {
|
protected void computeNonDeclaredFunctions(@NotNull Name name, @NotNull Collection<FunctionDescriptor> functions) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -124,7 +136,13 @@ public abstract class DeserializedMemberScope implements JetScope {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private Collection<VariableDescriptor> computeProperties(@NotNull Name name) {
|
private Collection<VariableDescriptor> computeProperties(@NotNull Name name) {
|
||||||
return Collections.emptyList(); // TODO
|
Collection<PropertyDescriptor> descriptors = computeMembersByName(name, PROPERTY);
|
||||||
|
computeNonDeclaredProperties(name, descriptors);
|
||||||
|
//noinspection unchecked
|
||||||
|
return (Collection) descriptors;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void computeNonDeclaredProperties(@NotNull Name name, @NotNull Collection<PropertyDescriptor> descriptors) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -221,4 +239,8 @@ public abstract class DeserializedMemberScope implements JetScope {
|
|||||||
return getAllDescriptors();
|
return getAllDescriptors();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private interface Filter<T> {
|
||||||
|
boolean accept(T value);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user