This is an automated email from the ASF dual-hosted git repository. emilles pushed a commit to branch GROOVY_4_0_X in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 9ddd37c824fb07bfc859c7dfe72ec0adfc65436e Author: Eric Milles <[email protected]> AuthorDate: Wed May 22 15:02:58 2024 -0500 classgen: upper before outer --- .../classgen/asm/sc/StaticTypesCallSiteWriter.java | 28 ++++++++++++---------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java index ee697dc828..ff5d635e87 100644 --- a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java +++ b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java @@ -23,7 +23,6 @@ import org.codehaus.groovy.ast.ASTNode; import org.codehaus.groovy.ast.ClassHelper; import org.codehaus.groovy.ast.ClassNode; import org.codehaus.groovy.ast.FieldNode; -import org.codehaus.groovy.ast.InnerClassNode; import org.codehaus.groovy.ast.MethodNode; import org.codehaus.groovy.ast.Parameter; import org.codehaus.groovy.ast.PropertyNode; @@ -458,7 +457,7 @@ public class StaticTypesCallSiteWriter extends CallSiteWriter { getterName = "get" + capitalize(propertyName); getterNode = receiverType.getGetterMethod(getterName); } - if (getterNode != null && receiver instanceof ClassExpression && !isClassType(receiverType) && !getterNode.isStatic()) { + if (getterNode != null && !getterNode.isStatic() && receiver instanceof ClassExpression && !isClassType(receiverType)) { return false; } @@ -486,22 +485,27 @@ public class StaticTypesCallSiteWriter extends CallSiteWriter { return true; } - if (receiverType instanceof InnerClassNode && !receiverType.isStaticClass()) { - if (makeGetPropertyWithGetter(receiver, receiverType.getOuterClass(), propertyName, safe, implicitThis)) { - return true; - } - } - // GROOVY-7149: check direct interfaces - for (ClassNode node : receiverType.getInterfaces()) { - if (makeGetPropertyWithGetter(receiver, node, propertyName, safe, implicitThis)) { + for (ClassNode traitClass : receiverType.getInterfaces()) { + if (makeGetPropertyWithGetter(receiver, traitClass, propertyName, safe, implicitThis)) { return true; } } - // go upper level + // check super class ClassNode superClass = receiverType.getSuperClass(); if (superClass != null) { - return makeGetPropertyWithGetter(receiver, superClass, propertyName, safe, implicitThis); + if (makeGetPropertyWithGetter(receiver, superClass, propertyName, safe, implicitThis)) { + return true; + } + } + // check outer class + ClassNode outerClass = receiverType.getOuterClass(); + if (implicitThis && outerClass != null + && !outerClass.implementsInterface(MAP_TYPE) + && (receiverType.getModifiers() & ACC_STATIC) == 0) { + if (makeGetPropertyWithGetter(receiver, outerClass, propertyName, safe, implicitThis)) { + return true; + } } return false;
