Scott Murphy Heiberg created GROOVY-12509:
---------------------------------------------
Summary: STC: private members of another class of the same nest
are not accessible
Key: GROOVY-12509
URL: https://issues.apache.org/jira/browse/GROOVY-12509
Project: Groovy
Issue Type: Bug
Components: Static Type Checker
Affects Versions: 6.0.0
Reporter: Scott Murphy Heiberg
Under static type checking, a class nested in a top-level class cannot use the
private constructors, methods and accessors of another class nested in the same
top-level class:
{code:groovy}
@groovy.transform.CompileStatic
class C {
static class Box {
private Box(String s) {}
private static String sm() { 'sm' }
private String im() { 'im' }
private String getX() { 'x' }
}
static class A { private static class Hidden { public static int x = 1 } }
static class Other {
static test(Box box) {
new Box('a') // Cannot find matching constructor
C$Box(java.lang.String)
Box.sm() // Cannot find matching method java.lang.Class#sm()
or static method C$Box#sm()
box.im() // Cannot find matching method C$Box#im()
box.x // No such property: x for class: C$Box
A.Hidden.x // Cannot access field: x of class: C$A$Hidden from
class: C$Other
}
}
}
{code}
Java allows all of these (JLS 6.6.1: a private member is accessible anywhere
within the body of the top-level class that encloses its declaration), and the
JVM does through nestmates. Groovy already writes the {{NestHost}} and
{{NestMembers}} attributes for these classes, the class generator already calls
private members of nestmates directly, and the type checker already allows
private fields of nestmates (GROOVY-12290). Method references such as
{{Box::new}} and {{Box::sm}} are rejected the same way.
The modes also disagree. With a private {{Box(String)}} beside a public
{{Box(Object)}}, {{new Box('s')}} in {{Other}} calls the private constructor in
dynamic and {{@TypeChecked}} code, as javac does, but the public one under
{{@CompileStatic}}. The same happens for a private {{B.m(String)}} beside an
inherited {{A.m(Object)}}.
A private getter or setter used through property syntax ({{box.x}}) is also
rejected from the outer class into a nested class.
The last case, a public member reached through a private nested type
({{A.Hidden.x}}, or a constant of a private nested enum), worked in 5.0.8 and
fails since 6.0.0 (GROOVY-12310), from a sibling and from the outer class. The
other cases fail in 4.0, 5.0 and 6.0.
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)