Primary constructors supported

This commit is contained in:
Andrey Breslav
2013-05-16 20:21:05 +04:00
committed by Alexander Udalov
parent 99d1a9b7d7
commit 2e978950ab
3 changed files with 54 additions and 8 deletions
@@ -22,10 +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.*;
import org.jetbrains.jet.lang.descriptors.impl.SimpleFunctionDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.impl.TypeParameterDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.impl.ValueParameterDescriptorImpl;
import org.jetbrains.jet.lang.types.Variance; import org.jetbrains.jet.lang.types.Variance;
import java.util.ArrayList; import java.util.ArrayList;
@@ -91,7 +88,7 @@ public class DescriptorDeserializer {
case VAR: case VAR:
return loadProperty(proto); return loadProperty(proto);
case CONSTRUCTOR: case CONSTRUCTOR:
break; return loadConstructor(proto);
} }
throw new IllegalArgumentException("Unsupported callable kind: " + callableKind); throw new IllegalArgumentException("Unsupported callable kind: " + callableKind);
} }
@@ -148,6 +145,25 @@ public class DescriptorDeserializer {
return function; return function;
} }
@NotNull
private CallableMemberDescriptor loadConstructor(@NotNull Callable proto) {
ClassDescriptor classDescriptor = (ClassDescriptor) containingDeclaration;
ConstructorDescriptorImpl descriptor = new ConstructorDescriptorImpl(
classDescriptor,
// TODO
Collections.<AnnotationDescriptor>emptyList(),
// TODO: primary
true);
DescriptorDeserializer local = new DescriptorDeserializer(this, descriptor, nameResolver);
descriptor.initialize(
classDescriptor.getTypeConstructor().getParameters(),
local.valueParameters(proto.getValueParametersList()),
visibility(Flags.getVisibility(proto.getFlags())),
!classDescriptor.isInner()
);
return descriptor;
}
private static CallableMemberDescriptor.Kind memberKind(Callable.MemberKind memberKind) { private static CallableMemberDescriptor.Kind memberKind(Callable.MemberKind memberKind) {
switch (memberKind) { switch (memberKind) {
case DECLARATION: case DECLARATION:
@@ -73,7 +73,13 @@ public class DescriptorSerializer {
} }
// TODO: nested classes // TODO: nested classes
// TODO: constructor
ConstructorDescriptor primaryConstructor = classDescriptor.getUnsubstitutedPrimaryConstructor();
if (primaryConstructor != null) {
builder.setPrimaryConstructor(local.callableProto(primaryConstructor));
}
// TODO: other constructors
// TODO: class object // TODO: class object
for (DeclarationDescriptor descriptor : classDescriptor.getDefaultType().getMemberScope().getAllDescriptors()) { for (DeclarationDescriptor descriptor : classDescriptor.getDefaultType().getMemberScope().getAllDescriptors()) {
@@ -25,6 +25,8 @@ 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.TraceUtil;
import org.jetbrains.jet.lang.resolve.lazy.storage.NullableLazyValue;
import org.jetbrains.jet.lang.resolve.lazy.storage.NullableLazyValueImpl;
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;
@@ -41,6 +43,8 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements
private final DeserializedMemberScope memberScope; private final DeserializedMemberScope memberScope;
private final ReceiverParameterDescriptor thisAsReceiverParameter; private final ReceiverParameterDescriptor thisAsReceiverParameter;
private final NullableLazyValue<ConstructorDescriptor> primaryConstructor;
private final Name name; private final Name name;
private final DeclarationDescriptor containingDeclaration; private final DeclarationDescriptor containingDeclaration;
private final DeserializedClassTypeConstructor typeConstructor; private final DeserializedClassTypeConstructor typeConstructor;
@@ -71,6 +75,13 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements
this.visibility = DescriptorDeserializer.visibility(Flags.getVisibility(flags)); this.visibility = DescriptorDeserializer.visibility(Flags.getVisibility(flags));
this.kind = DescriptorDeserializer.classKind(Flags.getClassKind(flags)); this.kind = DescriptorDeserializer.classKind(Flags.getClassKind(flags));
this.isInner = Flags.isInner(flags); this.isInner = Flags.isInner(flags);
this.primaryConstructor = new NullableLazyValueImpl<ConstructorDescriptor>() {
@Override
protected ConstructorDescriptor doCompute() {
return computePrimaryConstructor();
}
};
} }
@NotNull @NotNull
@@ -137,16 +148,29 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements
return JetScope.EMPTY; // TODO inner classes return JetScope.EMPTY; // TODO inner classes
} }
@Nullable
private ConstructorDescriptor computePrimaryConstructor() {
if (!classProto.hasPrimaryConstructor()) return null;
ProtoBuf.Callable constructorProto = classProto.getPrimaryConstructor();
return (ConstructorDescriptor) deserializer.loadCallable(constructorProto);
}
@Nullable @Nullable
@Override @Override
public ConstructorDescriptor getUnsubstitutedPrimaryConstructor() { public ConstructorDescriptor getUnsubstitutedPrimaryConstructor() {
return null; // TODO return primaryConstructor.compute();
} }
@NotNull @NotNull
@Override @Override
public Collection<ConstructorDescriptor> getConstructors() { public Collection<ConstructorDescriptor> getConstructors() {
return Collections.emptyList(); // TODO ConstructorDescriptor constructor = getUnsubstitutedPrimaryConstructor();
if (constructor == null) {
return Collections.emptyList();
}
// TODO: other constructors
return Collections.singletonList(constructor);
} }
@Nullable @Nullable