This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch GROOVY_5_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/GROOVY_5_0_X by this push:
new 56eb3e8bf4 GROOVY-11874: add null check
56eb3e8bf4 is described below
commit 56eb3e8bf4cd582a00fd575ace3879a0733efe75
Author: Eric Milles <[email protected]>
AuthorDate: Wed Mar 18 11:24:48 2026 -0500
GROOVY-11874: add null check
5_0_X backport
---
src/main/java/groovy/lang/MetaClassImpl.java | 8 +++++---
.../groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy | 9 +++++++++
2 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/src/main/java/groovy/lang/MetaClassImpl.java
b/src/main/java/groovy/lang/MetaClassImpl.java
index 76f7e8c5d1..0eadc18739 100644
--- a/src/main/java/groovy/lang/MetaClassImpl.java
+++ b/src/main/java/groovy/lang/MetaClassImpl.java
@@ -113,7 +113,6 @@ import java.util.concurrent.ConcurrentMap;
import java.util.function.BiConsumer;
import static groovy.lang.Tuple.tuple;
-import static java.lang.Character.isUpperCase;
import static org.apache.groovy.ast.tools.ClassNodeUtils.isValidAccessorName;
import static org.apache.groovy.util.Arrays.concat;
import static org.codehaus.groovy.ast.tools.GeneralUtils.inSamePackage;
@@ -2132,8 +2131,11 @@ public class MetaClassImpl implements MetaClass,
MutableMetaClass {
private Tuple2<MetaMethod, MetaProperty>
createMetaMethodAndMetaProperty(final Class<?> sender, final String name, final
boolean useSuper, final boolean isStatic) {
MetaMethod method = null;
MetaProperty mp = getMetaProperty(sender, name, useSuper, isStatic);
- if ((mp == null || mp instanceof CachedField) && !name.isEmpty() &&
isUpperCase(name.charAt(0)) && (name.length() < 2 ||
!isUpperCase(name.charAt(1))) && !"Class".equals(name) &&
!"MetaClass".equals(name)) {
- // GROOVY-9618 adjust because capitalised properties aren't stored
as meta bean props
+
+ if ((mp == null || mp instanceof CachedField)
+ && name != null && !name.isEmpty() &&
Character.isUpperCase(name.charAt(0)) // GROOVY-11874
+ && (name.length() == 1 ||
(!Character.isUpperCase(name.charAt(1)) && !name.equals("Class") &&
!name.equals("MetaClass"))) ) {
+ // GROOVY-9618: adjust because capitalised properties aren't
stored as meta bean props
MetaProperty saved = mp;
mp = getMetaProperty(sender, BeanUtils.decapitalize(name),
useSuper, isStatic);
if (mp == null || (saved != null && mp instanceof CachedField)) {
diff --git
a/src/test/groovy/groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy
b/src/test/groovy/groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy
index 4ece87fab2..fb98fdaab1 100644
--- a/src/test/groovy/groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy
+++ b/src/test/groovy/groovy/transform/stc/ArraysAndCollectionsSTCTest.groovy
@@ -1008,6 +1008,15 @@ class ArraysAndCollectionsSTCTest extends
StaticTypeCheckingTestCase {
'''
}
+ // GROOVY-11874
+ void testMapGetAt() {
+ assertScript '''
+ String name = null
+ def map = [:]
+ map[name]
+ '''
+ }
+
// GROOVY-6266
void testMapGenerics() {
assertScript '''