Jelajahi Sumber

change: MethodInspectorVM - small refactoring
change: MethodUtils - rename #getReturnType #getArguments

Ranides Atterwim 11 tahun lalu
induk
melakukan
0e448ffb84

+ 37 - 31
src/main/java/net/ranides/assira/asm/MethodInspectorVM.java

@@ -52,23 +52,12 @@ public final class MethodInspectorVM {
      */
 
     /**
-     * Ustala typ zwracany przez przekazaną metodę. W przeciwieństwie do
-     * Reflection API, obsługuje również typy generyczne, wykrywając generic parameters.
+     * Ustala typ zwracany przez przekazaną metodę, zwracając w miarę możliwości
+     * szczegółowe informacje o typach generycznych.
      * @param method
      * @return
      */
-    public static GenericClass getReturnType(Method method) {
-        return AsmUtils.vm2generic( getVMReturn(method) );
-    }
-
-    /**
-     * Ustala typ zwracany przez przekazaną metodę, zwracając w formacie używanym
-     * wewnętrznie przez JVM. Zwrócony wynik może być przekazany np do metody
-     * {@link AsmUtils#vm2generic}.
-     * @param method
-     * @return
-     */
-    public static String getVMReturn(final Method method) {
+    public static GenericClass typeof(final Method method) {
         try {
             final String smethod = AsmUtils.sig(method);
             final Wrapper<String> result = Wrapper.make();
@@ -84,14 +73,18 @@ public final class MethodInspectorVM {
                 }
             },0);
             if(null == result.get()) {
-                return AsmUtils.class2vm(method.getReturnType());
+                return TypeFactory.construct(method.getReturnType());
             } else {
-                return result.get().substring(result.get().lastIndexOf(")")+1);
+                return AsmUtils.vm2generic(result.get().substring(result.get().lastIndexOf(")")+1));
             }
         } catch (IOException cause) {
             throw new InspectException(cause);
         }
     }
+    
+    public static Class<?> typeof(Constructor<?> ctor) {
+        return ctor.getDeclaringClass();
+    }
 
     /**
      * Zwraca listę argumentów pobieranych przez metodę. Reflection API pozwala
@@ -101,8 +94,12 @@ public final class MethodInspectorVM {
      * @param method
      * @return
      */
