Inherited visibility resolution fixed
This commit is contained in:
@@ -753,13 +753,13 @@ public class DescriptorResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@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;
|
Visibility defaultVisibility = modifierList != null && modifierList.hasModifier(JetTokens.OVERRIDE_KEYWORD) ? Visibilities.INHERITED : Visibilities.INTERNAL;
|
||||||
return resolveVisibilityFromModifiers(modifierList, defaultVisibility);
|
return resolveVisibilityFromModifiers(modifierList, defaultVisibility);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@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 == null) return defaultVisibility;
|
||||||
if (modifierList.hasModifier(JetTokens.PRIVATE_KEYWORD)) return Visibilities.PRIVATE;
|
if (modifierList.hasModifier(JetTokens.PRIVATE_KEYWORD)) return Visibilities.PRIVATE;
|
||||||
if (modifierList.hasModifier(JetTokens.PUBLIC_KEYWORD)) return Visibilities.PUBLIC;
|
if (modifierList.hasModifier(JetTokens.PUBLIC_KEYWORD)) return Visibilities.PUBLIC;
|
||||||
|
|||||||
@@ -165,7 +165,7 @@ public class OverrideResolver {
|
|||||||
declaration = (JetDeclaration) element;
|
declaration = (JetDeclaration) element;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
resolveUnknownVisibilityForMember(declaration, memberDescriptor);
|
resolveUnknownVisibilityForMember(declaration, memberDescriptor, trace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -519,8 +519,8 @@ public class OverrideResolver {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void resolveUnknownVisibilityForMember(@Nullable JetDeclaration member, @NotNull CallableMemberDescriptor memberDescriptor) {
|
public static void resolveUnknownVisibilityForMember(@Nullable JetDeclaration member, @NotNull CallableMemberDescriptor memberDescriptor, @NotNull BindingTrace trace) {
|
||||||
resolveUnknownVisibilityForOverriddenDescriptors(memberDescriptor.getOverriddenDescriptors());
|
resolveUnknownVisibilityForOverriddenDescriptors(memberDescriptor.getOverriddenDescriptors(), trace);
|
||||||
if (memberDescriptor.getVisibility() != Visibilities.INHERITED) {
|
if (memberDescriptor.getVisibility() != Visibilities.INHERITED) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -536,7 +536,7 @@ public class OverrideResolver {
|
|||||||
if (memberDescriptor instanceof PropertyDescriptor) {
|
if (memberDescriptor instanceof PropertyDescriptor) {
|
||||||
((PropertyDescriptor)memberDescriptor).setVisibility(visibility);
|
((PropertyDescriptor)memberDescriptor).setVisibility(visibility);
|
||||||
for (PropertyAccessorDescriptor accessor : ((PropertyDescriptor) memberDescriptor).getAccessors()) {
|
for (PropertyAccessorDescriptor accessor : ((PropertyDescriptor) memberDescriptor).getAccessors()) {
|
||||||
resolveUnknownVisibilityForMember(null, accessor);
|
resolveUnknownVisibilityForMember(null, accessor, trace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (memberDescriptor instanceof FunctionDescriptorImpl) {
|
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) {
|
for (CallableMemberDescriptor descriptor : descriptors) {
|
||||||
if (descriptor.getVisibility() == Visibilities.INHERITED) {
|
if (descriptor.getVisibility() == Visibilities.INHERITED) {
|
||||||
PsiElement element = BindingContextUtils.descriptorToDeclaration(trace.getBindingContext(), descriptor);
|
PsiElement element = BindingContextUtils.descriptorToDeclaration(trace.getBindingContext(), descriptor);
|
||||||
JetDeclaration declaration = (element instanceof JetDeclaration) ? (JetDeclaration) element : null;
|
JetDeclaration declaration = (element instanceof JetDeclaration) ? (JetDeclaration) element : null;
|
||||||
resolveUnknownVisibilityForMember(declaration, descriptor);
|
resolveUnknownVisibilityForMember(declaration, descriptor, trace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private Visibility findMaxVisibility(@NotNull Collection<? extends CallableMemberDescriptor> descriptors) {
|
private static Visibility findMaxVisibility(@NotNull Collection<? extends CallableMemberDescriptor> descriptors) {
|
||||||
if (descriptors.isEmpty()) {
|
if (descriptors.isEmpty()) {
|
||||||
return Visibilities.INTERNAL;
|
return Visibilities.INTERNAL;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
|
|||||||
Modality defaultModality = kind == ClassKind.TRAIT ? Modality.ABSTRACT : Modality.FINAL;
|
Modality defaultModality = kind == ClassKind.TRAIT ? Modality.ABSTRACT : Modality.FINAL;
|
||||||
JetModifierList modifierList = classLikeInfo.getModifierList();
|
JetModifierList modifierList = classLikeInfo.getModifierList();
|
||||||
this.modality = DescriptorResolver.resolveModalityFromModifiers(modifierList, defaultModality);
|
this.modality = DescriptorResolver.resolveModalityFromModifiers(modifierList, defaultModality);
|
||||||
this.visibility = DescriptorResolver.resolveVisibilityFromModifiers(modifierList);
|
this.visibility = DescriptorResolver.resolveVisibilityFromModifiers(modifierList, Visibilities.INTERNAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+31
-4
@@ -17,6 +17,7 @@
|
|||||||
package org.jetbrains.jet.lang.resolve.lazy;
|
package org.jetbrains.jet.lang.resolve.lazy;
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
import com.intellij.psi.PsiElement;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.lang.descriptors.*;
|
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.JetClassOrObject;
|
||||||
import org.jetbrains.jet.lang.psi.JetDeclaration;
|
import org.jetbrains.jet.lang.psi.JetDeclaration;
|
||||||
import org.jetbrains.jet.lang.psi.JetParameter;
|
import org.jetbrains.jet.lang.psi.JetParameter;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingContextUtils;
|
import org.jetbrains.jet.lang.resolve.*;
|
||||||
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.name.Name;
|
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
|
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
|
@Override
|
||||||
protected void getNonDeclaredFunctions(@NotNull Name name, @NotNull final Set<FunctionDescriptor> result) {
|
protected void getNonDeclaredFunctions(@NotNull Name name, @NotNull final Set<FunctionDescriptor> result) {
|
||||||
Collection<FunctionDescriptor> fromSupertypes = Lists.newArrayList();
|
Collection<FunctionDescriptor> fromSupertypes = Lists.newArrayList();
|
||||||
@@ -101,6 +113,21 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
|
|||||||
generateFakeOverrides(name, fromSupertypes, result, FunctionDescriptor.class);
|
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
|
@Override
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
protected void getNonDeclaredProperties(@NotNull Name name, @NotNull final Set<VariableDescriptor> result) {
|
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");
|
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) {
|
public static void allTestsPresent(Class<?> clazz, File testDataDir, boolean recursive) {
|
||||||
Set<String> methodNames = new HashSet<String>();
|
Set<String> methodNames = new HashSet<String>();
|
||||||
for (Method method : clazz.getDeclaredMethods()) {
|
for (Method method : clazz.getDeclaredMethods()) {
|
||||||
|
|||||||
+5
-10
@@ -541,14 +541,12 @@ public class LazyResolveNamespaceComparingTestGenerated {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testOverrideClassVal() throws Exception {
|
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
|
@Test
|
||||||
public void testOverrideTraitVal() throws Exception {
|
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
|
@Test
|
||||||
@@ -698,8 +696,7 @@ public class LazyResolveNamespaceComparingTestGenerated {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testInternalAbstractTraitMembersOverridden() throws Exception {
|
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
|
@Test
|
||||||
@@ -858,8 +855,7 @@ public class LazyResolveNamespaceComparingTestGenerated {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testInnerClassesInGeneric() throws Exception {
|
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
|
@Test
|
||||||
@@ -1038,8 +1034,7 @@ public class LazyResolveNamespaceComparingTestGenerated {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSimpleClass() throws Exception {
|
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) {
|
public static void allTestsPresent(Class<?> clazz, File testDataDir, boolean recursive) {
|
||||||
|
|||||||
Reference in New Issue
Block a user