visibility can be set only after resolve overridden members, so method 'setVisibility' was separated

This commit is contained in:
Svetlana Isakova
2012-04-03 16:34:49 +04:00
parent 31cf0ce736
commit f64920246a
9 changed files with 53 additions and 37 deletions
@@ -251,12 +251,12 @@ public abstract class CodegenContext {
PropertyDescriptor myAccessor = new PropertyDescriptor(contextType, PropertyDescriptor myAccessor = new PropertyDescriptor(contextType,
Collections.<AnnotationDescriptor>emptyList(), Collections.<AnnotationDescriptor>emptyList(),
pd.getModality(), pd.getModality(),
pd.getVisibility(),
pd.isVar(), pd.isVar(),
pd.isObjectDeclaration(), pd.isObjectDeclaration(),
pd.getName() + "$bridge$" + accessors.size(), pd.getName() + "$bridge$" + accessors.size(),
CallableMemberDescriptor.Kind.DECLARATION CallableMemberDescriptor.Kind.DECLARATION
); );
myAccessor.setVisibility(pd.getVisibility());
JetType receiverType = pd.getReceiverParameter().exists() ? pd.getReceiverParameter().getType() : null; JetType receiverType = pd.getReceiverParameter().exists() ? pd.getReceiverParameter().getType() : null;
myAccessor.setType(pd.getType(), Collections.<TypeParameterDescriptor>emptyList(), pd.getExpectedThisObject(), receiverType); myAccessor.setType(pd.getType(), Collections.<TypeParameterDescriptor>emptyList(), pd.getExpectedThisObject(), receiverType);
@@ -1150,11 +1150,11 @@ public class JavaDescriptorResolver {
owner, owner,
resolveAnnotations(anyMember.getMember().psiMember), resolveAnnotations(anyMember.getMember().psiMember),
modality, modality,
resolveVisibilityFromPsiModifiers(anyMember.getMember().psiMember),
isVar, isVar,
false, false,
propertyName, propertyName,
CallableMemberDescriptor.Kind.DECLARATION); CallableMemberDescriptor.Kind.DECLARATION);
propertyDescriptor.setVisibility(resolveVisibilityFromPsiModifiers(anyMember.getMember().psiMember));
PropertyGetterDescriptor getterDescriptor = null; PropertyGetterDescriptor getterDescriptor = null;
PropertySetterDescriptor setterDescriptor = null; PropertySetterDescriptor setterDescriptor = null;
@@ -48,7 +48,8 @@ public class ConstructorDescriptorImpl extends FunctionDescriptorImpl implements
//isStatic - for java only //isStatic - for java only
public ConstructorDescriptorImpl initialize(@NotNull List<TypeParameterDescriptor> typeParameters, @NotNull List<ValueParameterDescriptor> unsubstitutedValueParameters, Visibility visibility, boolean isStatic) { public ConstructorDescriptorImpl initialize(@NotNull List<TypeParameterDescriptor> typeParameters, @NotNull List<ValueParameterDescriptor> unsubstitutedValueParameters, Visibility visibility, boolean isStatic) {
super.initialize(null, isStatic ? ReceiverDescriptor.NO_RECEIVER : getExpectedThisObject(getContainingDeclaration()), typeParameters, unsubstitutedValueParameters, null, Modality.FINAL, visibility); super.initialize(null, isStatic ? ReceiverDescriptor.NO_RECEIVER : getExpectedThisObject(getContainingDeclaration()), typeParameters, unsubstitutedValueParameters, null, Modality.FINAL);
setVisibility(visibility);
return this; return this;
} }
@@ -78,13 +78,11 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorImpl i
@NotNull List<TypeParameterDescriptor> typeParameters, @NotNull List<TypeParameterDescriptor> typeParameters,
@NotNull List<ValueParameterDescriptor> unsubstitutedValueParameters, @NotNull List<ValueParameterDescriptor> unsubstitutedValueParameters,
@Nullable JetType unsubstitutedReturnType, @Nullable JetType unsubstitutedReturnType,
@Nullable Modality modality, @Nullable Modality modality) {
@NotNull Visibility visibility) {
this.typeParameters = typeParameters; this.typeParameters = typeParameters;
this.unsubstitutedValueParameters = unsubstitutedValueParameters; this.unsubstitutedValueParameters = unsubstitutedValueParameters;
this.unsubstitutedReturnType = unsubstitutedReturnType; this.unsubstitutedReturnType = unsubstitutedReturnType;
this.modality = modality; this.modality = modality;
this.visibility = visibility;
this.receiver = receiverType == null ? NO_RECEIVER : new ExtensionReceiver(this, receiverType); this.receiver = receiverType == null ? NO_RECEIVER : new ExtensionReceiver(this, receiverType);
this.expectedThisObject = expectedThisObject; this.expectedThisObject = expectedThisObject;
@@ -106,6 +104,10 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorImpl i
return this; return this;
} }
public void setVisibility(@NotNull Visibility visibility) {
this.visibility = visibility;
}
public void setReturnType(@NotNull JetType unsubstitutedReturnType) { public void setReturnType(@NotNull JetType unsubstitutedReturnType) {
this.unsubstitutedReturnType = unsubstitutedReturnType; this.unsubstitutedReturnType = unsubstitutedReturnType;
} }
@@ -221,9 +223,8 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorImpl i
substitutedTypeParameters, substitutedTypeParameters,
substitutedValueParameters, substitutedValueParameters,
substitutedReturnType, substitutedReturnType,
newModality, newModality);
visibility substitutedDescriptor.setVisibility(visibility);
);
if (copyOverrides) { if (copyOverrides) {
for (FunctionDescriptor overriddenFunction : overriddenFunctions) { for (FunctionDescriptor overriddenFunction : overriddenFunctions) {
substitutedDescriptor.addOverriddenDescriptor(overriddenFunction.substitute(substitutor)); substitutedDescriptor.addOverriddenDescriptor(overriddenFunction.substitute(substitutor));
@@ -126,7 +126,8 @@ public class FunctionDescriptorUtil {
Collections.<TypeParameterDescriptor>emptyList(), Collections.<TypeParameterDescriptor>emptyList(),
JetStandardClasses.getValueParameters(functionDescriptor, functionType), JetStandardClasses.getValueParameters(functionDescriptor, functionType),
JetStandardClasses.getReturnTypeFromFunctionType(functionType), JetStandardClasses.getReturnTypeFromFunctionType(functionType),
Modality.FINAL, Visibilities.LOCAL); Modality.FINAL);
functionDescriptor.setVisibility(Visibilities.LOCAL);
} }
public static <D extends CallableDescriptor> D alphaConvertTypeParameters(D candidate) { public static <D extends CallableDescriptor> D alphaConvertTypeParameters(D candidate) {
@@ -39,7 +39,7 @@ import static org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor
public class PropertyDescriptor extends VariableDescriptorImpl implements CallableMemberDescriptor { public class PropertyDescriptor extends VariableDescriptorImpl implements CallableMemberDescriptor {
private final Modality modality; private final Modality modality;
private final Visibility visibility; private Visibility visibility;
private final boolean isVar; private final boolean isVar;
private final boolean isObject; private final boolean isObject;
private final Set<PropertyDescriptor> overriddenProperties = Sets.newLinkedHashSet(); private final Set<PropertyDescriptor> overriddenProperties = Sets.newLinkedHashSet();
@@ -48,7 +48,7 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab
private ReceiverDescriptor expectedThisObject; private ReceiverDescriptor expectedThisObject;
private ReceiverDescriptor receiver; private ReceiverDescriptor receiver;
private List<TypeParameterDescriptor> typeParemeters; private List<TypeParameterDescriptor> typeParameters;
private PropertyGetterDescriptor getter; private PropertyGetterDescriptor getter;
private PropertySetterDescriptor setter; private PropertySetterDescriptor setter;
@@ -67,7 +67,6 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab
@NotNull DeclarationDescriptor containingDeclaration, @NotNull DeclarationDescriptor containingDeclaration,
@NotNull List<AnnotationDescriptor> annotations, @NotNull List<AnnotationDescriptor> annotations,
@NotNull Modality modality, @NotNull Modality modality,
@NotNull Visibility visibility,
boolean isVar, boolean isVar,
boolean isObject, boolean isObject,
@NotNull String name, @NotNull String name,
@@ -76,7 +75,6 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab
this.isVar = isVar; this.isVar = isVar;
this.isObject = isObject; this.isObject = isObject;
this.modality = modality; this.modality = modality;
this.visibility = visibility;
this.original = original == null ? this : original.getOriginal(); this.original = original == null ? this : original.getOriginal();
this.kind = kind; this.kind = kind;
} }
@@ -85,12 +83,11 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab
@NotNull DeclarationDescriptor containingDeclaration, @NotNull DeclarationDescriptor containingDeclaration,
@NotNull List<AnnotationDescriptor> annotations, @NotNull List<AnnotationDescriptor> annotations,
@NotNull Modality modality, @NotNull Modality modality,
@NotNull Visibility visibility,
boolean isVar, boolean isVar,
boolean isObject, boolean isObject,
@NotNull String name, @NotNull String name,
Kind kind) { Kind kind) {
this(null, containingDeclaration, annotations, modality, visibility, isVar, isObject, name, kind); this(null, containingDeclaration, annotations, modality, isVar, isObject, name, kind);
} }
public PropertyDescriptor( public PropertyDescriptor(
@@ -106,7 +103,7 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab
@NotNull JetType outType, @NotNull JetType outType,
Kind kind Kind kind
) { ) {
this(containingDeclaration, annotations, modality, visibility, isVar, isObject, name, kind); this(containingDeclaration, annotations, modality, isVar, isObject, name, kind);
setType(outType, Collections.<TypeParameterDescriptor>emptyList(), expectedThisObject, receiverType); setType(outType, Collections.<TypeParameterDescriptor>emptyList(), expectedThisObject, receiverType);
} }
@@ -120,7 +117,7 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab
public void setType(@NotNull JetType outType, @NotNull List<TypeParameterDescriptor> typeParameters, @NotNull ReceiverDescriptor expectedThisObject, @NotNull ReceiverDescriptor receiver) { public void setType(@NotNull JetType outType, @NotNull List<TypeParameterDescriptor> typeParameters, @NotNull ReceiverDescriptor expectedThisObject, @NotNull ReceiverDescriptor receiver) {
setOutType(outType); setOutType(outType);
this.typeParemeters = typeParameters; this.typeParameters = typeParameters;
this.receiver = receiver; this.receiver = receiver;
this.expectedThisObject = expectedThisObject; this.expectedThisObject = expectedThisObject;
@@ -131,10 +128,14 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab
this.setter = setter; this.setter = setter;
} }
public void setVisibility(@NotNull Visibility visibility) {
this.visibility = visibility;
}
@NotNull @NotNull
@Override @Override
public List<TypeParameterDescriptor> getTypeParameters() { public List<TypeParameterDescriptor> getTypeParameters() {
return typeParemeters; return typeParameters;
} }
@NotNull @NotNull
@@ -206,8 +207,16 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab
private PropertyDescriptor doSubstitute(TypeSubstitutor originalSubstitutor, private PropertyDescriptor doSubstitute(TypeSubstitutor originalSubstitutor,
DeclarationDescriptor newOwner, Modality newModality, boolean preserveOriginal, boolean copyOverrides, Kind kind) { DeclarationDescriptor newOwner, Modality newModality, boolean preserveOriginal, boolean copyOverrides, Kind kind) {
final PropertyDescriptor thisProperty = this;
PropertyDescriptor substitutedDescriptor = new PropertyDescriptor(preserveOriginal ? getOriginal() : this, newOwner, PropertyDescriptor substitutedDescriptor = new PropertyDescriptor(preserveOriginal ? getOriginal() : this, newOwner,
getAnnotations(), newModality, getVisibility(), isVar(), isObjectDeclaration(), getName(), kind); getAnnotations(), newModality, isVar(), isObjectDeclaration(), getName(), kind) {
@NotNull
@Override
public Visibility getVisibility() {
// visibility of property can be not set yet
return thisProperty.getVisibility();
}
};
List<TypeParameterDescriptor> substitutedTypeParameters = Lists.newArrayList(); List<TypeParameterDescriptor> substitutedTypeParameters = Lists.newArrayList();
TypeSubstitutor substitutor = DescriptorSubstitutor.substituteTypeParameters(getTypeParameters(), originalSubstitutor, substitutedDescriptor, substitutedTypeParameters); TypeSubstitutor substitutor = DescriptorSubstitutor.substituteTypeParameters(getTypeParameters(), originalSubstitutor, substitutedDescriptor, substitutedTypeParameters);
@@ -50,18 +50,19 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme
super(containingDeclaration, original, annotations, name, kind); super(containingDeclaration, original, annotations, name, kind);
} }
public SimpleFunctionDescriptorImpl initialize(@Nullable JetType receiverType, public SimpleFunctionDescriptorImpl initialize(
@NotNull ReceiverDescriptor expectedThisObject, @Nullable JetType receiverType,
@NotNull List<TypeParameterDescriptor> typeParameters, @NotNull ReceiverDescriptor expectedThisObject,
@NotNull List<ValueParameterDescriptor> unsubstitutedValueParameters, @NotNull List<TypeParameterDescriptor> typeParameters,
@Nullable JetType unsubstitutedReturnType, @NotNull List<ValueParameterDescriptor> unsubstitutedValueParameters,
@Nullable Modality modality, @Nullable JetType unsubstitutedReturnType,
@NotNull Visibility visibility, @Nullable Modality modality,
boolean isInline) { @NotNull Visibility visibility,
SimpleFunctionDescriptorImpl result = (SimpleFunctionDescriptorImpl)super.initialize(receiverType, expectedThisObject, typeParameters, unsubstitutedValueParameters, boolean isInline) {
unsubstitutedReturnType, modality, visibility); super.initialize(receiverType, expectedThisObject, typeParameters, unsubstitutedValueParameters, unsubstitutedReturnType, modality);
result.isInline = isInline; setVisibility(visibility);
return result; this.isInline = isInline;
return this;
} }
@NotNull @NotNull
@@ -482,17 +482,16 @@ public class DescriptorResolver {
@NotNull JetClassOrObject objectDeclaration, @NotNull JetClassOrObject objectDeclaration,
@NotNull ClassDescriptor classDescriptor, BindingTrace trace) { @NotNull ClassDescriptor classDescriptor, BindingTrace trace) {
JetModifierList modifierList = objectDeclaration.getModifierList(); JetModifierList modifierList = objectDeclaration.getModifierList();
Visibility visibility = resolveVisibilityFromModifiers(objectDeclaration.getModifierList());
PropertyDescriptor propertyDescriptor = new PropertyDescriptor( PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
containingDeclaration, containingDeclaration,
annotationResolver.createAnnotationStubs(modifierList, trace), annotationResolver.createAnnotationStubs(modifierList, trace),
Modality.FINAL, Modality.FINAL,
visibility,
false, false,
true, true,
JetPsiUtil.safeName(objectDeclaration.getName()), JetPsiUtil.safeName(objectDeclaration.getName()),
CallableMemberDescriptor.Kind.DECLARATION CallableMemberDescriptor.Kind.DECLARATION
); );
propertyDescriptor.setVisibility(resolveVisibilityFromModifiers(modifierList));
propertyDescriptor.setType(classDescriptor.getDefaultType(), Collections.<TypeParameterDescriptor>emptyList(), DescriptorUtils.getExpectedThisObjectIfNeeded(containingDeclaration), ReceiverDescriptor.NO_RECEIVER); propertyDescriptor.setType(classDescriptor.getDefaultType(), Collections.<TypeParameterDescriptor>emptyList(), DescriptorUtils.getExpectedThisObjectIfNeeded(containingDeclaration), ReceiverDescriptor.NO_RECEIVER);
propertyDescriptor.initialize(createDefaultGetter(propertyDescriptor), null); propertyDescriptor.initialize(createDefaultGetter(propertyDescriptor), null);
JetObjectDeclarationName nameAsDeclaration = objectDeclaration.getNameAsDeclaration(); JetObjectDeclarationName nameAsDeclaration = objectDeclaration.getNameAsDeclaration();
@@ -544,12 +543,12 @@ public class DescriptorResolver {
containingDeclaration, containingDeclaration,
annotationResolver.resolveAnnotations(scope, modifierList, trace), annotationResolver.resolveAnnotations(scope, modifierList, trace),
resolveModalityFromModifiers(property.getModifierList(), defaultModality), resolveModalityFromModifiers(property.getModifierList(), defaultModality),
resolveVisibilityFromModifiers(property.getModifierList()),
isVar, isVar,
false, false,
JetPsiUtil.safeName(property.getName()), JetPsiUtil.safeName(property.getName()),
CallableMemberDescriptor.Kind.DECLARATION CallableMemberDescriptor.Kind.DECLARATION
); );
propertyDescriptor.setVisibility(resolveVisibilityFromModifiers(property.getModifierList()));
List<TypeParameterDescriptor> typeParameterDescriptors; List<TypeParameterDescriptor> typeParameterDescriptors;
JetScope scopeWithTypeParameters; JetScope scopeWithTypeParameters;
@@ -683,6 +682,9 @@ public class DescriptorResolver {
} }
return Visibilities.PROTECTED; return Visibilities.PROTECTED;
} }
if (modifierList.hasModifier(JetTokens.INTERNAL_KEYWORD)) {
return Visibilities.INTERNAL;
}
return defaultVisibility; return defaultVisibility;
} }
@@ -859,12 +861,12 @@ public class DescriptorResolver {
classDescriptor, classDescriptor,
annotationResolver.resolveAnnotations(scope, modifierList, trace), annotationResolver.resolveAnnotations(scope, modifierList, trace),
resolveModalityFromModifiers(parameter.getModifierList(), Modality.FINAL), resolveModalityFromModifiers(parameter.getModifierList(), Modality.FINAL),
resolveVisibilityFromModifiers(parameter.getModifierList()),
isMutable, isMutable,
false, false,
name == null ? "<no name>" : name, name == null ? "<no name>" : name,
CallableMemberDescriptor.Kind.DECLARATION CallableMemberDescriptor.Kind.DECLARATION
); );
propertyDescriptor.setVisibility(resolveVisibilityFromModifiers(parameter.getModifierList()));
propertyDescriptor.setType(type, Collections.<TypeParameterDescriptor>emptyList(), DescriptorUtils.getExpectedThisObjectIfNeeded(classDescriptor), ReceiverDescriptor.NO_RECEIVER); propertyDescriptor.setType(type, Collections.<TypeParameterDescriptor>emptyList(), DescriptorUtils.getExpectedThisObjectIfNeeded(classDescriptor), ReceiverDescriptor.NO_RECEIVER);
PropertyGetterDescriptor getter = createDefaultGetter(propertyDescriptor); PropertyGetterDescriptor getter = createDefaultGetter(propertyDescriptor);
@@ -155,7 +155,8 @@ public class JetStandardClasses {
Collections.<AnnotationDescriptor>emptyList(), Collections.<AnnotationDescriptor>emptyList(),
true, Variance.OUT_VARIANCE, "T" + (j + 1), j); true, Variance.OUT_VARIANCE, "T" + (j + 1), j);
parameters.add(typeParameterDescriptor); parameters.add(typeParameterDescriptor);
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(classDescriptor, Collections.<AnnotationDescriptor>emptyList(), Modality.FINAL, Visibilities.PUBLIC, false, false, "_" + (j + 1), CallableMemberDescriptor.Kind.DECLARATION); PropertyDescriptor propertyDescriptor = new PropertyDescriptor(classDescriptor, Collections.<AnnotationDescriptor>emptyList(), Modality.FINAL, false, false, "_" + (j + 1), CallableMemberDescriptor.Kind.DECLARATION);
propertyDescriptor.setVisibility(Visibilities.PUBLIC);
propertyDescriptor.setType(typeParameterDescriptor.getDefaultType(), Collections.<TypeParameterDescriptor>emptyList(), classDescriptor.getImplicitReceiver(), ReceiverDescriptor.NO_RECEIVER); propertyDescriptor.setType(typeParameterDescriptor.getDefaultType(), Collections.<TypeParameterDescriptor>emptyList(), classDescriptor.getImplicitReceiver(), ReceiverDescriptor.NO_RECEIVER);
PropertyGetterDescriptor getterDescriptor = new PropertyGetterDescriptor(propertyDescriptor, Collections.<AnnotationDescriptor>emptyList(), Modality.FINAL, Visibilities.PUBLIC, false, true, CallableMemberDescriptor.Kind.DECLARATION); PropertyGetterDescriptor getterDescriptor = new PropertyGetterDescriptor(propertyDescriptor, Collections.<AnnotationDescriptor>emptyList(), Modality.FINAL, Visibilities.PUBLIC, false, true, CallableMemberDescriptor.Kind.DECLARATION);
getterDescriptor.initialize(typeParameterDescriptor.getDefaultType()); getterDescriptor.initialize(typeParameterDescriptor.getDefaultType());