Fix class object visibility check

ExpressionTypingContext now has a scope for visibility checking, which isn't
replaced on replaceScope()
This commit is contained in:
Alexander Udalov
2013-11-22 17:03:34 +04:00
parent d82e8b9a35
commit c2598faa4e
5 changed files with 24 additions and 7 deletions
@@ -139,7 +139,7 @@ public class CallExpressionResolver {
if (!(classifier instanceof ClassDescriptor)) return; if (!(classifier instanceof ClassDescriptor)) return;
ClassDescriptor classObject = ((ClassDescriptor) classifier).getClassObjectDescriptor(); ClassDescriptor classObject = ((ClassDescriptor) classifier).getClassObjectDescriptor();
assert classObject != null : "This check should be done only for classes with class objects: " + classifier; assert classObject != null : "This check should be done only for classes with class objects: " + classifier;
DeclarationDescriptor from = context.scope.getContainingDeclaration(); DeclarationDescriptor from = context.scopeForVisibility.getContainingDeclaration();
if (!Visibilities.isVisible(classObject, from)) { if (!Visibilities.isVisible(classObject, from)) {
context.trace.report(INVISIBLE_MEMBER.on(expression, classObject, classObject.getVisibility(), from)); context.trace.report(INVISIBLE_MEMBER.on(expression, classObject, classObject.getVisibility(), from));
} }
@@ -69,12 +69,12 @@ public class ExpressionTypingContext extends ResolutionContext<ExpressionTypingC
@NotNull CallResolverExtension callResolverExtension, @NotNull CallResolverExtension callResolverExtension,
boolean isAnnotationContext boolean isAnnotationContext
) { ) {
return new ExpressionTypingContext(expressionTypingServices, labelResolver, trace, scope, dataFlowInfo, expectedType, return new ExpressionTypingContext(expressionTypingServices, labelResolver, trace, scope, scope, dataFlowInfo, expectedType,
contextDependency, resolutionResultsCache, callResolverExtension, isAnnotationContext); contextDependency, resolutionResultsCache, callResolverExtension, isAnnotationContext);
} }
public final ExpressionTypingServices expressionTypingServices; public final ExpressionTypingServices expressionTypingServices;
public final JetScope scopeForVisibility;
private CompileTimeConstantResolver compileTimeConstantResolver; private CompileTimeConstantResolver compileTimeConstantResolver;
private ExpressionTypingContext( private ExpressionTypingContext(
@@ -82,6 +82,7 @@ public class ExpressionTypingContext extends ResolutionContext<ExpressionTypingC
@NotNull LabelResolver labelResolver, @NotNull LabelResolver labelResolver,
@NotNull BindingTrace trace, @NotNull BindingTrace trace,
@NotNull JetScope scope, @NotNull JetScope scope,
@NotNull JetScope scopeForVisibility,
@NotNull DataFlowInfo dataFlowInfo, @NotNull DataFlowInfo dataFlowInfo,
@NotNull JetType expectedType, @NotNull JetType expectedType,
@NotNull ContextDependency contextDependency, @NotNull ContextDependency contextDependency,
@@ -92,6 +93,7 @@ public class ExpressionTypingContext extends ResolutionContext<ExpressionTypingC
super(trace, scope, expectedType, dataFlowInfo, contextDependency, resolutionResultsCache, labelResolver, callResolverExtension, super(trace, scope, expectedType, dataFlowInfo, contextDependency, resolutionResultsCache, labelResolver, callResolverExtension,
isAnnotationContext); isAnnotationContext);
this.expressionTypingServices = expressionTypingServices; this.expressionTypingServices = expressionTypingServices;
this.scopeForVisibility = scopeForVisibility;
} }
@Override @Override
@@ -104,8 +106,9 @@ public class ExpressionTypingContext extends ResolutionContext<ExpressionTypingC
@NotNull ResolutionResultsCache resolutionResultsCache, @NotNull ResolutionResultsCache resolutionResultsCache,
@NotNull LabelResolver labelResolver @NotNull LabelResolver labelResolver
) { ) {
return new ExpressionTypingContext(expressionTypingServices, this.labelResolver, trace, scope, dataFlowInfo, expectedType, return new ExpressionTypingContext(expressionTypingServices, this.labelResolver, trace, scope, scopeForVisibility, dataFlowInfo,
contextDependency, resolutionResultsCache, callResolverExtension, isAnnotationContext); expectedType, contextDependency, resolutionResultsCache, callResolverExtension,
isAnnotationContext);
} }
@Override @Override
@@ -10,6 +10,6 @@ class A {
} }
} }
fun f1() = <!INVISIBLE_MEMBER!>A<!>.B.C fun f1() = <!INVISIBLE_MEMBER!>A<!>.B.<!INVISIBLE_MEMBER!>C<!>
fun f2() = <!INVISIBLE_MEMBER!>A<!>.B.C.<!INVISIBLE_MEMBER!>foo<!>() fun f2() = <!INVISIBLE_MEMBER!>A<!>.B.<!INVISIBLE_MEMBER!>C<!>.<!INVISIBLE_MEMBER!>foo<!>()
@@ -0,0 +1,9 @@
// FILE: 1.kt
package a
private enum class E { ENTRY }
// FILE: 2.kt
package b
val e = a.<!INVISIBLE_MEMBER!>E<!>
@@ -2532,6 +2532,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/diagnostics/tests/enum"), Pattern.compile("^(.+)\\.kt$"), true); JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/diagnostics/tests/enum"), Pattern.compile("^(.+)\\.kt$"), true);
} }
@TestMetadata("classObjectOfPrivateEnum.kt")
public void testClassObjectOfPrivateEnum() throws Exception {
doTest("compiler/testData/diagnostics/tests/enum/classObjectOfPrivateEnum.kt");
}
@TestMetadata("dontCreateNamespaceTypeForEnumEntry.kt") @TestMetadata("dontCreateNamespaceTypeForEnumEntry.kt")
public void testDontCreateNamespaceTypeForEnumEntry() throws Exception { public void testDontCreateNamespaceTypeForEnumEntry() throws Exception {
doTest("compiler/testData/diagnostics/tests/enum/dontCreateNamespaceTypeForEnumEntry.kt"); doTest("compiler/testData/diagnostics/tests/enum/dontCreateNamespaceTypeForEnumEntry.kt");