diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java index 6dd284f9c8b..c6161e70803 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java @@ -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; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java index 66828888f85..81d2d6a84a9 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java @@ -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 descriptors) { + private static void resolveUnknownVisibilityForOverriddenDescriptors(@NotNull Collection 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 descriptors) { + private static Visibility findMaxVisibility(@NotNull Collection descriptors) { if (descriptors.isEmpty()) { return Visibilities.INTERNAL; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassDescriptor.java index 7608c685226..dddd075a302 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassDescriptor.java @@ -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 diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassMemberScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassMemberScope.java index c4ba917781b..673ce10e83a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassMemberScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassMemberScope.java @@ -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 getFunctions(@NotNull Name name) { + // TODO: this should be handled by lazy function descriptors + Set 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 result) { Collection fromSupertypes = Lists.newArrayList(); @@ -101,6 +113,21 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope getProperties(@NotNull Name name) { + // TODO: this should be handled by lazy property descriptors + Set 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 result) { diff --git a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveDescriptorRendererTestGenerated.java b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveDescriptorRendererTestGenerated.java index ef31029938b..a0dbfcb22fa 100644 --- a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveDescriptorRendererTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveDescriptorRendererTestGenerated.java @@ -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 methodNames = new HashSet(); for (Method method : clazz.getDeclaredMethods()) { diff --git a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java index e8833720ba9..0dd90578711 100644 --- a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java @@ -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) {