Added visibility information to descriptors

This commit is contained in:
svtk
2011-09-23 13:02:11 +04:00
parent 8670d53a0b
commit 67fdbbd230
19 changed files with 216 additions and 37 deletions
@@ -23,6 +23,7 @@ public class JavaClassDescriptor extends MutableDeclarationDescriptor implements
private JetType classObjectType; private JetType classObjectType;
private final WritableFunctionGroup constructors = new WritableFunctionGroup("<init>"); private final WritableFunctionGroup constructors = new WritableFunctionGroup("<init>");
private Modality modality; private Modality modality;
private Visibility visibility;
private JetType superclassType; private JetType superclassType;
private final ClassKind kind; private final ClassKind kind;
private ClassReceiver implicitReceiver; private ClassReceiver implicitReceiver;
@@ -41,6 +42,10 @@ public class JavaClassDescriptor extends MutableDeclarationDescriptor implements
this.modality = modality; this.modality = modality;
} }
public void setVisibility(Visibility visibility) {
this.visibility = visibility;
}
public void setUnsubstitutedMemberScope(JavaClassMembersScope memberScope) { public void setUnsubstitutedMemberScope(JavaClassMembersScope memberScope) {
this.unsubstitutedMemberScope = memberScope; this.unsubstitutedMemberScope = memberScope;
} }
@@ -149,6 +154,12 @@ public class JavaClassDescriptor extends MutableDeclarationDescriptor implements
return modality; return modality;
} }
@NotNull
@Override
public Visibility getVisibility() {
return visibility;
}
@Override @Override
public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) { public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) {
return visitor.visitClassDescriptor(this, data); return visitor.visitClassDescriptor(this, data);
@@ -10,6 +10,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lang.types.*;
import java.util.*; import java.util.*;
@@ -110,6 +111,7 @@ public class JavaDescriptorResolver {
psiClass.hasModifierProperty(PsiModifier.ABSTRACT) || psiClass.isInterface(), psiClass.hasModifierProperty(PsiModifier.ABSTRACT) || psiClass.isInterface(),
!psiClass.hasModifierProperty(PsiModifier.FINAL)) !psiClass.hasModifierProperty(PsiModifier.FINAL))
); );
classDescriptor.setVisibility(resolveVisibilityFromPsiModifiers(semanticServices.getTrace(), psiClass));
classDescriptorCache.put(psiClass.getQualifiedName(), classDescriptor); classDescriptorCache.put(psiClass.getQualifiedName(), classDescriptor);
classDescriptor.setUnsubstitutedMemberScope(new JavaClassMembersScope(classDescriptor, psiClass, semanticServices, false)); classDescriptor.setUnsubstitutedMemberScope(new JavaClassMembersScope(classDescriptor, psiClass, semanticServices, false));
classDescriptor.setClassObjectMemberScope(new JavaClassMembersScope(classDescriptor, psiClass, semanticServices, true)); classDescriptor.setClassObjectMemberScope(new JavaClassMembersScope(classDescriptor, psiClass, semanticServices, true));
@@ -135,7 +137,7 @@ public class JavaDescriptorResolver {
classDescriptor, classDescriptor,
Collections.<AnnotationDescriptor>emptyList(), Collections.<AnnotationDescriptor>emptyList(),
false); false);
constructorDescriptor.initialize(typeParameters, Collections.<ValueParameterDescriptor>emptyList(), Modality.FINAL); constructorDescriptor.initialize(typeParameters, Collections.<ValueParameterDescriptor>emptyList(), Modality.FINAL, classDescriptor.getVisibility());
constructorDescriptor.setReturnType(classDescriptor.getDefaultType()); constructorDescriptor.setReturnType(classDescriptor.getDefaultType());
classDescriptor.addConstructor(constructorDescriptor); classDescriptor.addConstructor(constructorDescriptor);
semanticServices.getTrace().record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor); semanticServices.getTrace().record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor);
@@ -147,7 +149,8 @@ public class JavaDescriptorResolver {
classDescriptor, classDescriptor,
Collections.<AnnotationDescriptor>emptyList(), // TODO Collections.<AnnotationDescriptor>emptyList(), // TODO
false); false);
constructorDescriptor.initialize(typeParameters, resolveParameterDescriptors(constructorDescriptor, constructor.getParameterList().getParameters()), Modality.FINAL); constructorDescriptor.initialize(typeParameters, resolveParameterDescriptors(constructorDescriptor, constructor.getParameterList().getParameters()), Modality.FINAL,
resolveVisibilityFromPsiModifiers(semanticServices.getTrace(), constructor));
constructorDescriptor.setReturnType(classDescriptor.getDefaultType()); constructorDescriptor.setReturnType(classDescriptor.getDefaultType());
classDescriptor.addConstructor(constructorDescriptor); classDescriptor.addConstructor(constructorDescriptor);
semanticServices.getTrace().record(BindingContext.CONSTRUCTOR, constructor, constructorDescriptor); semanticServices.getTrace().record(BindingContext.CONSTRUCTOR, constructor, constructorDescriptor);
@@ -291,6 +294,7 @@ public class JavaDescriptorResolver {
containingDeclaration, containingDeclaration,
Collections.<AnnotationDescriptor>emptyList(), Collections.<AnnotationDescriptor>emptyList(),
Modality.FINAL, Modality.FINAL,
resolveVisibilityFromPsiModifiers(semanticServices.getTrace(), field),
!isFinal, !isFinal,
null, null,
field.getName(), field.getName(),
@@ -359,7 +363,8 @@ public class JavaDescriptorResolver {
resolveTypeParameters(functionDescriptorImpl, method.getTypeParameters()), resolveTypeParameters(functionDescriptorImpl, method.getTypeParameters()),
semanticServices.getDescriptorResolver().resolveParameterDescriptors(functionDescriptorImpl, parameters), semanticServices.getDescriptorResolver().resolveParameterDescriptors(functionDescriptorImpl, parameters),
semanticServices.getTypeTransformer().transformToType(returnType), semanticServices.getTypeTransformer().transformToType(returnType),
Modality.convertFromFlags(method.hasModifierProperty(PsiModifier.ABSTRACT), !method.hasModifierProperty(PsiModifier.FINAL)) Modality.convertFromFlags(method.hasModifierProperty(PsiModifier.ABSTRACT), !method.hasModifierProperty(PsiModifier.FINAL)),
resolveVisibilityFromPsiModifiers(semanticServices.getTrace(), method)
); );
semanticServices.getTrace().record(BindingContext.FUNCTION, method, functionDescriptorImpl); semanticServices.getTrace().record(BindingContext.FUNCTION, method, functionDescriptorImpl);
FunctionDescriptor substitutedFunctionDescriptor = functionDescriptorImpl; FunctionDescriptor substitutedFunctionDescriptor = functionDescriptorImpl;
@@ -368,4 +373,12 @@ public class JavaDescriptorResolver {
} }
return substitutedFunctionDescriptor; return substitutedFunctionDescriptor;
} }
private static Visibility resolveVisibilityFromPsiModifiers(BindingTrace trace, PsiModifierListOwner modifierListOwner) {
//TODO report error
return modifierListOwner.hasModifierProperty(PsiModifier.PUBLIC) ? Visibility.PUBLIC :
(modifierListOwner.hasModifierProperty(PsiModifier.PRIVATE) ? Visibility.PRIVATE :
(modifierListOwner.hasModifierProperty(PsiModifier.PROTECTED) ? Visibility.PROTECTED : Visibility.INTERNAL));
}
} }
@@ -54,6 +54,9 @@ public interface ClassDescriptor extends ClassifierDescriptor {
@NotNull @NotNull
Modality getModality(); Modality getModality();
@NotNull
Visibility getVisibility();
@NotNull @NotNull
ReceiverDescriptor getImplicitReceiver(); ReceiverDescriptor getImplicitReceiver();
@@ -155,6 +155,12 @@ public class ClassDescriptorImpl extends DeclarationDescriptorImpl implements Cl
return Modality.FINAL; return Modality.FINAL;
} }
@NotNull
@Override
public Visibility getVisibility() {
return Visibility.PUBLIC;
}
@NotNull @NotNull
@Override @Override
public ReceiverDescriptor getImplicitReceiver() { public ReceiverDescriptor getImplicitReceiver() {
@@ -28,13 +28,13 @@ public class ConstructorDescriptorImpl extends FunctionDescriptorImpl implements
@Override @Override
@Deprecated @Deprecated
public FunctionDescriptorImpl initialize(@Nullable JetType receiverType, @NotNull List<TypeParameterDescriptor> typeParameters, @NotNull List<ValueParameterDescriptor> unsubstitutedValueParameters, @Nullable JetType unsubstitutedReturnType, Modality modality) { public FunctionDescriptorImpl initialize(@Nullable JetType receiverType, @NotNull List<TypeParameterDescriptor> typeParameters, @NotNull List<ValueParameterDescriptor> unsubstitutedValueParameters, @Nullable JetType unsubstitutedReturnType, Modality modality, Visibility visibility) {
assert receiverType == null; assert receiverType == null;
return super.initialize(null, typeParameters, unsubstitutedValueParameters, unsubstitutedReturnType, modality); return super.initialize(null, typeParameters, unsubstitutedValueParameters, unsubstitutedReturnType, modality, visibility);
} }
public ConstructorDescriptorImpl initialize(@NotNull List<TypeParameterDescriptor> typeParameters, @NotNull List<ValueParameterDescriptor> unsubstitutedValueParameters, Modality modality) { public ConstructorDescriptorImpl initialize(@NotNull List<TypeParameterDescriptor> typeParameters, @NotNull List<ValueParameterDescriptor> unsubstitutedValueParameters, Modality modality, Visibility visibility) {
super.initialize(null, typeParameters, unsubstitutedValueParameters, null, modality); super.initialize(null, typeParameters, unsubstitutedValueParameters, null, modality, visibility);
return this; return this;
} }
@@ -28,6 +28,7 @@ public class FunctionDescriptorImpl extends DeclarationDescriptorImpl implements
private ReceiverDescriptor receiver; private ReceiverDescriptor receiver;
private Modality modality; private Modality modality;
private Visibility visibility;
private final Set<FunctionDescriptor> overriddenFunctions = Sets.newLinkedHashSet(); private final Set<FunctionDescriptor> overriddenFunctions = Sets.newLinkedHashSet();
private final FunctionDescriptor original; private final FunctionDescriptor original;
@@ -52,11 +53,13 @@ public class FunctionDescriptorImpl extends DeclarationDescriptorImpl implements
@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);
return this; return this;
} }
@@ -83,6 +86,12 @@ public class FunctionDescriptorImpl extends DeclarationDescriptorImpl implements
return modality; return modality;
} }
@NotNull
@Override
public Visibility getVisibility() {
return visibility;
}
public void addOverriddenFunction(@NotNull FunctionDescriptor overriddenFunction) { public void addOverriddenFunction(@NotNull FunctionDescriptor overriddenFunction) {
overriddenFunctions.add(overriddenFunction); overriddenFunctions.add(overriddenFunction);
} }
@@ -144,7 +153,8 @@ public class FunctionDescriptorImpl extends DeclarationDescriptorImpl implements
substitutedTypeParameters, substitutedTypeParameters,
substitutedValueParameters, substitutedValueParameters,
substitutedReturnType, substitutedReturnType,
modality modality,
visibility
); );
for (FunctionDescriptor overriddenFunction : overriddenFunctions) { for (FunctionDescriptor overriddenFunction : overriddenFunctions) {
substitutedDescriptor.addOverriddenFunction(overriddenFunction); substitutedDescriptor.addOverriddenFunction(overriddenFunction);
@@ -163,6 +163,12 @@ public class LazySubstitutingClassDescriptor implements ClassDescriptor {
return original.getModality(); return original.getModality();
} }
@NotNull
@Override
public Visibility getVisibility() {
return original.getVisibility();
}
@Override @Override
public boolean isClassObjectAValue() { public boolean isClassObjectAValue() {
return original.isClassObjectAValue(); return original.isClassObjectAValue();
@@ -8,4 +8,7 @@ import org.jetbrains.annotations.NotNull;
public interface MemberDescriptor { public interface MemberDescriptor {
@NotNull @NotNull
Modality getModality(); Modality getModality();
@NotNull
Visibility getVisibility();
} }
@@ -29,6 +29,7 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme
private Collection<JetType> supertypes = Lists.newArrayList(); private Collection<JetType> supertypes = Lists.newArrayList();
private Modality modality; private Modality modality;
private Visibility visibility;
private TypeConstructor typeConstructor; private TypeConstructor typeConstructor;
private final WritableScope scopeForMemberResolution; private final WritableScope scopeForMemberResolution;
private final WritableScope scopeForMemberLookup; private final WritableScope scopeForMemberLookup;
@@ -281,12 +282,22 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme
this.modality = modality; this.modality = modality;
} }
public void setVisibility(Visibility visibility) {
this.visibility = visibility;
}
@Override @Override
@NotNull @NotNull
public Modality getModality() { public Modality getModality() {
return modality; return modality;
} }
@NotNull
@Override
public Visibility getVisibility() {
return visibility;
}
@Override @Override
public String toString() { public String toString() {
return DescriptorRenderer.TEXT.render(this) + "[" + getClass().getCanonicalName() + "@" + System.identityHashCode(this) + "]"; return DescriptorRenderer.TEXT.render(this) + "[" + getClass().getCanonicalName() + "@" + System.identityHashCode(this) + "]";
@@ -15,18 +15,21 @@ public abstract class PropertyAccessorDescriptor extends DeclarationDescriptorIm
private final boolean hasBody; private final boolean hasBody;
private final boolean isDefault; private final boolean isDefault;
private final Modality modality; private final Modality modality;
private final Visibility visibility;
private final PropertyDescriptor correspondingProperty; private final PropertyDescriptor correspondingProperty;
protected PropertyAccessorDescriptor( public PropertyAccessorDescriptor(
@NotNull Modality modality, @NotNull Modality modality,
@NotNull Visibility visibility,
@NotNull PropertyDescriptor correspondingProperty, @NotNull PropertyDescriptor correspondingProperty,
@NotNull List<AnnotationDescriptor> annotations, @NotNull List<AnnotationDescriptor> annotations,
@NotNull String name, @NotNull String name,
boolean hasBody, boolean hasBody,
boolean isDefault) { boolean isDefault) {
super(correspondingProperty.getContainingDeclaration(), annotations, name); super(correspondingProperty.getContainingDeclaration(), annotations, name);
this.correspondingProperty = correspondingProperty;
this.modality = modality; this.modality = modality;
this.visibility = visibility;
this.correspondingProperty = correspondingProperty;
this.hasBody = hasBody; this.hasBody = hasBody;
this.isDefault = isDefault; this.isDefault = isDefault;
} }
@@ -63,6 +66,12 @@ public abstract class PropertyAccessorDescriptor extends DeclarationDescriptorIm
return modality; return modality;
} }
@NotNull
@Override
public Visibility getVisibility() {
return visibility;
}
@NotNull @NotNull
public PropertyDescriptor getCorrespondingProperty() { public PropertyDescriptor getCorrespondingProperty() {
return correspondingProperty; return correspondingProperty;
@@ -18,6 +18,7 @@ import java.util.List;
public class PropertyDescriptor extends VariableDescriptorImpl implements MemberDescriptor { public class PropertyDescriptor extends VariableDescriptorImpl implements MemberDescriptor {
private final Modality modality; private final Modality modality;
private final Visibility visibility;
private final boolean isVar; private final boolean isVar;
private final ReceiverDescriptor receiver; private final ReceiverDescriptor receiver;
private final List<TypeParameterDescriptor> typeParemeters = Lists.newArrayListWithCapacity(0); private final List<TypeParameterDescriptor> typeParemeters = Lists.newArrayListWithCapacity(0);
@@ -30,6 +31,7 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Member
@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,
@Nullable JetType receiverType, @Nullable JetType receiverType,
@NotNull String name, @NotNull String name,
@@ -40,6 +42,7 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Member
// assert outType != null; // assert outType != null;
this.isVar = isVar; this.isVar = isVar;
this.modality = modality; this.modality = modality;
this.visibility = visibility;
this.receiver = receiverType == null ? ReceiverDescriptor.NO_RECEIVER : new ExtensionReceiver(this, receiverType); this.receiver = receiverType == null ? ReceiverDescriptor.NO_RECEIVER : new ExtensionReceiver(this, receiverType);
this.original = original == null ? this : original.getOriginal(); this.original = original == null ? this : original.getOriginal();
} }
@@ -48,12 +51,13 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Member
@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,
@Nullable JetType receiverType, @Nullable JetType receiverType,
@NotNull String name, @NotNull String name,
@Nullable JetType inType, @Nullable JetType inType,
@NotNull JetType outType) { @NotNull JetType outType) {
this(null, containingDeclaration, annotations, modality, isVar, receiverType, name, inType, outType); this(null, containingDeclaration, annotations, modality, visibility, isVar, receiverType, name, inType, outType);
} }
private PropertyDescriptor( private PropertyDescriptor(
@@ -66,6 +70,7 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Member
original.getContainingDeclaration(), original.getContainingDeclaration(),
original.getAnnotations(), // TODO : substitute? original.getAnnotations(), // TODO : substitute?
original.getModality(), original.getModality(),
original.getVisibility(),
original.isVar, original.isVar,
receiverType, receiverType,
original.getName(), original.getName(),
@@ -107,6 +112,12 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Member
return modality; return modality;
} }
@NotNull
@Override
public Visibility getVisibility() {
return visibility;
}
@Nullable @Nullable
public PropertyGetterDescriptor getGetter() { public PropertyGetterDescriptor getGetter() {
return getter; return getter;
@@ -18,8 +18,8 @@ public class PropertyGetterDescriptor extends PropertyAccessorDescriptor {
private final Set<PropertyGetterDescriptor> overriddenGetters = Sets.newHashSet(); private final Set<PropertyGetterDescriptor> overriddenGetters = Sets.newHashSet();
private JetType returnType; private JetType returnType;
public PropertyGetterDescriptor(@NotNull Modality modality, @NotNull PropertyDescriptor correspondingProperty, @NotNull List<AnnotationDescriptor> annotations, @Nullable JetType returnType, boolean hasBody, boolean isDefault) { public PropertyGetterDescriptor(@NotNull Modality modality, @NotNull Visibility visibility, @NotNull PropertyDescriptor correspondingProperty, @NotNull List<AnnotationDescriptor> annotations, @Nullable JetType returnType, boolean hasBody, boolean isDefault) {
super(modality, correspondingProperty, annotations, "get-" + correspondingProperty.getName(), hasBody, isDefault); super(modality, visibility, correspondingProperty, annotations, "get-" + correspondingProperty.getName(), hasBody, isDefault);
this.returnType = returnType == null ? correspondingProperty.getOutType() : returnType; this.returnType = returnType == null ? correspondingProperty.getOutType() : returnType;
} }
@@ -19,8 +19,8 @@ public class PropertySetterDescriptor extends PropertyAccessorDescriptor {
private MutableValueParameterDescriptor parameter; private MutableValueParameterDescriptor parameter;
private final Set<PropertySetterDescriptor> overriddenSetters = Sets.newHashSet(); private final Set<PropertySetterDescriptor> overriddenSetters = Sets.newHashSet();
public PropertySetterDescriptor(@NotNull Modality modality, @NotNull PropertyDescriptor correspondingProperty, @NotNull List<AnnotationDescriptor> annotations, boolean hasBody, boolean isDefault) { public PropertySetterDescriptor(@NotNull Modality modality, @NotNull Visibility visibility, @NotNull PropertyDescriptor correspondingProperty, @NotNull List<AnnotationDescriptor> annotations, boolean hasBody, boolean isDefault) {
super(modality, correspondingProperty, annotations, "set-" + correspondingProperty.getName(), hasBody, isDefault); super(modality, visibility, correspondingProperty, annotations, "set-" + correspondingProperty.getName(), hasBody, isDefault);
} }
public void initialize(@NotNull MutableValueParameterDescriptor parameter) { public void initialize(@NotNull MutableValueParameterDescriptor parameter) {
@@ -16,7 +16,7 @@ public class VariableAsFunctionDescriptor extends FunctionDescriptorImpl {
assert outType != null; assert outType != null;
assert JetStandardClasses.isFunctionType(outType); assert JetStandardClasses.isFunctionType(outType);
VariableAsFunctionDescriptor result = new VariableAsFunctionDescriptor(variableDescriptor); VariableAsFunctionDescriptor result = new VariableAsFunctionDescriptor(variableDescriptor);
result.initialize(JetStandardClasses.getReceiverType(outType), Collections.<TypeParameterDescriptor>emptyList(), JetStandardClasses.getValueParameters(result, outType), JetStandardClasses.getReturnType(outType), Modality.FINAL); result.initialize(JetStandardClasses.getReceiverType(outType), Collections.<TypeParameterDescriptor>emptyList(), JetStandardClasses.getValueParameters(result, outType), JetStandardClasses.getReturnType(outType), Modality.FINAL, Visibility.LOCAL);
return result; return result;
} }
@@ -0,0 +1,23 @@
package org.jetbrains.jet.lang.descriptors;
/**
* @author svtk
*/
public enum Visibility {
PRIVATE(false),
PROTECTED(true),
INTERNAL(false),
PUBLIC(true),
INTERNAL_PROTECTED(false),
LOCAL(false);
private final boolean isAPI;
private Visibility(boolean visibleOutside) {
isAPI = visibleOutside;
}
public boolean isAPI() {
return isAPI;
}
}
@@ -21,6 +21,8 @@ import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope; import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl; import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl;
import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lang.types.*;
import org.jetbrains.jet.lexer.JetKeywordToken;
import org.jetbrains.jet.lexer.JetToken;
import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.jet.lexer.JetTokens;
import java.util.*; import java.util.*;
@@ -65,7 +67,8 @@ public class ClassDescriptorResolver {
} }
descriptor.setTypeParameterDescriptors(typeParameters); descriptor.setTypeParameterDescriptors(typeParameters);
Modality defaultModality = descriptor.getKind() == ClassKind.TRAIT ? Modality.ABSTRACT : Modality.FINAL; Modality defaultModality = descriptor.getKind() == ClassKind.TRAIT ? Modality.ABSTRACT : Modality.FINAL;
descriptor.setModality(resolveModalityFromModifiers(classElement.getModifierList(), defaultModality)); descriptor.setModality(resolveModalityFromModifiers(trace, classElement.getModifierList(), defaultModality));
descriptor.setVisibility(resolveVisibilityFromModifiers(trace, classElement.getModifierList()));
trace.record(BindingContext.CLASS, classElement, descriptor); trace.record(BindingContext.CLASS, classElement, descriptor);
} }
@@ -195,14 +198,16 @@ public class ClassDescriptorResolver {
} else { } else {
defaultModality = Modality.FINAL; defaultModality = Modality.FINAL;
} }
Modality modality = resolveModalityFromModifiers(function.getModifierList(), defaultModality); Modality modality = resolveModalityFromModifiers(trace, function.getModifierList(), defaultModality);
Visibility visibility = resolveVisibilityFromModifiers(trace, function.getModifierList());
functionDescriptor.initialize( functionDescriptor.initialize(
receiverType, receiverType,
typeParameterDescriptors, typeParameterDescriptors,
valueParameterDescriptors, valueParameterDescriptors,
returnType, returnType,
modality); modality,
visibility);
trace.record(BindingContext.FUNCTION, function, functionDescriptor); trace.record(BindingContext.FUNCTION, function, functionDescriptor);
return functionDescriptor; return functionDescriptor;
@@ -424,7 +429,8 @@ public class ClassDescriptorResolver {
PropertyDescriptor propertyDescriptor = new PropertyDescriptor( PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
containingDeclaration, containingDeclaration,
annotationResolver.createAnnotationStubs(modifierList), annotationResolver.createAnnotationStubs(modifierList),
resolveModalityFromModifiers(modifierList), // TODO : default modifiers differ in different contexts resolveModalityFromModifiers(trace, objectDeclaration.getModifierList()), // TODO : default modifiers differ in different contexts
resolveVisibilityFromModifiers(trace, objectDeclaration.getModifierList()),
false, false,
null, null,
JetPsiUtil.safeName(objectDeclaration.getName()), JetPsiUtil.safeName(objectDeclaration.getName()),
@@ -474,7 +480,8 @@ public class ClassDescriptorResolver {
PropertyDescriptor propertyDescriptor = new PropertyDescriptor( PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
containingDeclaration, containingDeclaration,
annotationResolver.resolveAnnotations(scope, modifierList), annotationResolver.resolveAnnotations(scope, modifierList),
resolveModalityFromModifiers(modifierList), // TODO : default modifiers differ in different contexts resolveModalityFromModifiers(trace, property.getModifierList()), // TODO : default modifiers differ in different contexts
resolveVisibilityFromModifiers(trace, property.getModifierList()),
isVar, isVar,
receiverType, receiverType,
JetPsiUtil.safeName(property.getName()), JetPsiUtil.safeName(property.getName()),
@@ -523,20 +530,31 @@ public class ClassDescriptorResolver {
} }
@NotNull @NotNull
private Modality resolveModalityFromModifiers(@Nullable JetModifierList modifierList) { /*package*/ static Modality resolveModalityFromModifiers(@NotNull BindingTrace trace, @Nullable JetModifierList modifierList) {
return resolveModalityFromModifiers(modifierList, Modality.FINAL); return resolveModalityFromModifiers(trace, modifierList, Modality.FINAL);
} }
@NotNull @NotNull
private Modality resolveModalityFromModifiers(@Nullable JetModifierList modifierList, @NotNull Modality defaultModality) { /*package*/ static Modality resolveModalityFromModifiers(@NotNull BindingTrace trace, @Nullable JetModifierList modifierList, @NotNull Modality defaultModality) {
if (modifierList == null) return defaultModality; if (modifierList == null) return defaultModality;
if (modifierList.hasModifier(JetTokens.ABSTRACT_KEYWORD)) { checkCompatibility(trace, modifierList, Lists.newArrayList(JetTokens.ABSTRACT_KEYWORD, JetTokens.OPEN_KEYWORD, JetTokens.FINAL_KEYWORD),
return Modality.ABSTRACT; Lists.<JetToken>newArrayList(JetTokens.ABSTRACT_KEYWORD, JetTokens.OPEN_KEYWORD));
} boolean hasAbstractModifier = modifierList.hasModifier(JetTokens.ABSTRACT_KEYWORD);
boolean hasOverrideModifier = modifierList.hasModifier(JetTokens.OVERRIDE_KEYWORD);
if (modifierList.hasModifier(JetTokens.OPEN_KEYWORD)) { if (modifierList.hasModifier(JetTokens.OPEN_KEYWORD)) {
if (hasAbstractModifier || hasOverrideModifier) {
trace.report(Errors.REDUNDANT_MODIFIER.on(modifierList, JetTokens.OPEN_KEYWORD, hasAbstractModifier ? JetTokens.ABSTRACT_KEYWORD : JetTokens.OVERRIDE_KEYWORD));
}
if (hasAbstractModifier) {
return Modality.ABSTRACT;
}
return Modality.OPEN; return Modality.OPEN;
} }
if (modifierList.hasModifier(JetTokens.OVERRIDE_KEYWORD)) { if (hasAbstractModifier) {
return Modality.ABSTRACT;
}
if (hasOverrideModifier) {
return Modality.OPEN; return Modality.OPEN;
} }
if (modifierList.hasModifier(JetTokens.FINAL_KEYWORD)) { if (modifierList.hasModifier(JetTokens.FINAL_KEYWORD)) {
@@ -545,6 +563,49 @@ public class ClassDescriptorResolver {
return defaultModality; return defaultModality;
} }
@NotNull
/*package*/ static Visibility resolveVisibilityFromModifiers(@NotNull BindingTrace trace, @Nullable JetModifierList modifierList) {
return resolveVisibilityFromModifiers(trace, modifierList, Visibility.INTERNAL);
}
@NotNull
/*package*/ static Visibility resolveVisibilityFromModifiers(@NotNull BindingTrace trace, @Nullable JetModifierList modifierList, @NotNull Visibility defaultVisibility) {
if (modifierList == null) return defaultVisibility;
checkCompatibility(trace, modifierList, Lists.newArrayList(JetTokens.PRIVATE_KEYWORD, JetTokens.PROTECTED_KEYWORD, JetTokens.PUBLIC_KEYWORD, JetTokens.INTERNAL_KEYWORD),
Lists.<JetToken>newArrayList(JetTokens.PROTECTED_KEYWORD, JetTokens.INTERNAL_KEYWORD));
if (modifierList.hasModifier(JetTokens.PRIVATE_KEYWORD)) return Visibility.PRIVATE;
if (modifierList.hasModifier(JetTokens.PUBLIC_KEYWORD)) return Visibility.PUBLIC;
if (modifierList.hasModifier(JetTokens.PROTECTED_KEYWORD)) {
if (modifierList.hasModifier(JetTokens.INTERNAL_KEYWORD)) {
return Visibility.INTERNAL_PROTECTED;
}
return Visibility.PROTECTED;
}
return defaultVisibility;
}
/*package*/ static boolean checkCompatibility(@NotNull BindingTrace trace, @Nullable JetModifierList modifierList, Collection<JetKeywordToken> availableModifiers, Collection<JetToken>... availableCombinations) {
if (modifierList == null) return true;
Collection<JetKeywordToken> presentModifiers = Sets.newLinkedHashSet();
for (JetKeywordToken modifier : availableModifiers) {
if (modifierList.hasModifier(modifier)) {
presentModifiers.add(modifier);
}
}
if (presentModifiers.size() == 1) {
return true;
}
for (Collection<JetToken> combination : availableCombinations) {
if (presentModifiers.containsAll(combination) && combination.containsAll(presentModifiers)) {
return true;
}
}
for (JetKeywordToken token : presentModifiers) {
trace.report(Errors.INCOMPATIBLE_MODIFIERS.on(modifierList.getModifierNode(token), presentModifiers));
}
return false;
}
@Nullable @Nullable
private PropertySetterDescriptor resolvePropertySetterDescriptor(@NotNull JetScope scope, @NotNull JetProperty property, @NotNull PropertyDescriptor propertyDescriptor) { private PropertySetterDescriptor resolvePropertySetterDescriptor(@NotNull JetScope scope, @NotNull JetProperty property, @NotNull PropertyDescriptor propertyDescriptor) {
JetPropertyAccessor setter = property.getSetter(); JetPropertyAccessor setter = property.getSetter();
@@ -554,7 +615,8 @@ public class ClassDescriptorResolver {
JetParameter parameter = setter.getParameter(); JetParameter parameter = setter.getParameter();
setterDescriptor = new PropertySetterDescriptor( setterDescriptor = new PropertySetterDescriptor(
resolveModalityFromModifiers(setter.getModifierList()), // TODO : default modifiers differ in different contexts resolveModalityFromModifiers(trace, setter.getModifierList()), // TODO : default modifiers differ in different contexts
resolveVisibilityFromModifiers(trace, setter.getModifierList(), propertyDescriptor.getVisibility()),
propertyDescriptor, annotations, setter.getBodyExpression() != null, false); propertyDescriptor, annotations, setter.getBodyExpression() != null, false);
if (parameter != null) { if (parameter != null) {
if (parameter.isRef()) { if (parameter.isRef()) {
@@ -596,6 +658,7 @@ public class ClassDescriptorResolver {
else if (property.isVar()) { else if (property.isVar()) {
setterDescriptor = new PropertySetterDescriptor( setterDescriptor = new PropertySetterDescriptor(
propertyDescriptor.getModality(), propertyDescriptor.getModality(),
propertyDescriptor.getVisibility(),
propertyDescriptor, Collections.<AnnotationDescriptor>emptyList(), false, true); propertyDescriptor, Collections.<AnnotationDescriptor>emptyList(), false, true);
} }
@@ -627,13 +690,15 @@ public class ClassDescriptorResolver {
} }
getterDescriptor = new PropertyGetterDescriptor( getterDescriptor = new PropertyGetterDescriptor(
resolveModalityFromModifiers(getter.getModifierList()), // TODO : default modifiers differ in different contexts resolveModalityFromModifiers(trace, getter.getModifierList()), // TODO : default modifiers differ in different contexts
resolveVisibilityFromModifiers(trace, getter.getModifierList(), propertyDescriptor.getVisibility()),
propertyDescriptor, annotations, returnType, getter.getBodyExpression() != null, false); propertyDescriptor, annotations, returnType, getter.getBodyExpression() != null, false);
trace.record(BindingContext.PROPERTY_ACCESSOR, getter, getterDescriptor); trace.record(BindingContext.PROPERTY_ACCESSOR, getter, getterDescriptor);
} }
else { else {
getterDescriptor = new PropertyGetterDescriptor( getterDescriptor = new PropertyGetterDescriptor(
propertyDescriptor.getModality(), propertyDescriptor.getModality(),
propertyDescriptor.getVisibility(),
propertyDescriptor, Collections.<AnnotationDescriptor>emptyList(), propertyDescriptor.getOutType(), false, true); propertyDescriptor, Collections.<AnnotationDescriptor>emptyList(), propertyDescriptor.getOutType(), false, true);
} }
return getterDescriptor; return getterDescriptor;
@@ -664,7 +729,8 @@ public class ClassDescriptorResolver {
constructorDescriptor, constructorDescriptor,
new WritableScopeImpl(scope, classDescriptor, new TraceBasedRedeclarationHandler(trace)).setDebugName("Scope with value parameters of a constructor"), new WritableScopeImpl(scope, classDescriptor, new TraceBasedRedeclarationHandler(trace)).setDebugName("Scope with value parameters of a constructor"),
valueParameters), valueParameters),
Modality.FINAL); Modality.FINAL,
resolveVisibilityFromModifiers(trace, modifierList));
} }
@Nullable @Nullable
@@ -700,7 +766,8 @@ public class ClassDescriptorResolver {
PropertyDescriptor propertyDescriptor = new PropertyDescriptor( PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
classDescriptor, classDescriptor,
annotationResolver.resolveAnnotations(scope, modifierList), annotationResolver.resolveAnnotations(scope, modifierList),
resolveModalityFromModifiers(modifierList), resolveModalityFromModifiers(trace, parameter.getModifierList()),
resolveVisibilityFromModifiers(trace, parameter.getModifierList()),
isMutable, isMutable,
null, null,
name == null ? "<no name>" : name, name == null ? "<no name>" : name,
@@ -96,6 +96,7 @@ public class TypeHierarchyResolver {
MutableClassDescriptor classObjectDescriptor = new MutableClassDescriptor(context.getTrace(), mutableClassDescriptor, outerScope, ClassKind.OBJECT); MutableClassDescriptor classObjectDescriptor = new MutableClassDescriptor(context.getTrace(), mutableClassDescriptor, outerScope, ClassKind.OBJECT);
classObjectDescriptor.setName("class-object-for-" + klass.getName()); classObjectDescriptor.setName("class-object-for-" + klass.getName());
classObjectDescriptor.setModality(Modality.FINAL); classObjectDescriptor.setModality(Modality.FINAL);
classObjectDescriptor.setVisibility(ClassDescriptorResolver.resolveVisibilityFromModifiers(context.getTrace(), klass.getModifierList()));
classObjectDescriptor.createTypeConstructor(); classObjectDescriptor.createTypeConstructor();
createPrimaryConstructor(classObjectDescriptor); createPrimaryConstructor(classObjectDescriptor);
mutableClassDescriptor.setClassObjectDescriptor(classObjectDescriptor); mutableClassDescriptor.setClassObjectDescriptor(classObjectDescriptor);
@@ -151,7 +152,7 @@ public class TypeHierarchyResolver {
private void createPrimaryConstructor(MutableClassDescriptor mutableClassDescriptor) { private void createPrimaryConstructor(MutableClassDescriptor mutableClassDescriptor) {
ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl(mutableClassDescriptor, Collections.<AnnotationDescriptor>emptyList(), true); ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl(mutableClassDescriptor, Collections.<AnnotationDescriptor>emptyList(), true);
constructorDescriptor.initialize(Collections.<TypeParameterDescriptor>emptyList(), Collections.<ValueParameterDescriptor>emptyList(), constructorDescriptor.initialize(Collections.<TypeParameterDescriptor>emptyList(), Collections.<ValueParameterDescriptor>emptyList(),
Modality.FINAL); Modality.FINAL, Visibility.INTERNAL);//TODO check set mutableClassDescriptor.getVisibility()
// TODO : make the constructor private? // TODO : make the constructor private?
mutableClassDescriptor.setPrimaryConstructor(constructorDescriptor); mutableClassDescriptor.setPrimaryConstructor(constructorDescriptor);
} }
@@ -265,8 +266,10 @@ public class TypeHierarchyResolver {
descriptor.createTypeConstructor(); descriptor.createTypeConstructor();
} }
for (Map.Entry<JetObjectDeclaration, MutableClassDescriptor> entry : context.getObjects().entrySet()) { for (Map.Entry<JetObjectDeclaration, MutableClassDescriptor> entry : context.getObjects().entrySet()) {
JetObjectDeclaration objectDeclaration = entry.getKey();
MutableClassDescriptor descriptor = entry.getValue(); MutableClassDescriptor descriptor = entry.getValue();
descriptor.setModality(Modality.FINAL); descriptor.setModality(Modality.FINAL);
descriptor.setVisibility(ClassDescriptorResolver.resolveVisibilityFromModifiers(context.getTrace(), objectDeclaration.getModifierList()));
descriptor.createTypeConstructor(); descriptor.createTypeConstructor();
} }
} }
@@ -118,6 +118,7 @@ public class ErrorUtils {
ERROR_CLASS, ERROR_CLASS,
Collections.<AnnotationDescriptor>emptyList(), Collections.<AnnotationDescriptor>emptyList(),
Modality.OPEN, Modality.OPEN,
Visibility.INTERNAL,
true, true,
null, null,
"<ERROR PROPERTY>", "<ERROR PROPERTY>",
@@ -130,7 +131,8 @@ public class ErrorUtils {
typeParameters, typeParameters,
getValueParameters(functionDescriptor, positionedValueArgumentTypes), getValueParameters(functionDescriptor, positionedValueArgumentTypes),
createErrorType("<ERROR FUNCTION RETURN>"), createErrorType("<ERROR FUNCTION RETURN>"),
Modality.OPEN Modality.OPEN,
Visibility.INTERNAL
); );
} }
@@ -140,7 +142,8 @@ public class ErrorUtils {
Collections.<TypeParameterDescriptor>emptyList(), // TODO Collections.<TypeParameterDescriptor>emptyList(), // TODO
Collections.<ValueParameterDescriptor>emptyList(), // TODO Collections.<ValueParameterDescriptor>emptyList(), // TODO
createErrorType("<ERROR FUNCTION RETURN TYPE>"), createErrorType("<ERROR FUNCTION RETURN TYPE>"),
Modality.OPEN Modality.OPEN,
Visibility.INTERNAL
); );
} }
@@ -975,7 +975,7 @@ public class JetTypeInferrer {
else { else {
effectiveReceiverType = receiverType; effectiveReceiverType = receiverType;
} }
functionDescriptor.initialize(effectiveReceiverType, Collections.<TypeParameterDescriptor>emptyList(), valueParameterDescriptors, null, Modality.FINAL); functionDescriptor.initialize(effectiveReceiverType, Collections.<TypeParameterDescriptor>emptyList(), valueParameterDescriptors, null, Modality.FINAL, Visibility.LOCAL);
context.trace.record(BindingContext.FUNCTION, expression, functionDescriptor); context.trace.record(BindingContext.FUNCTION, expression, functionDescriptor);
JetType returnType = NO_EXPECTED_TYPE; JetType returnType = NO_EXPECTED_TYPE;