This is an automated email from the ASF dual-hosted git repository. paulk pushed a commit to branch GROOVY_3_0_X in repository https://gitbox.apache.org/repos/asf/groovy.git
commit b520fe5fb136192c9a4acc32d7913ce6adb140ae Author: Paul King <[email protected]> AuthorDate: Fri Jul 17 23:20:24 2020 +1000 GROOVY-9618: Property reference resolves to field, not getter when property name is single upper-case letter --- src/main/java/groovy/lang/MetaClassImpl.java | 9 ++++++++- src/test/groovy/PropertyTest.groovy | 8 ++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/groovy/lang/MetaClassImpl.java b/src/main/java/groovy/lang/MetaClassImpl.java index 9d1a4e7..4313bb0 100644 --- a/src/main/java/groovy/lang/MetaClassImpl.java +++ b/src/main/java/groovy/lang/MetaClassImpl.java @@ -2088,9 +2088,16 @@ public class MetaClassImpl implements MetaClass, MutableMetaClass { private Tuple2<MetaMethod, MetaProperty> createMetaMethodAndMetaProperty(final Class senderForMP, final Class senderForCMG, final String name, final boolean useSuper, final boolean isStatic) { MetaMethod method = null; MetaProperty mp = getMetaProperty(senderForMP, name, useSuper, isStatic); - if (mp == null && isUpperCase(name.charAt(0)) && (name.length() < 2 || !isUpperCase(name.charAt(1)))) { + if ((mp == null || mp instanceof CachedField) && isUpperCase(name.charAt(0)) && (name.length() < 2 || !isUpperCase(name.charAt(1))) && !"Class".equals(name)) { + // GROOVY-9618 adjust because capitalised properties aren't stored as meta bean props + MetaProperty saved = mp; mp = getMetaProperty(senderForMP, BeanUtils.decapitalize(name), useSuper, isStatic); + if (mp == null || (saved != null && mp instanceof CachedField)) { + // restore if we didn't find something better + mp = saved; + } } + if (mp != null) { if (mp instanceof MetaBeanProperty) { MetaBeanProperty mbp = (MetaBeanProperty) mp; diff --git a/src/test/groovy/PropertyTest.groovy b/src/test/groovy/PropertyTest.groovy index 5efbc57..4f49395 100644 --- a/src/test/groovy/PropertyTest.groovy +++ b/src/test/groovy/PropertyTest.groovy @@ -280,6 +280,10 @@ class PropertyTest extends GroovyTestCase { void testJavaBeanNamingForPropertyAccess() { assertScript ''' class A { + private String X = 'fieldX' + private String Prop = 'fieldProp' + private String DB = 'fieldDB' + private String XML = 'fieldXML' String getProp() { 'Prop' } String getSomeProp() { 'SomeProp' } String getX() { 'X' } @@ -344,6 +348,10 @@ class PropertyTest extends GroovyTestCase { void testJavaBeanNamingForStaticPropertyAccess() { assertScript ''' class A { + private static String X = 'fieldX' + private static String Prop = 'fieldProp' + private static String DB = 'fieldDB' + private static String XML = 'fieldXML' static String getProp() { 'Prop' } static String getSomeProp() { 'SomeProp' } static String getX() { 'X' }
