Skip to content

Commit 9c8fc21

Browse files
committed
GROOVY-11358
1 parent edb36c0 commit 9c8fc21

File tree

4 files changed

+35
-4
lines changed

4 files changed

+35
-4
lines changed

base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/xform/TypeCheckedTests.java

+31
Original file line numberDiff line numberDiff line change
@@ -7703,4 +7703,35 @@ public void testTypeChecked11335() {
77037703

77047704
runConformTest(sources, "works");
77057705
}
7706+
7707+
@Test
7708+
public void testTypeChecked11358() {
7709+
//@formatter:off
7710+
String[] sources = {
7711+
"Main.groovy",
7712+
"abstract class A {\n" +
7713+
" private int f\n" +
7714+
"}\n" +
7715+
"@groovy.transform.TypeChecked\n" +
7716+
"void test(A a) {\n" +
7717+
" int i = a.@f\n" +
7718+
" int j = a.f\n" +
7719+
"}\n" +
7720+
"test(new A() {})\n",
7721+
};
7722+
//@formatter:on
7723+
7724+
runNegativeTest(sources,
7725+
"----------\n" +
7726+
"1. ERROR in Main.groovy (at line 6)\n" +
7727+
"\tint i = a.@f\n" +
7728+
"\t ^\n" +
7729+
"Groovy:[Static type checking] - Cannot access field: f of class: A\n" +
7730+
"----------\n" +
7731+
"2. ERROR in Main.groovy (at line 7)\n" +
7732+
"\tint j = a.f\n" +
7733+
"\t ^^^\n" +
7734+
"Groovy:[Static type checking] - No such property: f for class: A\n" +
7735+
"----------\n");
7736+
}
77067737
}

base/org.codehaus.groovy30/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1920,7 +1920,7 @@ private boolean isStaticInContext(final MethodNode method) {
19201920
private boolean storeField(final FieldNode field, final PropertyExpression expressionToStoreOn, final ClassNode receiver, final ClassCodeVisitorSupport visitor, final String delegationData, final boolean lhsOfAssignment) {
19211921
if (visitor != null) visitor.visitField(field);
19221922
checkOrMarkPrivateAccess(expressionToStoreOn, field, lhsOfAssignment);
1923-
/* GRECLIPSE edit -- GROOVY-11319
1923+
/* GRECLIPSE edit -- GROOVY-11319, GROOVY-11358
19241924
boolean accessible = hasAccessToMember(isSuperExpression(expressionToStoreOn.getObjectExpression()) ? typeCheckingContext.getEnclosingClassNode() : receiver, field.getDeclaringClass(), field.getModifiers());
19251925
19261926
if (expressionToStoreOn instanceof AttributeExpression) { // TODO: expand to include PropertyExpression
@@ -1930,7 +1930,7 @@ private boolean storeField(final FieldNode field, final PropertyExpression expre
19301930
}
19311931
*/
19321932
boolean superField = isSuperExpression(expressionToStoreOn.getObjectExpression());
1933-
boolean accessible = ( !superField && receiver.equals(field.getDeclaringClass()) ) // GROOVY-7300
1933+
boolean accessible = (!superField && receiver.equals(field.getDeclaringClass()) && !field.getDeclaringClass().isAbstract())
19341934
|| hasAccessToMember(typeCheckingContext.getEnclosingClassNode(), field.getDeclaringClass(), field.getModifiers());
19351935
if (!accessible) {
19361936
if (expressionToStoreOn instanceof AttributeExpression) {

base/org.codehaus.groovy40/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1839,7 +1839,7 @@ private boolean storeField(final FieldNode field, final PropertyExpression expre
18391839
if (visitor != null) visitor.visitField(field);
18401840
checkOrMarkPrivateAccess(expressionToStoreOn, field, lhsOfAssignment);
18411841
boolean superField = isSuperExpression(expressionToStoreOn.getObjectExpression());
1842-
boolean accessible = ( !superField && receiver.equals(field.getDeclaringClass()) ) // GROOVY-7300
1842+
boolean accessible = (!superField && receiver.equals(field.getDeclaringClass()) && !field.getDeclaringClass().isAbstract()) // GROOVY-7300, GROOVY-11358
18431843
|| hasAccessToMember(typeCheckingContext.getEnclosingClassNode(), field.getDeclaringClass(), field.getModifiers());
18441844

18451845
if (!accessible) {

base/org.codehaus.groovy50/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1923,7 +1923,7 @@ private boolean storeField(final FieldNode field, final PropertyExpression expre
19231923
if (visitor != null) visitor.visitField(field);
19241924
checkOrMarkPrivateAccess(expressionToStoreOn, field, lhsOfAssignment);
19251925
boolean superField = isSuperExpression(expressionToStoreOn.getObjectExpression());
1926-
boolean accessible = ( !superField && receiver.equals(field.getDeclaringClass()) ) // GROOVY-7300
1926+
boolean accessible = (!superField && receiver.equals(field.getDeclaringClass()) && !field.getDeclaringClass().isAbstract()) // GROOVY-7300, GROOVY-11358
19271927
|| hasAccessToMember(typeCheckingContext.getEnclosingClassNode(), field.getDeclaringClass(), field.getModifiers());
19281928

19291929
if (!accessible) {

0 commit comments

Comments
 (0)