This is an automated email from the ASF dual-hosted git repository.

emilles pushed a commit to branch GROOVY-4737
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit 5329496eb0478002fa98e136d2e430cabc9e68a6
Author: Eric Milles <[email protected]>
AuthorDate: Sat Jan 24 11:08:04 2026 -0600

    4737, 4862, 5875, 6580, 6581
---
 src/main/java/groovy/lang/MetaClassImpl.java       | 70 +++++++++++++++++++++-
 .../classgen/InnerClassCompletionVisitor.java      | 10 ----
 2 files changed, 67 insertions(+), 13 deletions(-)

diff --git a/src/main/java/groovy/lang/MetaClassImpl.java 
b/src/main/java/groovy/lang/MetaClassImpl.java
index 94c972b72e..dde3805275 100644
--- a/src/main/java/groovy/lang/MetaClassImpl.java
+++ b/src/main/java/groovy/lang/MetaClassImpl.java
@@ -1899,16 +1899,55 @@ public class MetaClassImpl implements MetaClass, 
MutableMetaClass {
         
//----------------------------------------------------------------------
         // missing property protocol
         
//----------------------------------------------------------------------
-        return invokeMissingProperty(object, name, null, true);
+        try {
+            return invokeMissingProperty(object, name, null, true);
+        } catch (MissingPropertyException mpe) {
+            if (false && sender == theClass) {
+                Class<?> outerClass = theClass.getEnclosingClass();
+                if (outerClass != null) {
+                    MetaClass omc = registry.getMetaClass(outerClass);
+                    try {
+                        Object outer = outerClass;
+                        if ((theClass.getModifiers() & Opcodes.ACC_STATIC) == 
0) {
+                            try {
+                                theClass.getDeclaredField("this$0");
+                                outer = getAttribute(object, "this$0");
+                            } catch (NoSuchFieldException e) {
+                            }
+                        }
+                        return omc.getProperty(outerClass, outer, name, false, 
false);
+                    } catch (MissingPropertyException suppressed) {
+                        mpe.addSuppressed(suppressed);
+                    } catch (Throwable t) {
+                        t.printStackTrace();
+                    }
+                }
+            }
+            throw mpe;
+        }
     }
 
     private Object getClassProperty(final Class<?> sender, final Class<?> 
receiver, final String name) throws MissingPropertyException {
         try {
             MetaClass cmc = registry.getMetaClass(Class.class);
             return cmc.getProperty(Class.class, receiver, name, false, false);
-        } catch (MissingPropertyException ignore) {
+        } catch (MissingPropertyException ignored) {
+        }
+
+        try {
             // try $static_propertyMissing / throw MissingPropertyException
             return invokeStaticMissingProperty(receiver, name, null, true);
+        } catch (MissingPropertyException missing) {
+            Class<?> outerClass = theClass.getEnclosingClass();
+            if (outerClass != null && sender.isNestmateOf(outerClass)) {
+                try {
+                    MetaClass omc = registry.getMetaClass(outerClass);
+                    return omc.getProperty(sender, outerClass, name, false, 
false);
+                } catch (MissingPropertyException mpe) {
+                    missing.addSuppressed(mpe);
+                }
+            }
+            throw missing;
         }
     }
 
@@ -2037,7 +2076,32 @@ public class MetaClassImpl implements MetaClass, 
MutableMetaClass {
         return new ReadOnlyMetaProperty(name) {
             @Override
             public Object getProperty(final Object receiver) {
-                return invokeMissingProperty(receiver, getName(), null, true);
+                try {
+                    return invokeMissingProperty(receiver, getName(), null, 
true);
+                } catch (MissingPropertyException mpe) {
+                    if (false && sender == theClass) {
+                        Class<?> outerClass = theClass.getEnclosingClass();
+                        if (outerClass != null) {
+                            MetaClass omc = registry.getMetaClass(outerClass);
+                            try {
+                                Object outer = outerClass;
+                                if ((theClass.getModifiers() & 
Opcodes.ACC_STATIC) == 0) {
+                                    try {
+                                        theClass.getDeclaredField("this$0");
+                                        outer = getAttribute(receiver, 
"this$0");
+                                    } catch (NoSuchFieldException e) {
+                                    }
+                                }
+                                return omc.getProperty(outerClass, outer, 
name, false, false);
+                            } catch (MissingPropertyException suppressed) {
+                                mpe.addSuppressed(suppressed);
+                            } catch (Throwable t) {
+                                t.printStackTrace();
+                            }
+                        }
+                    }
+                    throw mpe;
+                }
             }
         };
     }
diff --git 
a/src/main/java/org/codehaus/groovy/classgen/InnerClassCompletionVisitor.java 
b/src/main/java/org/codehaus/groovy/classgen/InnerClassCompletionVisitor.java
index fb70379836..76eac4653e 100644
--- 
a/src/main/java/org/codehaus/groovy/classgen/InnerClassCompletionVisitor.java
+++ 
b/src/main/java/org/codehaus/groovy/classgen/InnerClassCompletionVisitor.java
@@ -325,16 +325,6 @@ public class InnerClassCompletionVisitor extends 
InnerClassVisitorHelper {
                     }
                 }
         );
-
-        addMissingHandler(node,
-                "$static_propertyMissing",
-                ACC_PUBLIC | ACC_STATIC,
-                OBJECT_TYPE,
-                params(param(STRING_TYPE, "name")),
-                (methodBody, parameters) -> {
-                    setPropertyGetterDispatcher(methodBody, 
classX(outerClass), parameters);
-                }
-        );
     }
 
     /*   */ void addMissingHandler(final InnerClassNode innerClass, final 
String methodName, final int modifiers,

Reply via email to