From 903f262a7958a4806a27139960b6c9a7de423b3f Mon Sep 17 00:00:00 2001 From: Natalia Ukhorskaya Date: Wed, 21 May 2014 13:58:46 +0400 Subject: [PATCH] Rewrite suppressing visibility errors for debugger --- .../resolve/DiagnosticsWithSuppression.java | 18 ++++++++++++++++++ .../resolve/QualifiedExpressionResolver.java | 3 +-- .../resolve/calls/CallExpressionResolver.java | 2 -- .../calls/tasks/AbstractTracingStrategy.java | 4 +--- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DiagnosticsWithSuppression.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DiagnosticsWithSuppression.java index 71e03d32439..8cfaf7ca55f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DiagnosticsWithSuppression.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DiagnosticsWithSuppression.java @@ -20,16 +20,21 @@ import com.google.common.collect.ImmutableSet; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Condition; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; import com.intellij.util.containers.ConcurrentWeakValueHashMap; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.FilteringIterator; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.diagnostics.Diagnostic; +import org.jetbrains.jet.lang.diagnostics.DiagnosticFactory; +import org.jetbrains.jet.lang.diagnostics.Errors; import org.jetbrains.jet.lang.diagnostics.Severity; import org.jetbrains.jet.lang.psi.JetAnnotated; import org.jetbrains.jet.lang.psi.JetAnnotationEntry; import org.jetbrains.jet.lang.psi.JetStubbedPsiUtil; +import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.jet.lang.psi.codeFragmentUtil.CodeFragmentUtilPackage; import org.jetbrains.jet.lang.resolve.constants.ArrayValue; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; import org.jetbrains.jet.lang.resolve.constants.StringValue; @@ -95,12 +100,25 @@ public class DiagnosticsWithSuppression implements Diagnostics { private boolean isSuppressed(@NotNull Diagnostic diagnostic) { PsiElement element = diagnostic.getPsiElement(); + if (isSuppressedForDebugger(diagnostic, element)) return true; + JetAnnotated annotated = JetStubbedPsiUtil.getPsiOrStubParent(element, JetAnnotated.class, false); if (annotated == null) return false; return isSuppressedByAnnotated(diagnostic, annotated, 0); } + private static boolean isSuppressedForDebugger(@NotNull Diagnostic diagnostic, @NotNull PsiElement element) { + PsiFile containingFile = element.getContainingFile(); + if (containingFile instanceof JetFile && CodeFragmentUtilPackage.skipVisibilityCheck((JetFile) containingFile)) { + DiagnosticFactory diagnosticFactory = diagnostic.getFactory(); + return diagnosticFactory == Errors.INVISIBLE_MEMBER || + diagnosticFactory == Errors.INVISIBLE_REFERENCE || + diagnosticFactory == Errors.INVISIBLE_SETTER; + } + return false; + } + /* The cache is optimized for the case where no warnings are suppressed (most frequent one) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/QualifiedExpressionResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/QualifiedExpressionResolver.java index bbfdbeeeda2..2f2ffe87162 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/QualifiedExpressionResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/QualifiedExpressionResolver.java @@ -421,8 +421,7 @@ public class QualifiedExpressionResolver { private void checkVisibility(@NotNull DeclarationDescriptorWithVisibility descriptor, @NotNull BindingTrace trace, @NotNull JetSimpleNameExpression referenceExpression, @NotNull JetScope scopeToCheckVisibility) { - if (!CodeFragmentUtilPackage.skipVisibilityCheck(referenceExpression.getContainingJetFile()) && - !Visibilities.isVisible(descriptor, scopeToCheckVisibility.getContainingDeclaration())) { + if (!Visibilities.isVisible(descriptor, scopeToCheckVisibility.getContainingDeclaration())) { trace.report(INVISIBLE_REFERENCE.on(referenceExpression, descriptor, descriptor.getVisibility(), descriptor.getContainingDeclaration())); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallExpressionResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallExpressionResolver.java index a2a0de17c95..ea39cf69257 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallExpressionResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallExpressionResolver.java @@ -140,8 +140,6 @@ public class CallExpressionResolver { ) { if (!(classifier instanceof ClassDescriptor)) return; - if (CodeFragmentUtilPackage.skipVisibilityCheck(expression.getContainingJetFile())) return; - ClassDescriptor classObject = ((ClassDescriptor) classifier).getClassObjectDescriptor(); assert classObject != null : "This check should be done only for classes with class objects: " + classifier; DeclarationDescriptor from = context.containingDeclaration; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/AbstractTracingStrategy.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/AbstractTracingStrategy.java index db7d3f9e15c..a9580f31f0f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/AbstractTracingStrategy.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/AbstractTracingStrategy.java @@ -175,9 +175,7 @@ public abstract class AbstractTracingStrategy implements TracingStrategy { @Override public void invisibleMember(@NotNull BindingTrace trace, @NotNull DeclarationDescriptorWithVisibility descriptor) { - if (!CodeFragmentUtilPackage.skipVisibilityCheck(call.getCallElement().getContainingJetFile())) { - trace.report(INVISIBLE_MEMBER.on(call.getCallElement(), descriptor, descriptor.getVisibility(), descriptor.getContainingDeclaration())); - } + trace.report(INVISIBLE_MEMBER.on(call.getCallElement(), descriptor, descriptor.getVisibility(), descriptor.getContainingDeclaration())); } @Override