Inherited visibility resolution fixed
This commit is contained in:
@@ -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
|
||||
|
||||
+31
-4
@@ -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) {
|
||||
|
||||
+5
@@ -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()) {
|
||||
|
||||
+5
-10
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user