Skip to content

Commit c720efc

Browse files
committed
GROOVY-6277 (pt.2)
1 parent beb4803 commit c720efc

4 files changed

Lines changed: 61 additions & 14 deletions

File tree

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

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2009-2021 the original author or authors.
2+
* Copyright 2009-2022 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -657,6 +657,30 @@ public void testTypeChecked6240() {
657657
runConformTest(sources, "A1B2C3");
658658
}
659659

660+
@Test
661+
public void testTypeChecked6277() {
662+
//@formatter:off
663+
String[] sources = {
664+
"p/Main.groovy",
665+
"package p\n" +
666+
"@groovy.transform.TypeChecked\n" +
667+
"def test(Pogo pogo) {\n" +
668+
" def x = pogo.x;\n" +
669+
" x.toLowerCase()\n" +
670+
"}\n" +
671+
"print test(new Pogo())\n",
672+
673+
"p/Pogo.groovy",
674+
"package p\n" +
675+
"class Pogo {\n" +
676+
" protected String getX() { 'Works' }" +
677+
"}\n",
678+
};
679+
//@formatter:on
680+
681+
runConformTest(sources, "works");
682+
}
683+
660684
@Test
661685
public void testTypeChecked6455() {
662686
//@formatter:off

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2060,11 +2060,10 @@ private static boolean hasAccessToMember(final ClassNode sender, final ClassNode
20602060
if (Modifier.isPublic(modifiers) || sender.equals(receiver) || sender.getOuterClasses().contains(receiver)) {
20612061
return true;
20622062
}
2063-
if (Modifier.isProtected(modifiers)) {
2064-
return sender.isDerivedFrom(receiver);
2065-
} else {
2066-
return !Modifier.isPrivate(modifiers) && Objects.equals(sender.getPackageName(), receiver.getPackageName());
2063+
if (!Modifier.isPrivate(modifiers) && Objects.equals(sender.getPackageName(), receiver.getPackageName())) {
2064+
return true;
20672065
}
2066+
return Modifier.isProtected(modifiers) && sender.isDerivedFrom(receiver);
20682067
}
20692068
// GRECLIPSE end
20702069

@@ -2221,7 +2220,7 @@ private boolean storeField(FieldNode field, boolean returnTrueIfFieldExists, Pro
22212220
if (field == null || !returnTrueIfFieldExists) return false;
22222221
if (visitor != null) visitor.visitField(field);
22232222
checkOrMarkPrivateAccess(expressionToStoreOn, field, lhsOfAssignment);
2224-
// GRECLIPSE add
2223+
// GRECLIPSE add -- GROOVY-8999
22252224
boolean accessible = hasAccessToMember(isSuperExpression(expressionToStoreOn.getObjectExpression()) ? typeCheckingContext.getEnclosingClassNode() : receiver, field.getDeclaringClass(), field.getModifiers());
22262225
if (expressionToStoreOn instanceof AttributeExpression) {
22272226
if (!accessible) {

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

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1962,18 +1962,30 @@ && hasAccessToMember(enclosingTypes.iterator().next(), getter.getDeclaringClass(
19621962
return foundGetterOrSetter;
19631963
}
19641964

1965+
/* GRECLIPSE edit
1966+
private static boolean hasAccessToField(final ClassNode accessor, final FieldNode field) {
1967+
if (field.isPublic() || accessor.equals(field.getDeclaringClass())) {
1968+
return true;
1969+
}
1970+
if (field.isProtected()) {
1971+
return accessor.isDerivedFrom(field.getDeclaringClass());
1972+
} else {
1973+
return !field.isPrivate() && Objects.equals(accessor.getPackageName(), field.getDeclaringClass().getPackageName());
1974+
}
1975+
}
1976+
*/
19651977
private static boolean hasAccessToMember(final ClassNode accessor, final ClassNode receiver, final int modifiers) {
19661978
if (Modifier.isPublic(modifiers)
19671979
|| accessor.equals(receiver)
19681980
|| accessor.getOuterClasses().contains(receiver)) {
19691981
return true;
19701982
}
1971-
if (Modifier.isProtected(modifiers)) {
1972-
return accessor.isDerivedFrom(receiver);
1973-
} else {
1974-
return !Modifier.isPrivate(modifiers) && Objects.equals(accessor.getPackageName(), receiver.getPackageName());
1983+
if (!Modifier.isPrivate(modifiers) && Objects.equals(accessor.getPackageName(), receiver.getPackageName())) {
1984+
return true;
19751985
}
1986+
return Modifier.isProtected(modifiers) && accessor.isDerivedFrom(receiver);
19761987
}
1988+
// GRECLIPSE end
19771989

19781990
private MethodNode findGetter(final ClassNode current, String name, final boolean searchOuterClasses) {
19791991
MethodNode getterMethod = current.getGetterMethod(name);

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

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1713,18 +1713,30 @@ protected boolean existsProperty(final PropertyExpression pexp, final boolean re
17131713
return foundGetterOrSetter;
17141714
}
17151715

1716+
/* GRECLIPSE edit
1717+
private static boolean hasAccessToField(final ClassNode accessor, final FieldNode field) {
1718+
if (field.isPublic() || accessor.equals(field.getDeclaringClass())) {
1719+
return true;
1720+
}
1721+
if (field.isProtected()) {
1722+
return accessor.isDerivedFrom(field.getDeclaringClass());
1723+
} else {
1724+
return !field.isPrivate() && Objects.equals(accessor.getPackageName(), field.getDeclaringClass().getPackageName());
1725+
}
1726+
}
1727+
*/
17161728
private static boolean hasAccessToMember(final ClassNode accessor, final ClassNode receiver, final int modifiers) {
17171729
if (Modifier.isPublic(modifiers)
17181730
|| accessor.equals(receiver)
17191731
|| accessor.getOuterClasses().contains(receiver)) {
17201732
return true;
17211733
}
1722-
if (Modifier.isProtected(modifiers)) {
1723-
return accessor.isDerivedFrom(receiver);
1724-
} else {
1725-
return !Modifier.isPrivate(modifiers) && Objects.equals(accessor.getPackageName(), receiver.getPackageName());
1734+
if (!Modifier.isPrivate(modifiers) && Objects.equals(accessor.getPackageName(), receiver.getPackageName())) {
1735+
return true;
17261736
}
1737+
return Modifier.isProtected(modifiers) && accessor.isDerivedFrom(receiver);
17271738
}
1739+
// GRECLIPSE end
17281740

17291741
private MethodNode findGetter(final ClassNode current, String name, final boolean searchOuterClasses) {
17301742
MethodNode getterMethod = current.getGetterMethod(name);

0 commit comments

Comments
 (0)