Refactor OverridingUtil.resolveUnknownVisibilities

Get rid of dependency on BindingTrace, move the corresponding error reporting
logic to OverrideResolver
This commit is contained in:
Alexander Udalov
2013-08-21 21:08:34 +04:00
parent 6ca71349f8
commit 8400d2b8cf
14 changed files with 79 additions and 115 deletions
@@ -21,7 +21,6 @@ import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.java.JavaClassFinderImpl; import org.jetbrains.jet.lang.resolve.java.JavaClassFinderImpl;
import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedExternalSignatureResolver; import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedExternalSignatureResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedJavaResolverCache; import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedJavaResolverCache;
import org.jetbrains.jet.lang.resolve.java.resolver.FakeOverrideVisibilityResolverImpl;
import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedErrorReporter; import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedErrorReporter;
import org.jetbrains.jet.lang.resolve.java.resolver.PsiBasedMethodSignatureChecker; import org.jetbrains.jet.lang.resolve.java.resolver.PsiBasedMethodSignatureChecker;
import org.jetbrains.jet.lang.resolve.java.resolver.PsiBasedExternalAnnotationResolver; import org.jetbrains.jet.lang.resolve.java.resolver.PsiBasedExternalAnnotationResolver;
@@ -53,7 +52,6 @@ public class InjectorForJavaDescriptorResolver {
private final JavaClassFinderImpl javaClassFinder; private final JavaClassFinderImpl javaClassFinder;
private final TraceBasedExternalSignatureResolver traceBasedExternalSignatureResolver; private final TraceBasedExternalSignatureResolver traceBasedExternalSignatureResolver;
private final TraceBasedJavaResolverCache traceBasedJavaResolverCache; private final TraceBasedJavaResolverCache traceBasedJavaResolverCache;
private final FakeOverrideVisibilityResolverImpl fakeOverrideVisibilityResolver;
private final TraceBasedErrorReporter traceBasedErrorReporter; private final TraceBasedErrorReporter traceBasedErrorReporter;
private final PsiBasedMethodSignatureChecker psiBasedMethodSignatureChecker; private final PsiBasedMethodSignatureChecker psiBasedMethodSignatureChecker;
private final PsiBasedExternalAnnotationResolver psiBasedExternalAnnotationResolver; private final PsiBasedExternalAnnotationResolver psiBasedExternalAnnotationResolver;
@@ -84,7 +82,6 @@ public class InjectorForJavaDescriptorResolver {
this.javaClassFinder = new JavaClassFinderImpl(); this.javaClassFinder = new JavaClassFinderImpl();
this.traceBasedExternalSignatureResolver = new TraceBasedExternalSignatureResolver(); this.traceBasedExternalSignatureResolver = new TraceBasedExternalSignatureResolver();
this.traceBasedJavaResolverCache = new TraceBasedJavaResolverCache(); this.traceBasedJavaResolverCache = new TraceBasedJavaResolverCache();
this.fakeOverrideVisibilityResolver = new FakeOverrideVisibilityResolverImpl();
this.traceBasedErrorReporter = new TraceBasedErrorReporter(); this.traceBasedErrorReporter = new TraceBasedErrorReporter();
this.psiBasedMethodSignatureChecker = new PsiBasedMethodSignatureChecker(); this.psiBasedMethodSignatureChecker = new PsiBasedMethodSignatureChecker();
this.psiBasedExternalAnnotationResolver = new PsiBasedExternalAnnotationResolver(); this.psiBasedExternalAnnotationResolver = new PsiBasedExternalAnnotationResolver();
@@ -113,8 +110,6 @@ public class InjectorForJavaDescriptorResolver {
traceBasedJavaResolverCache.setTrace(bindingTrace); traceBasedJavaResolverCache.setTrace(bindingTrace);
fakeOverrideVisibilityResolver.setTrace(bindingTrace);
traceBasedErrorReporter.setTrace(bindingTrace); traceBasedErrorReporter.setTrace(bindingTrace);
psiBasedMethodSignatureChecker.setAnnotationResolver(javaAnnotationResolver); psiBasedMethodSignatureChecker.setAnnotationResolver(javaAnnotationResolver);
@@ -176,8 +171,8 @@ public class InjectorForJavaDescriptorResolver {
javaFunctionResolver.setAnnotationResolver(javaAnnotationResolver); javaFunctionResolver.setAnnotationResolver(javaAnnotationResolver);
javaFunctionResolver.setCache(traceBasedJavaResolverCache); javaFunctionResolver.setCache(traceBasedJavaResolverCache);
javaFunctionResolver.setErrorReporter(traceBasedErrorReporter);
javaFunctionResolver.setExternalSignatureResolver(traceBasedExternalSignatureResolver); javaFunctionResolver.setExternalSignatureResolver(traceBasedExternalSignatureResolver);
javaFunctionResolver.setFakeOverrideVisibilityResolver(fakeOverrideVisibilityResolver);
javaFunctionResolver.setSignatureChecker(psiBasedMethodSignatureChecker); javaFunctionResolver.setSignatureChecker(psiBasedMethodSignatureChecker);
javaFunctionResolver.setTypeParameterResolver(javaTypeParameterResolver); javaFunctionResolver.setTypeParameterResolver(javaTypeParameterResolver);
javaFunctionResolver.setTypeTransformer(javaTypeTransformer); javaFunctionResolver.setTypeTransformer(javaTypeTransformer);
@@ -187,8 +182,8 @@ public class InjectorForJavaDescriptorResolver {
javaPropertyResolver.setAnnotationResolver(javaAnnotationResolver); javaPropertyResolver.setAnnotationResolver(javaAnnotationResolver);
javaPropertyResolver.setCache(traceBasedJavaResolverCache); javaPropertyResolver.setCache(traceBasedJavaResolverCache);
javaPropertyResolver.setErrorReporter(traceBasedErrorReporter);
javaPropertyResolver.setExternalSignatureResolver(traceBasedExternalSignatureResolver); javaPropertyResolver.setExternalSignatureResolver(traceBasedExternalSignatureResolver);
javaPropertyResolver.setFakeOverrideVisibilityResolver(fakeOverrideVisibilityResolver);
javaPropertyResolver.setTypeTransformer(javaTypeTransformer); javaPropertyResolver.setTypeTransformer(javaTypeTransformer);
javaSupertypeResolver.setClassResolver(javaClassResolver); javaSupertypeResolver.setClassResolver(javaClassResolver);
@@ -34,7 +34,6 @@ import org.jetbrains.jet.lang.resolve.java.mapping.JavaToKotlinClassMap;
import org.jetbrains.jet.lang.resolve.java.JavaClassFinderImpl; import org.jetbrains.jet.lang.resolve.java.JavaClassFinderImpl;
import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedExternalSignatureResolver; import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedExternalSignatureResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedJavaResolverCache; import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedJavaResolverCache;
import org.jetbrains.jet.lang.resolve.java.resolver.FakeOverrideVisibilityResolverImpl;
import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedErrorReporter; import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedErrorReporter;
import org.jetbrains.jet.lang.resolve.java.resolver.PsiBasedMethodSignatureChecker; import org.jetbrains.jet.lang.resolve.java.resolver.PsiBasedMethodSignatureChecker;
import org.jetbrains.jet.lang.resolve.java.resolver.PsiBasedExternalAnnotationResolver; import org.jetbrains.jet.lang.resolve.java.resolver.PsiBasedExternalAnnotationResolver;
@@ -94,7 +93,6 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
private final JavaClassFinderImpl javaClassFinder; private final JavaClassFinderImpl javaClassFinder;
private final TraceBasedExternalSignatureResolver traceBasedExternalSignatureResolver; private final TraceBasedExternalSignatureResolver traceBasedExternalSignatureResolver;
private final TraceBasedJavaResolverCache traceBasedJavaResolverCache; private final TraceBasedJavaResolverCache traceBasedJavaResolverCache;
private final FakeOverrideVisibilityResolverImpl fakeOverrideVisibilityResolver;
private final TraceBasedErrorReporter traceBasedErrorReporter; private final TraceBasedErrorReporter traceBasedErrorReporter;
private final PsiBasedMethodSignatureChecker psiBasedMethodSignatureChecker; private final PsiBasedMethodSignatureChecker psiBasedMethodSignatureChecker;
private final PsiBasedExternalAnnotationResolver psiBasedExternalAnnotationResolver; private final PsiBasedExternalAnnotationResolver psiBasedExternalAnnotationResolver;
@@ -155,7 +153,6 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
this.javaClassFinder = new JavaClassFinderImpl(); this.javaClassFinder = new JavaClassFinderImpl();
this.traceBasedExternalSignatureResolver = new TraceBasedExternalSignatureResolver(); this.traceBasedExternalSignatureResolver = new TraceBasedExternalSignatureResolver();
this.traceBasedJavaResolverCache = new TraceBasedJavaResolverCache(); this.traceBasedJavaResolverCache = new TraceBasedJavaResolverCache();
this.fakeOverrideVisibilityResolver = new FakeOverrideVisibilityResolverImpl();
this.traceBasedErrorReporter = new TraceBasedErrorReporter(); this.traceBasedErrorReporter = new TraceBasedErrorReporter();
this.psiBasedMethodSignatureChecker = new PsiBasedMethodSignatureChecker(); this.psiBasedMethodSignatureChecker = new PsiBasedMethodSignatureChecker();
this.psiBasedExternalAnnotationResolver = new PsiBasedExternalAnnotationResolver(); this.psiBasedExternalAnnotationResolver = new PsiBasedExternalAnnotationResolver();
@@ -239,8 +236,6 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
traceBasedJavaResolverCache.setTrace(bindingTrace); traceBasedJavaResolverCache.setTrace(bindingTrace);
fakeOverrideVisibilityResolver.setTrace(bindingTrace);
traceBasedErrorReporter.setTrace(bindingTrace); traceBasedErrorReporter.setTrace(bindingTrace);
psiBasedMethodSignatureChecker.setAnnotationResolver(javaAnnotationResolver); psiBasedMethodSignatureChecker.setAnnotationResolver(javaAnnotationResolver);
@@ -367,8 +362,8 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
javaFunctionResolver.setAnnotationResolver(javaAnnotationResolver); javaFunctionResolver.setAnnotationResolver(javaAnnotationResolver);
javaFunctionResolver.setCache(traceBasedJavaResolverCache); javaFunctionResolver.setCache(traceBasedJavaResolverCache);
javaFunctionResolver.setErrorReporter(traceBasedErrorReporter);
javaFunctionResolver.setExternalSignatureResolver(traceBasedExternalSignatureResolver); javaFunctionResolver.setExternalSignatureResolver(traceBasedExternalSignatureResolver);
javaFunctionResolver.setFakeOverrideVisibilityResolver(fakeOverrideVisibilityResolver);
javaFunctionResolver.setSignatureChecker(psiBasedMethodSignatureChecker); javaFunctionResolver.setSignatureChecker(psiBasedMethodSignatureChecker);
javaFunctionResolver.setTypeParameterResolver(javaTypeParameterResolver); javaFunctionResolver.setTypeParameterResolver(javaTypeParameterResolver);
javaFunctionResolver.setTypeTransformer(javaTypeTransformer); javaFunctionResolver.setTypeTransformer(javaTypeTransformer);
@@ -378,8 +373,8 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
javaPropertyResolver.setAnnotationResolver(javaAnnotationResolver); javaPropertyResolver.setAnnotationResolver(javaAnnotationResolver);
javaPropertyResolver.setCache(traceBasedJavaResolverCache); javaPropertyResolver.setCache(traceBasedJavaResolverCache);
javaPropertyResolver.setErrorReporter(traceBasedErrorReporter);
javaPropertyResolver.setExternalSignatureResolver(traceBasedExternalSignatureResolver); javaPropertyResolver.setExternalSignatureResolver(traceBasedExternalSignatureResolver);
javaPropertyResolver.setFakeOverrideVisibilityResolver(fakeOverrideVisibilityResolver);
javaPropertyResolver.setTypeTransformer(javaTypeTransformer); javaPropertyResolver.setTypeTransformer(javaTypeTransformer);
javaSupertypeResolver.setClassResolver(javaClassResolver); javaSupertypeResolver.setClassResolver(javaClassResolver);
@@ -1,22 +0,0 @@
package org.jetbrains.jet.lang.resolve.java.resolver;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.OverridingUtil;
import javax.inject.Inject;
public class FakeOverrideVisibilityResolverImpl implements FakeOverrideVisibilityResolver {
private BindingTrace trace;
@Inject
public void setTrace(BindingTrace trace) {
this.trace = trace;
}
@Override
public void resolveUnknownVisibilityForMember(@NotNull CallableMemberDescriptor descriptor) {
OverridingUtil.resolveUnknownVisibilityForMember(null, descriptor, trace);
}
}
@@ -17,7 +17,11 @@
package org.jetbrains.jet.lang.resolve.java.resolver; package org.jetbrains.jet.lang.resolve.java.resolver;
import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor;
import org.jetbrains.jet.lang.psi.JetDeclaration;
import org.jetbrains.jet.lang.resolve.BindingContextUtils;
import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.util.slicedmap.BasicWritableSlice; import org.jetbrains.jet.util.slicedmap.BasicWritableSlice;
@@ -26,6 +30,8 @@ import org.jetbrains.jet.util.slicedmap.WritableSlice;
import javax.inject.Inject; import javax.inject.Inject;
import static org.jetbrains.jet.lang.diagnostics.Errors.CANNOT_INFER_VISIBILITY;
public class TraceBasedErrorReporter implements ErrorReporter { public class TraceBasedErrorReporter implements ErrorReporter {
public static final WritableSlice<AbiVersionErrorLocation, Integer> ABI_VERSION_ERRORS = public static final WritableSlice<AbiVersionErrorLocation, Integer> ABI_VERSION_ERRORS =
new BasicWritableSlice<AbiVersionErrorLocation, Integer>(Slices.ONLY_REWRITE_TO_EQUAL, true); new BasicWritableSlice<AbiVersionErrorLocation, Integer>(Slices.ONLY_REWRITE_TO_EQUAL, true);
@@ -41,6 +47,14 @@ public class TraceBasedErrorReporter implements ErrorReporter {
trace.record(ABI_VERSION_ERRORS, new AbiVersionErrorLocation(fqName, file), actualVersion); trace.record(ABI_VERSION_ERRORS, new AbiVersionErrorLocation(fqName, file), actualVersion);
} }
@Override
public void reportCannotInferVisibility(@NotNull CallableMemberDescriptor descriptor) {
PsiElement element = BindingContextUtils.descriptorToDeclaration(trace.getBindingContext(), descriptor);
if (element instanceof JetDeclaration) {
trace.report(CANNOT_INFER_VISIBILITY.on((JetDeclaration) element));
}
}
public static final class AbiVersionErrorLocation { public static final class AbiVersionErrorLocation {
@NotNull @NotNull
private final FqName classFqName; private final FqName classFqName;
@@ -26,7 +26,6 @@ import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.*; import org.jetbrains.jet.lang.descriptors.impl.*;
import org.jetbrains.jet.lang.resolve.DescriptorFactory; import org.jetbrains.jet.lang.resolve.DescriptorFactory;
import org.jetbrains.jet.lang.resolve.OverridingUtil; import org.jetbrains.jet.lang.resolve.OverridingUtil;
import org.jetbrains.jet.lang.resolve.TraceUtil;
import org.jetbrains.jet.lang.resolve.lazy.storage.MemoizedFunctionToNullable; import org.jetbrains.jet.lang.resolve.lazy.storage.MemoizedFunctionToNullable;
import org.jetbrains.jet.lang.resolve.lazy.storage.NotNullLazyValue; import org.jetbrains.jet.lang.resolve.lazy.storage.NotNullLazyValue;
import org.jetbrains.jet.lang.resolve.lazy.storage.NullableLazyValue; import org.jetbrains.jet.lang.resolve.lazy.storage.NullableLazyValue;
@@ -430,7 +429,13 @@ public class DeserializedClassDescriptor extends ClassDescriptorBase implements
new OverridingUtil.DescriptorSink() { new OverridingUtil.DescriptorSink() {
@Override @Override
public void addToScope(@NotNull CallableMemberDescriptor fakeOverride) { public void addToScope(@NotNull CallableMemberDescriptor fakeOverride) {
OverridingUtil.resolveUnknownVisibilityForMember(null, fakeOverride, TraceUtil.TRACE_STUB); OverridingUtil.resolveUnknownVisibilityForMember(fakeOverride, new OverridingUtil.NotInferredVisibilitySink() {
@Override
public void cannotInferVisibility(@NotNull CallableMemberDescriptor descriptor) {
// Do nothing
// TODO: do something
}
});
//noinspection unchecked //noinspection unchecked
result.add((D) fakeOverride); result.add((D) fakeOverride);
} }
@@ -168,16 +168,21 @@ public class OverrideResolver {
public static void resolveUnknownVisibilities( public static void resolveUnknownVisibilities(
@NotNull Collection<? extends CallableMemberDescriptor> descriptors, @NotNull Collection<? extends CallableMemberDescriptor> descriptors,
@NotNull BindingTrace trace) { @NotNull BindingTrace trace) {
for (CallableMemberDescriptor memberDescriptor : descriptors) { for (CallableMemberDescriptor descriptor : descriptors) {
JetDeclaration declaration = null; resolveUnknownVisibilityForMember(descriptor, trace);
if (memberDescriptor.getKind() == CallableMemberDescriptor.Kind.DECLARATION) { }
PsiElement element = BindingContextUtils.descriptorToDeclaration(trace.getBindingContext(), memberDescriptor); }
public static void resolveUnknownVisibilityForMember(@NotNull CallableMemberDescriptor descriptor, @NotNull final BindingTrace trace) {
OverridingUtil.resolveUnknownVisibilityForMember(descriptor, new OverridingUtil.NotInferredVisibilitySink() {
@Override
public void cannotInferVisibility(@NotNull CallableMemberDescriptor descriptor) {
PsiElement element = BindingContextUtils.descriptorToDeclaration(trace.getBindingContext(), descriptor);
if (element instanceof JetDeclaration) { if (element instanceof JetDeclaration) {
declaration = (JetDeclaration) element; trace.report(CANNOT_INFER_VISIBILITY.on((JetDeclaration) element));
} }
} }
OverridingUtil.resolveUnknownVisibilityForMember(declaration, memberDescriptor, trace); });
}
} }
private static <T extends DeclarationDescriptor> MultiMap<Name, T> groupDescriptorsByName(Collection<T> properties) { private static <T extends DeclarationDescriptor> MultiMap<Name, T> groupDescriptorsByName(Collection<T> properties) {
@@ -18,7 +18,6 @@ package org.jetbrains.jet.lang.resolve;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.collect.*; import com.google.common.collect.*;
import com.intellij.psi.PsiElement;
import com.intellij.util.Function; import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -27,14 +26,12 @@ import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.impl.FunctionDescriptorImpl; import org.jetbrains.jet.lang.descriptors.impl.FunctionDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.impl.PropertyAccessorDescriptorImpl; import org.jetbrains.jet.lang.descriptors.impl.PropertyAccessorDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.impl.PropertyDescriptorImpl; import org.jetbrains.jet.lang.descriptors.impl.PropertyDescriptorImpl;
import org.jetbrains.jet.lang.psi.JetDeclaration;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lang.types.*;
import org.jetbrains.jet.lang.types.checker.JetTypeChecker; import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
import java.util.*; import java.util.*;
import static org.jetbrains.jet.lang.diagnostics.Errors.CANNOT_INFER_VISIBILITY;
import static org.jetbrains.jet.lang.resolve.OverridingUtil.OverrideCompatibilityInfo.Result.CONFLICT; import static org.jetbrains.jet.lang.resolve.OverridingUtil.OverrideCompatibilityInfo.Result.CONFLICT;
import static org.jetbrains.jet.lang.resolve.OverridingUtil.OverrideCompatibilityInfo.Result.OVERRIDABLE; import static org.jetbrains.jet.lang.resolve.OverridingUtil.OverrideCompatibilityInfo.Result.OVERRIDABLE;
@@ -489,28 +486,34 @@ public class OverridingUtil {
return overridable; return overridable;
} }
public static void resolveUnknownVisibilityForMember(@Nullable JetDeclaration member, @NotNull CallableMemberDescriptor memberDescriptor, @NotNull BindingTrace trace) { public static void resolveUnknownVisibilityForMember(
resolveUnknownVisibilityForOverriddenDescriptors(memberDescriptor.getOverriddenDescriptors(), trace); @NotNull CallableMemberDescriptor memberDescriptor,
@NotNull NotInferredVisibilitySink sink
) {
for (CallableMemberDescriptor descriptor : memberDescriptor.getOverriddenDescriptors()) {
if (descriptor.getVisibility() == Visibilities.INHERITED) {
resolveUnknownVisibilityForMember(descriptor, sink);
}
}
if (memberDescriptor.getVisibility() != Visibilities.INHERITED) { if (memberDescriptor.getVisibility() != Visibilities.INHERITED) {
return; return;
} }
Visibility visibility = findMaxVisibility(memberDescriptor.getOverriddenDescriptors()); Visibility visibility = findMaxVisibility(memberDescriptor.getOverriddenDescriptors());
if (visibility == null) { if (visibility == null) {
if (member != null) { sink.cannotInferVisibility(memberDescriptor);
trace.report(CANNOT_INFER_VISIBILITY.on(member));
}
visibility = Visibilities.PUBLIC; visibility = Visibilities.PUBLIC;
} }
if (memberDescriptor instanceof PropertyDescriptorImpl) { if (memberDescriptor instanceof PropertyDescriptorImpl) {
((PropertyDescriptorImpl)memberDescriptor).setVisibility(visibility.normalize()); ((PropertyDescriptorImpl) memberDescriptor).setVisibility(visibility.normalize());
for (PropertyAccessorDescriptor accessor : ((PropertyDescriptor) memberDescriptor).getAccessors()) { for (PropertyAccessorDescriptor accessor : ((PropertyDescriptor) memberDescriptor).getAccessors()) {
resolveUnknownVisibilityForMember(null, accessor, trace); resolveUnknownVisibilityForMember(accessor, sink);
} }
} }
else if (memberDescriptor instanceof FunctionDescriptorImpl) { else if (memberDescriptor instanceof FunctionDescriptorImpl) {
((FunctionDescriptorImpl)memberDescriptor).setVisibility(visibility.normalize()); ((FunctionDescriptorImpl) memberDescriptor).setVisibility(visibility.normalize());
} }
else { else {
assert memberDescriptor instanceof PropertyAccessorDescriptorImpl; assert memberDescriptor instanceof PropertyAccessorDescriptorImpl;
@@ -518,16 +521,6 @@ public class OverridingUtil {
} }
} }
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, trace);
}
}
}
@Nullable @Nullable
private static Visibility findMaxVisibility(@NotNull Collection<? extends CallableMemberDescriptor> descriptors) { private static Visibility findMaxVisibility(@NotNull Collection<? extends CallableMemberDescriptor> descriptors) {
if (descriptors.isEmpty()) { if (descriptors.isEmpty()) {
@@ -567,6 +560,10 @@ public class OverridingUtil {
void conflict(@NotNull CallableMemberDescriptor fromSuper, @NotNull CallableMemberDescriptor fromCurrent); void conflict(@NotNull CallableMemberDescriptor fromSuper, @NotNull CallableMemberDescriptor fromCurrent);
} }
public interface NotInferredVisibilitySink {
void cannotInferVisibility(@NotNull CallableMemberDescriptor descriptor);
}
public static class OverrideCompatibilityInfo { public static class OverrideCompatibilityInfo {
public enum Result { public enum Result {
@@ -19,7 +19,6 @@ package org.jetbrains.jet.lang.resolve.lazy.descriptors;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Computable;
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.*;
@@ -140,10 +139,9 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
// TODO: this should be handled by lazy function descriptors // TODO: this should be handled by lazy function descriptors
Set<FunctionDescriptor> functions = super.getFunctions(name); Set<FunctionDescriptor> functions = super.getFunctions(name);
for (FunctionDescriptor functionDescriptor : functions) { for (FunctionDescriptor functionDescriptor : functions) {
if (functionDescriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) continue; if (functionDescriptor.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
PsiElement element = OverrideResolver.resolveUnknownVisibilityForMember(functionDescriptor, resolveSession.getTrace());
BindingContextUtils.callableDescriptorToDeclaration(resolveSession.getTrace().getBindingContext(), functionDescriptor); }
OverridingUtil.resolveUnknownVisibilityForMember((JetDeclaration) element, functionDescriptor, resolveSession.getTrace());
} }
return functions; return functions;
} }
@@ -214,10 +212,9 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
Set<VariableDescriptor> properties = super.getProperties(name); Set<VariableDescriptor> properties = super.getProperties(name);
for (VariableDescriptor variableDescriptor : properties) { for (VariableDescriptor variableDescriptor : properties) {
PropertyDescriptor propertyDescriptor = (PropertyDescriptor) variableDescriptor; PropertyDescriptor propertyDescriptor = (PropertyDescriptor) variableDescriptor;
if (propertyDescriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) continue; if (propertyDescriptor.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
PsiElement element = OverrideResolver.resolveUnknownVisibilityForMember(propertyDescriptor, resolveSession.getTrace());
BindingContextUtils.callableDescriptorToDeclaration(resolveSession.getTrace().getBindingContext(), propertyDescriptor); }
OverridingUtil.resolveUnknownVisibilityForMember((JetDeclaration) element, propertyDescriptor, resolveSession.getTrace());
} }
return properties; return properties;
} }
@@ -66,7 +66,7 @@ public final class DescriptorResolverUtils {
@NotNull Collection<D> membersFromSupertypes, @NotNull Collection<D> membersFromSupertypes,
@NotNull Collection<D> membersFromCurrent, @NotNull Collection<D> membersFromCurrent,
@NotNull ClassDescriptor classDescriptor, @NotNull ClassDescriptor classDescriptor,
@NotNull final FakeOverrideVisibilityResolver visibilityResolver @NotNull final ErrorReporter errorReporter
) { ) {
final Set<D> result = new HashSet<D>(); final Set<D> result = new HashSet<D>();
@@ -76,7 +76,12 @@ public final class DescriptorResolverUtils {
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void addToScope(@NotNull CallableMemberDescriptor fakeOverride) { public void addToScope(@NotNull CallableMemberDescriptor fakeOverride) {
visibilityResolver.resolveUnknownVisibilityForMember(fakeOverride); OverridingUtil.resolveUnknownVisibilityForMember(fakeOverride, new OverridingUtil.NotInferredVisibilitySink() {
@Override
public void cannotInferVisibility(@NotNull CallableMemberDescriptor descriptor) {
errorReporter.reportCannotInferVisibility(descriptor);
}
});
result.add((D) fakeOverride); result.add((D) fakeOverride);
} }
@@ -18,8 +18,11 @@ package org.jetbrains.jet.lang.resolve.java.resolver;
import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
public interface ErrorReporter { public interface ErrorReporter {
void reportIncompatibleAbiVersion(@NotNull FqName fqName, @NotNull VirtualFile file, int actualVersion); void reportIncompatibleAbiVersion(@NotNull FqName fqName, @NotNull VirtualFile file, int actualVersion);
void reportCannotInferVisibility(@NotNull CallableMemberDescriptor descriptor);
} }
@@ -1,24 +0,0 @@
/*
* Copyright 2010-2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.lang.resolve.java.resolver;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor;
public interface FakeOverrideVisibilityResolver {
void resolveUnknownVisibilityForMember(@NotNull CallableMemberDescriptor descriptor);
}
@@ -47,7 +47,7 @@ public final class JavaFunctionResolver {
private JavaValueParameterResolver valueParameterResolver; private JavaValueParameterResolver valueParameterResolver;
private JavaAnnotationResolver annotationResolver; private JavaAnnotationResolver annotationResolver;
private ExternalSignatureResolver externalSignatureResolver; private ExternalSignatureResolver externalSignatureResolver;
private FakeOverrideVisibilityResolver fakeOverrideVisibilityResolver; private ErrorReporter errorReporter;
private MethodSignatureChecker signatureChecker; private MethodSignatureChecker signatureChecker;
@Inject @Inject
@@ -81,8 +81,8 @@ public final class JavaFunctionResolver {
} }
@Inject @Inject
public void setFakeOverrideVisibilityResolver(FakeOverrideVisibilityResolver fakeOverrideVisibilityResolver) { public void setErrorReporter(ErrorReporter errorReporter) {
this.fakeOverrideVisibilityResolver = fakeOverrideVisibilityResolver; this.errorReporter = errorReporter;
} }
@Inject @Inject
@@ -211,8 +211,7 @@ public final class JavaFunctionResolver {
Collection<SimpleFunctionDescriptor> functionsFromSupertypes = getFunctionsFromSupertypes(methodName, classDescriptor); Collection<SimpleFunctionDescriptor> functionsFromSupertypes = getFunctionsFromSupertypes(methodName, classDescriptor);
functions.addAll(resolveOverrides(methodName, functionsFromSupertypes, functionsFromCurrent, classDescriptor, functions.addAll(resolveOverrides(methodName, functionsFromSupertypes, functionsFromCurrent, classDescriptor, errorReporter));
fakeOverrideVisibilityResolver));
} }
if (isEnumClassObject(owner)) { if (isEnumClassObject(owner)) {
@@ -41,10 +41,7 @@ public final class JavaPropertyResolver {
private JavaResolverCache cache; private JavaResolverCache cache;
private JavaAnnotationResolver annotationResolver; private JavaAnnotationResolver annotationResolver;
private ExternalSignatureResolver externalSignatureResolver; private ExternalSignatureResolver externalSignatureResolver;
private FakeOverrideVisibilityResolver fakeOverrideVisibilityResolver; private ErrorReporter errorReporter;
public JavaPropertyResolver() {
}
@Inject @Inject
public void setTypeTransformer(@NotNull JavaTypeTransformer javaTypeTransformer) { public void setTypeTransformer(@NotNull JavaTypeTransformer javaTypeTransformer) {
@@ -67,8 +64,8 @@ public final class JavaPropertyResolver {
} }
@Inject @Inject
public void setFakeOverrideVisibilityResolver(FakeOverrideVisibilityResolver fakeOverrideVisibilityResolver) { public void setErrorReporter(ErrorReporter errorReporter) {
this.fakeOverrideVisibilityResolver = fakeOverrideVisibilityResolver; this.errorReporter = errorReporter;
} }
@NotNull @NotNull
@@ -93,7 +90,7 @@ public final class JavaPropertyResolver {
Collection<PropertyDescriptor> propertiesFromSupertypes = getPropertiesFromSupertypes(propertyName, classDescriptor); Collection<PropertyDescriptor> propertiesFromSupertypes = getPropertiesFromSupertypes(propertyName, classDescriptor);
properties.addAll(resolveOverrides(propertyName, propertiesFromSupertypes, propertiesFromCurrent, classDescriptor, properties.addAll(resolveOverrides(propertyName, propertiesFromSupertypes, propertiesFromCurrent, classDescriptor,
fakeOverrideVisibilityResolver)); errorReporter));
} }
properties.addAll(propertiesFromCurrent); properties.addAll(propertiesFromCurrent);
@@ -114,7 +114,6 @@ public class GenerateInjectors {
generator.addField(JavaClassFinderImpl.class); generator.addField(JavaClassFinderImpl.class);
generator.addField(TraceBasedExternalSignatureResolver.class); generator.addField(TraceBasedExternalSignatureResolver.class);
generator.addField(TraceBasedJavaResolverCache.class); generator.addField(TraceBasedJavaResolverCache.class);
generator.addField(FakeOverrideVisibilityResolverImpl.class);
generator.addField(TraceBasedErrorReporter.class); generator.addField(TraceBasedErrorReporter.class);
generator.addField(PsiBasedMethodSignatureChecker.class); generator.addField(PsiBasedMethodSignatureChecker.class);
generator.addField(PsiBasedExternalAnnotationResolver.class); generator.addField(PsiBasedExternalAnnotationResolver.class);
@@ -137,7 +136,6 @@ public class GenerateInjectors {
generator.addField(JavaClassFinderImpl.class); generator.addField(JavaClassFinderImpl.class);
generator.addField(TraceBasedExternalSignatureResolver.class); generator.addField(TraceBasedExternalSignatureResolver.class);
generator.addField(TraceBasedJavaResolverCache.class); generator.addField(TraceBasedJavaResolverCache.class);
generator.addField(FakeOverrideVisibilityResolverImpl.class);
generator.addField(TraceBasedErrorReporter.class); generator.addField(TraceBasedErrorReporter.class);
generator.addField(PsiBasedMethodSignatureChecker.class); generator.addField(PsiBasedMethodSignatureChecker.class);
generator.addField(PsiBasedExternalAnnotationResolver.class); generator.addField(PsiBasedExternalAnnotationResolver.class);