Primary constructors supported
This commit is contained in:
committed by
Alexander Udalov
parent
99d1a9b7d7
commit
2e978950ab
+21
-5
@@ -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:
|
||||||
|
|||||||
+7
-1
@@ -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()) {
|
||||||
|
|||||||
+26
-2
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user