Skip to content

Commit

Permalink
GROOVY-11372: STC: read-only property via extension method
Browse files Browse the repository at this point in the history
  • Loading branch information
eric-milles committed May 10, 2024
1 parent ea129d3 commit fd42b93
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1720,7 +1720,6 @@ protected boolean existsProperty(final PropertyExpression pexp, final boolean re
}

// GROOVY-5568, GROOVY-9115, GROOVY-9123: the property may be defined by an extension
if (readMode) // GROOVY-11372
for (ClassNode dgmReceiver : isPrimitiveType(receiverType) ? new ClassNode[]{receiverType, getWrapper(receiverType)} : new ClassNode[]{receiverType}) {
Set<MethodNode> methods = findDGMMethodsForClassNode(loader, dgmReceiver, getterName);
for (MethodNode method : findDGMMethodsForClassNode(loader, dgmReceiver, isserName)) {
Expand All @@ -1735,9 +1734,9 @@ protected boolean existsProperty(final PropertyExpression pexp, final boolean re
!typeCheckMethodsWithGenerics(dgmReceiver, ClassNode.EMPTY_ARRAY, method)
);
}
if (!methods.isEmpty()) {
List<MethodNode> bestMethods = chooseBestMethod(dgmReceiver, methods, ClassNode.EMPTY_ARRAY);
if (bestMethods.size() == 1) {
List<MethodNode> bestMethods = chooseBestMethod(dgmReceiver, methods, ClassNode.EMPTY_ARRAY);
if (bestMethods.size() == 1) {
if (readMode) {
MethodNode getter = bestMethods.get(0);
if (visitor != null) {
visitor.visitMethod(getter);
Expand All @@ -1746,6 +1745,8 @@ protected boolean existsProperty(final PropertyExpression pexp, final boolean re
storeInferredTypeForPropertyExpression(pexp, returnType);
storeTargetMethod(pexp, getter);
return true;
} else if (setters.isEmpty()) { // GROOVY-11372
pexp.putNodeMetaData(READONLY_PROPERTY, Boolean.TRUE);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -692,7 +692,7 @@ class FieldsAndPropertiesSTCTest extends StaticTypeCheckingTestCase {
'''
}

// GROOVY-11369
// GROOVY-11369, GROOVY-11372
void testMapPropertyAccess5() {
assertScript '''
def map = [:]
Expand All @@ -706,14 +706,17 @@ class FieldsAndPropertiesSTCTest extends StaticTypeCheckingTestCase {
map.empty = null // not read-only property
map.class = null // not read-only property
map.metaClass = null // not read-only property
map.properties = null
assert map.containsKey('entry')
assert map.containsKey('empty')
assert map.containsKey('class')
assert !map.containsKey('metaClass')
assert map.containsKey('properties')
'''
shouldFailWithMessages '''
def map = [:]
map.properties = null
''',
'Cannot set read-only property: properties'
}

// GROOVY-8074
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -912,6 +912,12 @@ final class FieldsAndPropertiesStaticCompileTest extends FieldsAndPropertiesSTCT
assert map.metaClass != null
assert !map.containsKey('metaClass')
'''

shouldFailWithMessages '''
def map = [:]
map.properties = null
''',
'Cannot set read-only property: properties'
}

// GROOVY-11367, GROOVY-11368
Expand Down

0 comments on commit fd42b93

Please sign in to comment.