Skip to content

Commit

Permalink
Fix for #1573: expose public field for map-based type
Browse files Browse the repository at this point in the history
GROOVY-5001, GROOVY-5491
  • Loading branch information
eric-milles committed May 4, 2024
1 parent 7859f60 commit 7544704
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -889,6 +889,16 @@ public void testNotMapProperty() {
assertType(contents, "value", "java.lang.Number");
}

@Test // GROOVY-5001
public void testNotMapProperty2() {
String contents =
"class Pogo extends HashMap<String,String> {\n" +
" public Number name\n" +
"}\n" +
"new Pogo().name\n";
assertType(contents, "name", isAtLeastGroovy(50) ? "java.lang.Number" : "java.lang.String");
}

@Test
public void testBoolean1() {
assertType("!x", "java.lang.Boolean");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -710,12 +710,14 @@ protected ASTNode findDeclaration(final String name, final ClassNode declaringTy

// look for field
FieldNode field = declaringType.getField(name);
if (isCompatible(field, isStaticExpression) &&
!(Flags.isSynthetic(field.getModifiers()) && field.getType().equals(ClassHelper.REFERENCE_TYPE)) &&
// no indirect, non-private accessor (map get or put if no non-final public/protected field exists)
(!(nonPrivateAccessor || (dynamicProperty && !(isLhsExpression && !field.isFinal() && (field.isPublic()||field.isProtected())))) ||
directFieldAccess >= 1 && declaringType.equals(field.getDeclaringClass()) && (directFieldAccess == 1 || !field.isPrivate()))) {
return field;
if (isCompatible(field, isStaticExpression) && !(Flags.isSynthetic(field.getModifiers()) && field.getType().equals(ClassHelper.REFERENCE_TYPE))) {
boolean direct = directFieldAccess >= 1 && declaringType.equals(field.getDeclaringClass()) && (directFieldAccess == 1 || !field.isPrivate());
boolean expose = isLhsExpression // GROOVY-11367: get and set incongruent
? (!field.isFinal() && (field.isPublic() || field.isProtected())) // GROOVY-8065
: (field.isPublic() && GroovyUtils.getGroovyVersion().getMajor() >= 5); // GROOVY-5001
if (direct || !(nonPrivateAccessor || (dynamicProperty && !expose))) {
return field;
}
}

if (dynamicProperty && !(nonPrivateAccessor && (isLhsExpression || GroovyUtils.getGroovyVersion().getMajor() >= 5))) { // GROOVY-5001, GROOVY-5491
Expand Down

0 comments on commit 7544704

Please sign in to comment.