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 '''

Reply via email to