Don't create NamespaceType for enum entries
Enum entry expressions have the type of their enum, so it shouldn't be possible to access static nested classes of enum entries from outside. This fixes BlackBoxCodegenTestGenerated$CallableReference.testEnumNameMethod
This commit is contained in:
+22
-16
@@ -151,23 +151,29 @@ public class CallExpressionResolver {
|
||||
@NotNull ClassifierDescriptor classifier,
|
||||
@NotNull ResolutionContext context
|
||||
) {
|
||||
if (isLHSOfDot(expression) && classifier instanceof ClassDescriptor) {
|
||||
List<JetScope> scopes = new ArrayList<JetScope>(3);
|
||||
|
||||
scopes.add(classObjectType.getMemberScope());
|
||||
scopes.add(getStaticNestedClassesScope((ClassDescriptor) classifier));
|
||||
|
||||
Name referencedName = expression.getReferencedNameAsName();
|
||||
NamespaceDescriptor namespace = context.scope.getNamespace(referencedName);
|
||||
if (namespace != null) {
|
||||
//for enums loaded from java binaries
|
||||
scopes.add(namespace.getMemberScope());
|
||||
}
|
||||
|
||||
JetScope scope = new ChainedScope(classifier, scopes.toArray(new JetScope[scopes.size()]));
|
||||
return new NamespaceType(referencedName, scope, new ExpressionReceiver(expression, classObjectType));
|
||||
if (!isLHSOfDot(expression) || !(classifier instanceof ClassDescriptor)) {
|
||||
return classObjectType;
|
||||
}
|
||||
return classObjectType;
|
||||
ClassDescriptor classDescriptor = (ClassDescriptor) classifier;
|
||||
|
||||
if (classDescriptor.getKind() == ClassKind.ENUM_ENTRY) {
|
||||
return classObjectType;
|
||||
}
|
||||
|
||||
List<JetScope> scopes = new ArrayList<JetScope>(3);
|
||||
|
||||
scopes.add(classObjectType.getMemberScope());
|
||||
scopes.add(getStaticNestedClassesScope(classDescriptor));
|
||||
|
||||
Name referencedName = expression.getReferencedNameAsName();
|
||||
NamespaceDescriptor namespace = context.scope.getNamespace(referencedName);
|
||||
if (namespace != null) {
|
||||
//for enums loaded from java binaries
|
||||
scopes.add(namespace.getMemberScope());
|
||||
}
|
||||
|
||||
JetScope scope = new ChainedScope(classifier, scopes.toArray(new JetScope[scopes.size()]));
|
||||
return new NamespaceType(referencedName, scope, new ExpressionReceiver(expression, classObjectType));
|
||||
}
|
||||
|
||||
private boolean furtherNameLookup(
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
enum class E {
|
||||
FIRST
|
||||
SECOND {
|
||||
class A
|
||||
}
|
||||
}
|
||||
|
||||
val foo: Any.() -> Unit = {}
|
||||
|
||||
fun f1() = E.FIRST.foo()
|
||||
fun f2() = E.FIRST.(foo)()
|
||||
fun f3() = E.SECOND.foo()
|
||||
fun f4() = E.SECOND.(foo)()
|
||||
fun f5() = E.SECOND.<!UNRESOLVED_REFERENCE!>A<!>()
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@TestMetadata("dontCreateNamespaceTypeForEnumEntry.kt")
|
||||
public void testDontCreateNamespaceTypeForEnumEntry() throws Exception {
|
||||
doTest("compiler/testData/diagnostics/tests/enum/dontCreateNamespaceTypeForEnumEntry.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("entryShouldBeOfEnumType.kt")
|
||||
public void testEntryShouldBeOfEnumType() throws Exception {
|
||||
doTest("compiler/testData/diagnostics/tests/enum/entryShouldBeOfEnumType.kt");
|
||||
|
||||
Reference in New Issue
Block a user