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 b94d761b9c26b56399499b20d13daa11efd2ec52
Author: Paul King <pa...@asert.com.au>
AuthorDate: Thu Jun 23 23:58:52 2022 +1000

    GROOVY-10661: reduce some duplication in Inspector (port to 3_0_X)
---
 src/main/java/groovy/inspect/Inspector.java        | 117 +++++++++------------
 .../groovy/groovy/console/ui/ObjectBrowser.groovy  |  28 ++---
 2 files changed, 61 insertions(+), 84 deletions(-)

diff --git a/src/main/java/groovy/inspect/Inspector.java 
b/src/main/java/groovy/inspect/Inspector.java
index 73fa806d6a..61fd80a970 100644
--- a/src/main/java/groovy/inspect/Inspector.java
+++ b/src/main/java/groovy/inspect/Inspector.java
@@ -22,6 +22,7 @@ import groovy.lang.GroovyObject;
 import groovy.lang.MetaClass;
 import groovy.lang.MetaMethod;
 import groovy.lang.PropertyValue;
+import groovy.lang.Tuple2;
 import org.codehaus.groovy.runtime.DefaultGroovyMethods;
 import org.codehaus.groovy.runtime.InvokerHelper;
 
@@ -59,7 +60,6 @@ public class Inspector {
     public static final int MEMBER_PARAMS_IDX = 5;
     public static final int MEMBER_VALUE_IDX = 5;
     public static final int MEMBER_EXCEPTIONS_IDX = 6;
-    public static final int MEMBER_RAW_VALUE_IDX = 6;
 
     public static final String NOT_APPLICABLE = "n/a";
     public static final String GROOVY = "GROOVY";
@@ -164,12 +164,12 @@ public class Inspector {
         return result;
     }
 
-    public Object[] getPublicFieldsWithRawValue() {
+    public Object[] getPublicFieldsWithInfo() {
         Field[] fields = getClassUnderInspection().getFields();
         Object[] result = new Object[fields.length];
         for (int i = 0; i < fields.length; i++) {
             Field field = fields[i];
-            result[i] = fieldInfoWithRawValue(field);
+            result[i] = fieldWithInfo(field);
         }
         return result;
     }
@@ -190,17 +190,6 @@ public class Inspector {
         return result;
     }
 
-    public Object[] getPropertyInfoWithRawValue() {
-        List props = 
DefaultGroovyMethods.getMetaPropertyValues(objectUnderInspection);
-        Object[] result = new Object[props.size()];
-        int i = 0;
-        for (Iterator iter = props.iterator(); iter.hasNext(); i++) {
-            PropertyValue pv = (PropertyValue) iter.next();
-            result[i] = fieldInfoWithRawValue(pv);
-        }
-        return result;
-    }
-
     protected String[] fieldInfo(Field field) {
         String[] result = new String[MEMBER_VALUE_IDX + 1];
         result[MEMBER_ORIGIN_IDX] = JAVA;
@@ -216,23 +205,22 @@ public class Inspector {
         return withoutNulls(result);
     }
 
-    protected Object[] fieldInfoWithRawValue(Field field) {
-        Object[] result = new Object[MEMBER_RAW_VALUE_IDX + 1];
-        result[MEMBER_ORIGIN_IDX] = JAVA;
-        result[MEMBER_MODIFIER_IDX] = Modifier.toString(field.getModifiers());
-        result[MEMBER_DECLARER_IDX] = shortName(field.getDeclaringClass());
-        result[MEMBER_TYPE_IDX] = shortName(field.getType());
-        result[MEMBER_NAME_IDX] = field.getName();
+    protected Tuple2<Object, String[]> fieldWithInfo(Field field) {
+        String[] info = new String[MEMBER_VALUE_IDX + 1];
+        info[MEMBER_ORIGIN_IDX] = JAVA;
+        info[MEMBER_MODIFIER_IDX] = Modifier.toString(field.getModifiers());
+        info[MEMBER_DECLARER_IDX] = shortName(field.getDeclaringClass());
+        info[MEMBER_TYPE_IDX] = shortName(field.getType());
+        info[MEMBER_NAME_IDX] = field.getName();
+        info = withoutNulls(info);
         Object rawValue = null;
         try {
             rawValue = field.get(objectUnderInspection);
-            result[MEMBER_VALUE_IDX] = InvokerHelper.inspect(rawValue);
+            info[MEMBER_VALUE_IDX] = InvokerHelper.inspect(rawValue);
         } catch (IllegalAccessException e) {
-            result[MEMBER_VALUE_IDX] = NOT_APPLICABLE;
+            info[MEMBER_VALUE_IDX] = NOT_APPLICABLE;
         }
-        result = withoutNullsWithRawValue(result);
-        result[MEMBER_RAW_VALUE_IDX] = rawValue;
-        return result;
+        return new Tuple2<>(rawValue, info);
     }
 
     protected String[] fieldInfo(PropertyValue pv) {
@@ -250,22 +238,31 @@ public class Inspector {
         return withoutNulls(result);
     }
 
-    protected Object[] fieldInfoWithRawValue(PropertyValue pv) {
-        Object[] result = new Object[MEMBER_VALUE_IDX + 2];
-        result[MEMBER_ORIGIN_IDX] = GROOVY;
-        result[MEMBER_MODIFIER_IDX] = "public";
-        result[MEMBER_DECLARER_IDX] = NOT_APPLICABLE;
-        result[MEMBER_TYPE_IDX] = shortName(pv.getType());
-        result[MEMBER_NAME_IDX] = pv.getName();
-        Object rawValue = null;
+    protected Tuple2<Object, String[]> fieldWithInfo(PropertyValue pv) {
+        String[] info = new String[MEMBER_VALUE_IDX + 1];
+        info[MEMBER_ORIGIN_IDX] = GROOVY;
+        info[MEMBER_MODIFIER_IDX] = "public";
+        info[MEMBER_DECLARER_IDX] = NOT_APPLICABLE;
+        info[MEMBER_TYPE_IDX] = shortName(pv.getType());
+        info[MEMBER_NAME_IDX] = pv.getName();
+        Object field = null;
         try {
-            rawValue = pv.getValue();
-            result[MEMBER_VALUE_IDX] = InvokerHelper.inspect(rawValue);
+            field = pv.getValue();
+            info[MEMBER_VALUE_IDX] = InvokerHelper.inspect(field);
         } catch (Exception e) {
-            result[MEMBER_VALUE_IDX] = NOT_APPLICABLE;
+            info[MEMBER_VALUE_IDX] = NOT_APPLICABLE;
+        }
+        info = withoutNulls(info);
+        return new Tuple2<>(field, info);
+    }
+
+    public Object[] getPropertiesWithInfo() {
+        List<PropertyValue> props = 
DefaultGroovyMethods.getMetaPropertyValues(objectUnderInspection);
+        Object[] result = new Object[props.size()];
+        int i = 0;
+        for (Iterator<PropertyValue> iter = props.iterator(); iter.hasNext(); 
i++) {
+            result[i] = fieldWithInfo(iter.next());
         }
-        result = withoutNullsWithRawValue(result);
-        result[MEMBER_RAW_VALUE_IDX] = rawValue;
         return result;
     }
 
@@ -349,15 +346,6 @@ public class Inspector {
         return toNormalize;
     }
 
-    protected Object[] withoutNullsWithRawValue(Object[] toNormalize) {
-        for (int i = 0; i < toNormalize.length; i++) {
-            if (toNormalize[i] == null) {
-                toNormalize[i] = NOT_APPLICABLE;
-            }
-        }
-        return toNormalize;
-    }
-
     public static void print(Object[] memberInfo) {
         print(System.out, memberInfo);
     }
@@ -374,7 +362,11 @@ public class Inspector {
     }
 
     public static Collection sort(List<Object> memberInfo) {
-        memberInfo.sort(new MemberComparator());
+        return sort(memberInfo, new MemberComparator());
+    }
+
+    public static Collection sort(List<Object> memberInfo, Comparator<Object> 
comparator) {
+        memberInfo.sort(comparator);
         return memberInfo;
     }
 
@@ -399,30 +391,15 @@ public class Inspector {
         }
     }
 
-    public static Collection sortWithRawValue(List<Object> memberInfo) {
-        memberInfo.sort(new MemberComparatorWithRawValue());
-        return memberInfo;
-    }
-
-    public static class MemberComparatorWithRawValue implements 
Comparator<Object>, Serializable {
-        private static final long serialVersionUID = -7691851726606749542L;
+    public static class MemberComparatorWithValue implements 
Comparator<Object>, Serializable {
+        private static final long serialVersionUID = 294298614093394525L;
+        private static final MemberComparator delegate = new 
MemberComparator();
 
         @Override
         public int compare(Object a, Object b) {
-            Object[] aStr = (Object[]) a;
-            Object[] bStr = (Object[]) b;
-            int result = ((String) 
aStr[Inspector.MEMBER_NAME_IDX]).compareTo((String) 
bStr[Inspector.MEMBER_NAME_IDX]);
-            if (0 != result) return result;
-            result = ((String) 
aStr[Inspector.MEMBER_TYPE_IDX]).compareTo((String) 
bStr[Inspector.MEMBER_TYPE_IDX]);
-            if (0 != result) return result;
-            result = 
((String)aStr[Inspector.MEMBER_PARAMS_IDX]).compareTo((String) 
bStr[Inspector.MEMBER_PARAMS_IDX]);
-            if (0 != result) return result;
-            result =((String) 
aStr[Inspector.MEMBER_DECLARER_IDX]).compareTo((String) 
bStr[Inspector.MEMBER_DECLARER_IDX]);
-            if (0 != result) return result;
-            result = 
((String)aStr[Inspector.MEMBER_MODIFIER_IDX]).compareTo((String) 
bStr[Inspector.MEMBER_MODIFIER_IDX]);
-            if (0 != result) return result;
-            result = ((String) 
aStr[Inspector.MEMBER_ORIGIN_IDX]).compareTo((String) 
bStr[Inspector.MEMBER_ORIGIN_IDX]);
-            return result;
+            Tuple2<Object, String[]> aTuple = (Tuple2<Object, String[]>) a;
+            Tuple2<Object, String[]> bTuple = (Tuple2<Object, String[]>) b;
+            return delegate.compare(aTuple.getV2(), bTuple.getV2());
         }
     }
 }
diff --git 
a/subprojects/groovy-console/src/main/groovy/groovy/console/ui/ObjectBrowser.groovy
 
b/subprojects/groovy-console/src/main/groovy/groovy/console/ui/ObjectBrowser.groovy
index 26769b5a0b..2db788cd2b 100644
--- 
a/subprojects/groovy-console/src/main/groovy/groovy/console/ui/ObjectBrowser.groovy
+++ 
b/subprojects/groovy-console/src/main/groovy/groovy/console/ui/ObjectBrowser.groovy
@@ -37,7 +37,6 @@ import static groovy.inspect.Inspector.MEMBER_ORIGIN_IDX
 import static groovy.inspect.Inspector.MEMBER_PARAMS_IDX
 import static groovy.inspect.Inspector.MEMBER_TYPE_IDX
 import static groovy.inspect.Inspector.MEMBER_VALUE_IDX
-import static groovy.inspect.Inspector.MEMBER_RAW_VALUE_IDX
 
 /**
  * A little GUI to show some of the Inspector capabilities.
@@ -52,6 +51,7 @@ class ObjectBrowser {
     def inspector
     def path
     def swing, frame, fieldTable, methodTable, arrayTable, collectionTable, 
mapTable
+    private static final Comparator<Object> comparator = new 
Inspector.MemberComparatorWithValue()
 
     static void main(args) {
         inspect('some String')
@@ -96,7 +96,7 @@ class ObjectBrowser {
                                 tableModel(list: 
inspector.object.toList().withIndex()) {
                                     closureColumn(header: 'Index', read: { 
it[1] })
                                     closureColumn(header: 'Value', read: { 
it[0] })
-                                    closureColumn(header: 'Raw Value', read: { 
it[0] }) // to support sorting
+                                    closureColumn(header: 'Raw Value', read: { 
it[0] })
                                 }
                             }
                             arrayTable.columnModel.getColumn(2).with {
@@ -114,7 +114,7 @@ class ObjectBrowser {
                                 tableModel(list: inspector.object.withIndex()) 
{
                                     closureColumn(header: 'Index', read: { 
it[1] })
                                     closureColumn(header: 'Value', read: { 
it[0] })
-                                    closureColumn(header: 'Raw Value', read: { 
it[0] }) // to support sorting
+                                    closureColumn(header: 'Raw Value', read: { 
it[0] })
                                 }
                             }
                             collectionTable.columnModel.getColumn(2).with {
@@ -133,7 +133,7 @@ class ObjectBrowser {
                                     closureColumn(header: 'Index', read: { 
it[1] })
                                     closureColumn(header: 'Key', read: { 
it[0].key })
                                     closureColumn(header: 'Value', read: { 
it[0].value })
-                                    closureColumn(header: 'Raw Value', read: { 
it[0].value }) // to support sorting
+                                    closureColumn(header: 'Raw Value', read: { 
it[0].value })
                                 }
                             }
                             mapTable.columnModel.getColumn(3).with {
@@ -148,16 +148,16 @@ class ObjectBrowser {
                     }
                     scrollPane(name: ' Public Fields and Properties ') {
                         fieldTable = table(selectionMode: SINGLE_SELECTION) {
-                            def data = 
Inspector.sortWithRawValue(inspector.publicFieldsWithRawValue.toList())
-                            
data.addAll(Inspector.sortWithRawValue(inspector.propertyInfoWithRawValue.toList()))
+                            def data = 
Inspector.sort(inspector.propertiesWithInfo.toList(), comparator)
+                            
data.addAll(Inspector.sort(inspector.publicFieldsWithInfo.toList(), comparator))
                             tableModel(list: data) {
-                                closureColumn(header: 'Name', read: { 
it[MEMBER_NAME_IDX] })
-                                closureColumn(header: 'Value', read: { 
it[MEMBER_VALUE_IDX] })
-                                closureColumn(header: 'Type', read: { 
it[MEMBER_TYPE_IDX] })
-                                closureColumn(header: 'Origin', read: { 
it[MEMBER_ORIGIN_IDX] })
-                                closureColumn(header: 'Modifier', read: { 
it[MEMBER_MODIFIER_IDX] })
-                                closureColumn(header: 'Declarer', read: { 
it[MEMBER_DECLARER_IDX] })
-                                closureColumn(header: 'Raw Value', read: { 
it[MEMBER_RAW_VALUE_IDX] }) // to support sorting
+                                closureColumn(header: 'Name', read: { 
it.v2[MEMBER_NAME_IDX] })
+                                closureColumn(header: 'Value', read: { 
it.v2[MEMBER_VALUE_IDX] })
+                                closureColumn(header: 'Type', read: { 
it.v2[MEMBER_TYPE_IDX] })
+                                closureColumn(header: 'Origin', read: { 
it.v2[MEMBER_ORIGIN_IDX] })
+                                closureColumn(header: 'Modifier', read: { 
it.v2[MEMBER_MODIFIER_IDX] })
+                                closureColumn(header: 'Declarer', read: { 
it.v2[MEMBER_DECLARER_IDX] })
+                                closureColumn(header: 'Raw Value', read: { 
it.v1 })
                             }
                         }
                         fieldTable.columnModel.getColumn(6).with {
@@ -165,7 +165,7 @@ class ObjectBrowser {
                             maxWidth = 0
                             width = 0
                         }
-                        
fieldTable.addMouseListener(makeClickAdapter(fieldTable, MEMBER_RAW_VALUE_IDX) 
{ row ->
+                        
fieldTable.addMouseListener(makeClickAdapter(fieldTable, 6) { row ->
                             path + (path.size() == 0 ? '' : '.') + 
"${fieldTable.model.getValueAt(row, 0)}"
                         })
                     }

Reply via email to