Skip to content

Commit

Permalink
GROOVY-11223: STC: create setter access error
Browse files Browse the repository at this point in the history
  • Loading branch information
eric-milles committed May 8, 2024
1 parent 0d56d71 commit 8ba8e82
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1143,8 +1143,21 @@ private boolean ensureValidSetter(final Expression expression, final Expression
}
return false;
} else {
ClassNode firstSetterType = setterType.apply(setterInfo.setters.get(0));
addAssignmentError(firstSetterType, getType(valueExpression), expression);
List<MethodNode> visibleSetters = filterMethodsByVisibility(setterInfo.setters, typeCheckingContext.getEnclosingClassNode());
if (visibleSetters.isEmpty()) {
String message; // GROOVY-11223
if (setterInfo.setters.size() == 1) {
message = String.format("Cannot access method: %2$s of class: %1$s",
prettyPrintTypeName(setterInfo.setters.get(0).getDeclaringClass()),
toMethodParametersString(setterInfo.name, extractTypesFromParameters(setterInfo.setters.get(0).getParameters())));
} else {
message = "Cannot access methods: " + prettyPrintMethodList(setterInfo.setters);
}
addStaticTypeError(message, leftExpression);
} else {
ClassNode[] tergetTypes = visibleSetters.stream().map(setterType).toArray(ClassNode[]::new);
addAssignmentError(tergetTypes.length == 1 ? tergetTypes[0] : new UnionTypeClassNode(tergetTypes), getType(valueExpression), expression);
}
return true;
}
}
Expand Down
23 changes: 23 additions & 0 deletions src/test/groovy/transform/stc/FieldsAndPropertiesSTCTest.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -822,6 +822,29 @@ class FieldsAndPropertiesSTCTest extends StaticTypeCheckingTestCase {
'''
}

// GROOVY-11223
void testMapPropertyAccess10() {
assertScript """
def map = new ${MapType.name}()
map.foo = 11 // public setter
assert map.foo == 11
assert map.getFoo() == 11
assert map.get('foo') == null
"""
assertScript """
def map = new ${MapType.name}()
map.bar = 22 // protected setter
assert map.bar == null
assert map.@bar == 2
"""
assertScript """
def map = new ${MapType.name}()
map.baz = 33 // package-private setter
assert map.baz == null
assert map.@baz == 3
"""
}

void testTypeCheckerDoesNotThinkPropertyIsReadOnly() {
assertScript '''
// a base class defining a read-only property
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -934,4 +934,28 @@ final class FieldsAndPropertiesStaticCompileTest extends FieldsAndPropertiesSTCT
test(new C())
'''
}

// GROOVY-11223
@Override
void testMapPropertyAccess10() {
assertScript """
def map = new ${MapType.name}()
map.foo = 11 // public setter
assert map.foo == 11
assert map.getFoo() == 11
assert map.get('foo') == null
"""
shouldFailWithMessages """
def map = new ${MapType.name}()
map.bar = 22 // protected setter
""",
"Method setBar is protected in ${MapType.name}"
/*
shouldFailWithMessages """
def map = new ${MapType.name}()
map.baz = 33 // package-private setter
""",
"Method setBaz is package-private in ${MapType.name}"
*/
}
}

0 comments on commit 8ba8e82

Please sign in to comment.