-    public static List<GenericParam> getArguments(Method method) {
-        List<GenericParam> list = getVMVariables(method);
+    public static List<GenericParam> params(Method method) {
+        List<GenericParam> list = ivariables(
+            method.getDeclaringClass(), 
+            method.getName(), 
+            AsmUtils.sig(method)
+        );
         if(MemberUtils.isStatic(method)) {
             return list.subList(0, method.getParameterTypes().length);
         } else {
@@ -110,10 +107,14 @@ public final class MethodInspectorVM {
         }
     }
     
-    public static List<GenericParam> getArguments(Constructor<?> ctor) {
-        return getVMVariables(ctor).subList(1, ctor.getParameterTypes().length+1);
+    public static List<GenericParam> params(Constructor<?> ctor) {
+        List<GenericParam> list = ivariables(
+            ctor.getDeclaringClass(), "<init>", 
+            AsmUtils.sig(ctor)
+        );
+        return list.subList(1, ctor.getParameterTypes().length+1);
     }
-
+    
     /**
      * Zwraca listę zmiennych zdefiniowanych w metodzie. Argumenty funkcji również
      * są na poziomie bytecode'u reprezentowane jako zmienne. Kolejność zmiennych
@@ -121,24 +122,29 @@ public final class MethodInspectorVM {
      * @param method
      * @return
      */
-    public static List<GenericParam> getVariables(Method method) {
-        List<GenericParam> list = getVMVariables(method);
+    public static List<GenericParam> variables(Method method) {
+        List<GenericParam> list = ivariables(
+            method.getDeclaringClass(), 
+            method.getName(), 
+            AsmUtils.sig(method)
+        );
         if(MemberUtils.isStatic(method)) {
             return list.subList(method.getParameterTypes().length, list.size());
         } else {
             return list.subList(method.getParameterTypes().length+1, list.size());
         }
     }
-
-    public static List<GenericParam> getVMVariables(final Method method) {
-        return getVMVariables(method.getDeclaringClass(), method.getName(), AsmUtils.sig(method));
-    }
     
-    public static List<GenericParam> getVMVariables(final Constructor<?> ctor) {
-        return getVMVariables(ctor.getDeclaringClass(), "<init>", AsmUtils.sig(ctor));
+    public static List<GenericParam> variables(final Constructor<?> ctor) {
+        List<GenericParam> list = ivariables(
+            ctor.getDeclaringClass(), 
+            "<init>", 
+            AsmUtils.sig(ctor)
+        );
+        return list.subList(ctor.getParameterTypes().length+1, list.size());
     }
     
-    private static List<GenericParam> getVMVariables(Class<?> clazz, final String cname, final String sig) {
+    private static List<GenericParam> ivariables(Class<?> clazz, final String cname, final String sig) {
         try {
             final TreeMap<Integer, VMVariable> variables = new TreeMap<>();
             final ClassReader creader = new ClassReader(clazz.getName());
@@ -168,7 +174,7 @@ public final class MethodInspectorVM {
      * @param clazz
      * @return
      */
-    public static List<VMMethod> getVMMethods(final Class<?> clazz) {
+    public static List<VMMethod> methods(final Class<?> clazz) {
         // @todo (assira # 3) use that in MethodInspector
         // it should be better than reflection #getDeclaredMethods
         // it returns parameter names & better generic types

+ 3 - 3
src/main/java/net/ranides/assira/reflection/MethodFactory.java

@@ -105,7 +105,7 @@ public final class MethodFactory {
 
         @Override
         protected List<GenericParam> iparams() {
-            return MethodInspectorVM.getArguments(method);
+            return MethodInspectorVM.params(method);
         }
 
         @Override
@@ -174,12 +174,12 @@ public final class MethodFactory {
 
         @Override
         protected GenericClass itype() {
-            return MethodUtils.getReturnType(method);
+            return MethodUtils.typeof(method);
         }
 
         @Override
         protected List<GenericParam> iparams() {
-            return MethodUtils.getArguments(method);
+            return MethodUtils.params(method);
         }
         
         @Override

+ 2 - 2
src/main/java/net/ranides/assira/reflection/inspect/BeanInspector.java

@@ -97,10 +97,10 @@ public class BeanInspector {
 
     public GenericClass typeof(String name) throws InspectException {
         if( getters.containsKey(name) ) {
-            return MethodUtils.getReturnType(getters.get(name));
+            return MethodUtils.typeof(getters.get(name));
         }
         if( setters.containsKey(name) ) {
-            return MethodUtils.getArguments(setters.get(name)).get(0).type();
+            return MethodUtils.params(setters.get(name)).get(0).type();
         }
         if( fields.containsKey(name) ) {
             return TypeFactory.construct(fields.get(name).getGenericType());

+ 4 - 4
src/main/java/net/ranides/assira/reflection/util/MethodUtils.java

@@ -33,8 +33,8 @@ public final class MethodUtils {
      * @param method
      * @return
      */
-    public static GenericClass getReturnType(Method method) {
-        return MethodInspectorVM.getReturnType(method);
+    public static GenericClass typeof(Method method) {
+        return MethodInspectorVM.typeof(method);
     }
 
     /**
@@ -45,8 +45,8 @@ public final class MethodUtils {
      * @param method
      * @return
      */
-    public static List<GenericParam> getArguments(Method method) {
-        return MethodInspectorVM.getArguments(method);
+    public static List<GenericParam> params(Method method) {
+        return MethodInspectorVM.params(method);
     }
     
     /**

+ 9 - 28
src/test/java/net/ranides/assira/asm/MethodInspectorTest.java

@@ -44,7 +44,7 @@ public class MethodInspectorTest {
             LoggerUtils.dump("%s\n", message);
         }
         int index=0;
-        for(GenericParam var : MethodInspectorVM.getArguments(method)) {
+        for(GenericParam var : MethodInspectorVM.params(method)) {
             if(DEBUG) {
                 LoggerUtils.dump("\t\"%s\"\n", var);
             }
@@ -58,7 +58,7 @@ public class MethodInspectorTest {
             LoggerUtils.dump("%s\n", message);
         }
         int index=0;
-        for(GenericParam var : MethodInspectorVM.getVariables(method)) {
+        for(GenericParam var : MethodInspectorVM.variables(method)) {
             if(DEBUG) {
                 LoggerUtils.dump("\t\"%s\"\n", var);
             }
@@ -67,40 +67,21 @@ public class MethodInspectorTest {
     }
 
     @Test
-    public void testGetVMReturn( ) {
-        assertEquals("Lnet/ranides/assira/collection/map/CrossMap<Ljava/util/Set<[Ljava/lang/Character;>;Ljava/lang/Float;Ljava/util/List<Lnet/ranides/assira/generic/Function<Ljava/lang/Integer;Ljava/lang/Long;>;>;>;",
-            MethodInspectorVM.getVMReturn(fm(A.class, "map1"))
-        );
-        assertEquals("Lnet/ranides/assira/collection/map/CrossMap<***>;",
-            MethodInspectorVM.getVMReturn(fm(A.class, "map2"))
-        );
-        assertEquals("Lnet/ranides/assira/collection/map/CrossMap<*Ljava/lang/Byte;*>;",
-            MethodInspectorVM.getVMReturn(fm(A.class, "map3"))
-        );
-        assertEquals("Lnet/ranides/assira/collection/map/CrossMap<-Ljava/lang/Byte;Ljava/lang/Byte;+Ljava/lang/Byte;>;",
-            MethodInspectorVM.getVMReturn(fm(A.class, "map4"))
-        );
-        assertEquals("Ljava/util/Map<TArg;TRet;>;",
-            MethodInspectorVM.getVMReturn(fm(A.class, "map5"))
-        );
-    }
-
-    @Test
-    public void testGetReturnType() throws IOException {
+    public void testgetVMReturn() throws IOException {
         assertEquals("CrossMap<Set<Character[]>, Float, List<Function<Integer, Long>>>",
-            MethodInspectorVM.getReturnType(fm(A.class, "map1")).toString()
+            MethodInspectorVM.typeof(fm(A.class, "map1")).toString()
         );
         assertEquals("CrossMap<?, ?, ?>",
-            MethodInspectorVM.getReturnType(fm(A.class, "map2")).toString()
+            MethodInspectorVM.typeof(fm(A.class, "map2")).toString()
         );
         assertEquals("CrossMap<?, Byte, ?>",
-            MethodInspectorVM.getReturnType(fm(A.class, "map3")).toString()
+            MethodInspectorVM.typeof(fm(A.class, "map3")).toString()
         );
         assertEquals("CrossMap<Byte, Byte, Byte>",
-            MethodInspectorVM.getReturnType(fm(A.class, "map4")).toString()
+            MethodInspectorVM.typeof(fm(A.class, "map4")).toString()
         );
         assertEquals("Map<Arg, Ret>",
-            MethodInspectorVM.getReturnType(fm(A.class, "map5")).toString()
+            MethodInspectorVM.typeof(fm(A.class, "map5")).toString()
         );
     }
 
@@ -149,7 +130,7 @@ public class MethodInspectorTest {
 
     @Test
     public void testInspector() {
-        for(VMMethod item : MethodInspectorVM.getVMMethods(B.class) ) {
+        for(VMMethod item : MethodInspectorVM.methods(B.class) ) {
             LoggerUtils.dump("%s\n", item.owner.getSimpleName()+":"+item.name);
             LoggerUtils.dump("%s\n", LexicalCast.asText(item.params) );
         }