Inherited visibility resolution fixed

This commit is contained in:
Andrey Breslav
2012-06-25 13:20:36 +02:00
parent 150b54a615
commit 6632c6abfc
6 changed files with 51 additions and 24 deletions
@@ -753,13 +753,13 @@ public class DescriptorResolver {
}
@NotNull
public static Visibility resolveVisibilityFromModifiers(@Nullable JetModifierList modifierList) {
/*package*/ static Visibility resolveVisibilityFromModifiers(@Nullable JetModifierList modifierList) {
Visibility defaultVisibility = modifierList != null && modifierList.hasModifier(JetTokens.OVERRIDE_KEYWORD) ? Visibilities.INHERITED : Visibilities.INTERNAL;
return resolveVisibilityFromModifiers(modifierList, defaultVisibility);
}
@NotNull
/*package*/ static Visibility resolveVisibilityFromModifiers(@Nullable JetModifierList modifierList, @NotNull Visibility defaultVisibility) {
public static Visibility resolveVisibilityFromModifiers(@Nullable JetModifierList modifierList, @NotNull Visibility defaultVisibility) {
if (modifierList == null) return defaultVisibility;
if (modifierList.hasModifier(JetTokens.PRIVATE_KEYWORD)) return Visibilities.PRIVATE;
if (modifierList.hasModifier(JetTokens.PUBLIC_KEYWORD)) return Visibilities.PUBLIC;
@@ -165,7 +165,7 @@ public class OverrideResolver {
declaration = (JetDeclaration) element;
}
}
resolveUnknownVisibilityForMember(declaration, memberDescriptor);
resolveUnknownVisibilityForMember(declaration, memberDescriptor, trace);
}
}
@@ -519,8 +519,8 @@ public class OverrideResolver {
return false;
}
private void resolveUnknownVisibilityForMember(@Nullable JetDeclaration member, @NotNull CallableMemberDescriptor memberDescriptor) {
resolveUnknownVisibilityForOverriddenDescriptors(memberDescriptor.getOverriddenDescriptors());
public static void resolveUnknownVisibilityForMember(@Nullable JetDeclaration member, @NotNull CallableMemberDescriptor memberDescriptor, @NotNull BindingTrace trace) {
resolveUnknownVisibilityForOverriddenDescriptors(memberDescriptor.getOverriddenDescriptors(), trace);
if (memberDescriptor.getVisibility() != Visibilities.INHERITED) {
return;
}
@@ -536,7 +536,7 @@ public class OverrideResolver {
if (memberDescriptor instanceof PropertyDescriptor) {
((PropertyDescriptor)memberDescriptor).setVisibility(visibility);
for (PropertyAccessorDescriptor accessor : ((PropertyDescriptor) memberDescriptor).getAccessors()) {
resolveUnknownVisibilityForMember(null, accessor);
resolveUnknownVisibilityForMember(null, accessor, trace);
}
}
else if (memberDescriptor instanceof FunctionDescriptorImpl) {
@@ -548,18 +548,18 @@ public class OverrideResolver {
}
}
private void resolveUnknownVisibilityForOverriddenDescriptors(@NotNull Collection<? extends CallableMemberDescriptor> descriptors) {
private static void resolveUnknownVisibilityForOverriddenDescriptors(@NotNull Collection<? extends CallableMemberDescriptor> descriptors, @NotNull BindingTrace trace) {
for (CallableMemberDescriptor descriptor : descriptors) {
if (descriptor.getVisibility() == Visibilities.INHERITED) {
PsiElement element = BindingContextUtils.descriptorToDeclaration(trace.getBindingContext(), descriptor);
JetDeclaration declaration = (element instanceof JetDeclaration) ? (JetDeclaration) element : null;
resolveUnknownVisibilityForMember(declaration, descriptor);
resolveUnknownVisibilityForMember(declaration, descriptor, trace);
}
}
}
@Nullable
private Visibility findMaxVisibility(@NotNull Collection<? extends CallableMemberDescriptor> descriptors) {
private static Visibility findMaxVisibility(@NotNull Collection<? extends CallableMemberDescriptor> descriptors) {
if (descriptors.isEmpty()) {
return Visibilities.INTERNAL;
}
@@ -87,7 +87,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
Modality defaultModality = kind == ClassKind.TRAIT ? Modality.ABSTRACT : Modality.FINAL;
JetModifierList modifierList = classLikeInfo.getModifierList();
this.modality = DescriptorResolver.resolveModalityFromModifiers(modifierList, defaultModality);
this.visibility = DescriptorResolver.resolveVisibilityFromModifiers(modifierList);
this.visibility = DescriptorResolver.resolveVisibilityFromModifiers(modifierList, Visibilities.INTERNAL);
}
@Override
@@ -17,6 +17,7 @@
package org.jetbrains.jet.lang.resolve.lazy;
import com.google.common.collect.Lists;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*;
@@ -25,10 +26,7 @@ import org.jetbrains.jet.lang.psi.JetClass;
import org.jetbrains.jet.lang.psi.JetClassOrObject;
import org.jetbrains.jet.lang.psi.JetDeclaration;
import org.jetbrains.jet.lang.psi.JetParameter;
import org.jetbrains.jet.lang.resolve.BindingContextUtils;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.DescriptorResolver;
import org.jetbrains.jet.lang.resolve.OverrideResolver;
import org.jetbrains.jet.lang.resolve.*;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
@@ -92,6 +90,20 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
}
@NotNull
@Override
public Set<FunctionDescriptor> getFunctions(@NotNull Name name) {
// TODO: this should be handled by lazy function descriptors
Set<FunctionDescriptor> functions = super.getFunctions(name);
for (FunctionDescriptor functionDescriptor : functions) {
if (functionDescriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) continue;
PsiElement element =
BindingContextUtils.callableDescriptorToDeclaration(resolveSession.getTrace().getBindingContext(), functionDescriptor);
OverrideResolver.resolveUnknownVisibilityForMember((JetDeclaration) element, functionDescriptor, resolveSession.getTrace());
}
return functions;
}
@Override
protected void getNonDeclaredFunctions(@NotNull Name name, @NotNull final Set<FunctionDescriptor> result) {
Collection<FunctionDescriptor> fromSupertypes = Lists.newArrayList();
@@ -101,6 +113,21 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
generateFakeOverrides(name, fromSupertypes, result, FunctionDescriptor.class);
}
@NotNull
@Override
public Set<VariableDescriptor> getProperties(@NotNull Name name) {
// TODO: this should be handled by lazy property descriptors
Set<VariableDescriptor> properties = super.getProperties(name);
for (VariableDescriptor variableDescriptor : properties) {
PropertyDescriptor propertyDescriptor = (PropertyDescriptor) variableDescriptor;
if (propertyDescriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) continue;
PsiElement element =
BindingContextUtils.callableDescriptorToDeclaration(resolveSession.getTrace().getBindingContext(), propertyDescriptor);
OverrideResolver.resolveUnknownVisibilityForMember((JetDeclaration) element, propertyDescriptor, resolveSession.getTrace());
}
return properties;
}
@Override
@SuppressWarnings("unchecked")
protected void getNonDeclaredProperties(@NotNull Name name, @NotNull final Set<VariableDescriptor> result) {
@@ -73,6 +73,11 @@ public class LazyResolveDescriptorRendererTestGenerated {
doTest("compiler/testData/renderer/TupleTypes.kt");
}
@Test
public void testInheritedMembersVisibility() throws Exception {
doTest("compiler/testData/renderer/InheritedMembersVisibility.kt");
}
public static void allTestsPresent(Class<?> clazz, File testDataDir, boolean recursive) {
Set<String> methodNames = new HashSet<String>();
for (Method method : clazz.getDeclaredMethods()) {
@@ -541,14 +541,12 @@ public class LazyResolveNamespaceComparingTestGenerated {
@Test
public void testOverrideClassVal() throws Exception {
//TODO Disabled until lazy resolve supports inherited visibility (KT-2285)
//doTestSinglePackage("compiler/testData/readKotlinBinaryClass/prop/OverrideClassVal.kt");
doTestSinglePackage("compiler/testData/readKotlinBinaryClass/prop/OverrideClassVal.kt");
}
@Test
public void testOverrideTraitVal() throws Exception {
//TODO Disabled until lazy resolve supports inherited visibility (KT-2285)
//doTestSinglePackage("compiler/testData/readKotlinBinaryClass/prop/OverrideTraitVal.kt");
doTestSinglePackage("compiler/testData/readKotlinBinaryClass/prop/OverrideTraitVal.kt");
}
@Test
@@ -698,8 +696,7 @@ public class LazyResolveNamespaceComparingTestGenerated {
@Test
public void testInternalAbstractTraitMembersOverridden() throws Exception {
//TODO Disabled until lazy resolve supports inherited visibility (KT-2285)
//doTestSinglePackage("compiler/testData/readKotlinBinaryClass/visibility/InternalAbstractTraitMembersOverridden.kt");
doTestSinglePackage("compiler/testData/readKotlinBinaryClass/visibility/InternalAbstractTraitMembersOverridden.kt");
}
@Test
@@ -858,8 +855,7 @@ public class LazyResolveNamespaceComparingTestGenerated {
@Test
public void testInnerClassesInGeneric() throws Exception {
//TODO Disabled until lazy resolve supports inherited visibility (KT-2285)
//doTestSinglePackage("compiler/testData/readJavaBinaryClass/InnerClassesInGeneric.kt");
doTestSinglePackage("compiler/testData/readJavaBinaryClass/InnerClassesInGeneric.kt");
}
@Test
@@ -1038,8 +1034,7 @@ public class LazyResolveNamespaceComparingTestGenerated {
@Test
public void testSimpleClass() throws Exception {
//TODO Disabled until lazy resolve supports inherited visibility (KT-2285)
//doTest("compiler/testData/lazyResolve/simpleClass.kt");
doTest("compiler/testData/lazyResolve/simpleClass.kt");
}
public static void allTestsPresent(Class<?> clazz, File testDataDir, boolean recursive) {