Ranides Atterwim 10 лет назад
Родитель
Сommit
64482a7ab8

+ 15 - 2
assira/src/main/java/net/ranides/assira/reflection/IAnnotations.java

@@ -7,12 +7,25 @@
 package net.ranides.assira.reflection;
 
 import java.lang.annotation.Annotation;
-import java.util.Collection;
+import java.util.Optional;
+import java.util.function.Predicate;
 
 /**
  *
  * @author Ranides Atterwim <ranides@gmail.com>
  */
-public interface IAnnotations extends Collection<Annotation> {
+public interface IAnnotations extends IElements<Annotation> {
     
+    <A extends Annotation> Optional<A> first(Class<A> type);
+    
+    IAnnotations require(Predicate<? super Annotation> predicate);
+    
+    IAnnotations require(Class<? extends Annotation> type);
+    
+    IAnnotations discard(Predicate<? super Annotation> predicate);
+    
+    IAnnotations discard(Class<? extends Annotation> type);
+    
+    
+            
 }

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

@@ -12,6 +12,9 @@ package net.ranides.assira.reflection;
  */
 public interface IArgument extends IElement {
     
+    @Override
+    IArguments asList();
+    
     IClass type();
     
 }

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

@@ -12,6 +12,8 @@ import java.util.List;
  *
  * @author Ranides Atterwim <ranides@gmail.com>
  */
-public interface IArguments extends List<IArgument> {
+public interface IArguments extends IElements<IArgument> {
+    
+    IClasses types();
     
 }

+ 26 - 2
assira/src/main/java/net/ranides/assira/reflection/IClass.java

@@ -6,11 +6,31 @@
  */
 package net.ranides.assira.reflection;
 
+import net.ranides.assira.reflection.impl.FClass;
+
 /**
- *
+ * @todo (assira #0) IClass#compareTo dziedziczenie
  * @author Ranides Atterwim <ranides@gmail.com>
  */
-public interface IClass extends IElement {
+public interface IClass extends IElement, Comparable<IClass> {
+    
+    /**
+     * Collect information using java.reflection API
+     * @param type
+     * @return 
+     */
+    static IClass typeinfo(Class<?> type) {
+        return FClass.typeinfo(type);
+    }
+    
+    /**
+     * Collect information using ASM bytecode analyzer
+     * @param type
+     * @return 
+     */
+    static IClass codeinfo(Class<?> type) {
+        return FClass.codeinfo(type);
+    }
 
     IClass[] params();
     
@@ -18,6 +38,10 @@ public interface IClass extends IElement {
     
     IMethods constructors();
     
+    /**
+     * @todo (assira #0) IAttribute.DECLARED ustawiany przez IClass#methods
+     * @return 
+     */
     IMethods methods();
     
     IClass parent();

+ 43 - 2
assira/src/main/java/net/ranides/assira/reflection/IClasses.java

@@ -6,14 +6,55 @@
  */
 package net.ranides.assira.reflection;
 
-import java.util.Collection;
+import java.lang.annotation.Annotation;
+import java.util.function.Predicate;
 
 /**
  *
  * @author Ranides Atterwim <ranides@gmail.com>
  */
-public interface IClasses extends Collection<IClass> {
+public interface IClasses extends IElements<IClass> {
+    
+    IClasses require(Predicate<? super IClass> predicate);
+    
+    IClasses require(IAnnotations annotations);
+    
+    IClasses require(Class<? extends Annotation> annotation);
+    
+    IClasses require(IClass parent);
+        
+    IClasses require(IAttribute attribute);
+    
+    IClasses require(IMethod method);
+    
+    IClasses discard(Predicate<? super IClass> predicate);
+    
+    IClasses discard(IAnnotations annotations);
+    
+    IClasses discard(Class<? extends Annotation> annotation);
+    
+    IClasses discard(IClass parent);
+    
+    IClasses discard(IAttribute attribute);
+    
+    IClasses discard(IMethod method);
+    
+    // deep scan
+    
+    IFields fields();
+    
+    IMethods constructors();
     
     IMethods methods();
+    
+    IClasses parent();
+    
+    IClasses parents();
+    
+    IClasses interfaces();
+    
+    IClasses outer();
+    
+    IClasses inner();
             
 }

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

@@ -14,6 +14,9 @@ import java.util.Set;
  */
 public interface IElement {
     
+    // @todo (assira #0) find better name
+    IElements asList();
+    
     String name();
     
     Set<IAttribute> attributes();

+ 37 - 0
assira/src/main/java/net/ranides/assira/reflection/IElements.java

@@ -0,0 +1,37 @@
+/*
+ * @author Ranides Atterwim <ranides@gmail.com>
+ * @copyright Ranides Atterwim
+ * @license WTFPL
+ * @url http://ranides.net/projects/assira
+ */
+package net.ranides.assira.reflection;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.function.Function;
+import java.util.stream.Collector;
+import java.util.stream.Stream;
+
+/**
+ *
+ * @author Ranides Atterwim <ranides@gmail.com>
+ */
+public interface IElements<T> {
+    
+    int count();
+    
+    <R> Stream<R> stream(Function<? super T, ? extends R> mapper);
+    
+    Stream<T> stream();
+    
+    <R> List<R> list(Function<? super T, ? extends R> mapper);
+    
+    List<T> list();
+    
+    <R, A> R collect(Collector<? super T, A, R> collector);
+    
+    Optional<T> first();
+    
+    List<String> names();
+    
+}

+ 15 - 1
assira/src/main/java/net/ranides/assira/reflection/IField.java

@@ -9,6 +9,7 @@ package net.ranides.assira.reflection;
 import java.lang.invoke.MethodHandle;
 import java.lang.reflect.Field;
 import net.ranides.assira.generic.Wrapper;
+import net.ranides.assira.reflection.impl.FField;
 
 /**
  *
@@ -16,6 +17,17 @@ import net.ranides.assira.generic.Wrapper;
  */
 public interface IField extends IElement {
     
+    static IField typeinfo(Field field) {
+        return FField.typeinfo(field);
+    }
+    
+    static IField codeinfo(Field field) {
+        return FField.codeinfo(field);
+    }
+    
+    @Override
+    IFields asList();
+    
     IClass type();
     
     Object get(Object that);
@@ -26,6 +38,8 @@ public interface IField extends IElement {
     
     Field reflective();
     
-    MethodHandle handle();
+    MethodHandle getter();
+    
+    MethodHandle setter();
     
 }

+ 25 - 2
assira/src/main/java/net/ranides/assira/reflection/IFields.java

@@ -6,12 +6,35 @@
  */
 package net.ranides.assira.reflection;
 
-import java.util.Collection;
+import java.lang.annotation.Annotation;
+import java.util.function.Predicate;
 
 /**
  *
  * @author Ranides Atterwim <ranides@gmail.com>
  */
-public interface IFields extends Collection<IField> {
+public interface IFields extends IElements<IField> {
+    
+    IFields require(Predicate<? super IField> predicate);
+    
+    IFields require(IAnnotations annotations);
+    
+    IFields require(Class<? extends Annotation> annotation);
+    
+    IFields require(IClass type);
+        
+    IFields require(IAttribute attribute);
+    
+    IFields discard(Predicate<? super IField> predicate);
+    
+    IFields discard(IAnnotations annotations);
+    
+    IFields discard(Class<? extends Annotation> annotation);
+    
+    IFields discard(IClass type);
+        
+    IFields discard(IAttribute attribute);
+    
+    IClasses types();
     
 }

+ 34 - 2
assira/src/main/java/net/ranides/assira/reflection/IMethod.java

@@ -9,12 +9,44 @@ package net.ranides.assira.reflection;
 import java.lang.invoke.MethodHandle;
 import java.lang.reflect.Method;
 import java.util.function.Function;
+import net.ranides.assira.reflection.impl.FMethod;
 
 /**
- *
+ * @todo (assira #0) IMethod#compareTo dziedziczenie
+ * w praktyce niech robi najpierw compareto by parent class
  * @author Ranides Atterwim <ranides@gmail.com>
  */
-public interface IMethod extends IElement {
+public interface IMethod extends IElement, Comparable<IMethod> {
+    
+    /**
+     * Collect information using java.reflection API
+     * @param method
+     * @return 
+     */
+    static IMethod typeinfo(Method method) {
+        return FMethod.typeinfo(method);
+    }
+    
+    /**
+     * Collect information using ASM bytecode analyzer
+     * @param method
+     * @return 
+     */
+    static IMethod codeinfo(Method method) {
+        return FMethod.codeinfo(method);
+    }
+    
+    /**
+     * Collect information for lambda expression
+     * @param object
+     * @return 
+     */
+    static IMethod function(Object object) {
+        return FMethod.function(object);
+    }
+    
+    @Override
+    IMethods asList();
     
     IClass[] params();
     

+ 39 - 1
assira/src/main/java/net/ranides/assira/reflection/IMethods.java

@@ -6,12 +6,50 @@
  */
 package net.ranides.assira.reflection;
 
+import java.lang.annotation.Annotation;
 import java.util.Collection;
+import java.util.function.Predicate;
 
 /**
  *
  * @author Ranides Atterwim <ranides@gmail.com>
  */
-public interface IMethods extends Collection<IMethod> {
+public interface IMethods extends IElements<IMethod> {
+    
+    IMethods require(Predicate<? super IField> predicate);
+    
+    IMethods require(IAnnotations annotations);
+    
+    IMethods require(Class<? extends Annotation> annotation);
+    
+    IMethods require(IAttribute attribute);
+    
+    IMethods require(IClass returns);
+    
+    IMethods require(IArguments params);
+    
+    IMethods require(IClasses params);
+    
+    IMethods discard(Predicate<? super IField> predicate);
+    
+    IMethods discard(IAnnotations annotations);
+    
+    IMethods discard(Class<? extends Annotation> annotation);
+    
+    IMethods discard(IAttribute attribute);
+    
+    IMethods discard(IClass returns);
+    
+    IMethods discard(IArguments params);
+    
+    IMethods discard(IClasses params);
+    
+    IMethods match(Object[] params);
+    
+    // deep scan
+    
+    IClasses returns();
+    
+    IClasses parent();
 
 }

+ 1 - 1
assira/src/main/java/net/ranides/assira/reflection/IVariables.java

@@ -12,6 +12,6 @@ import java.util.List;
  *
  * @author Ranides Atterwim <ranides@gmail.com>
  */
-public interface IVariables extends List<IVariable> {
+public interface IVariables extends IElements<IVariable> {
     
 }

+ 8 - 16
assira/src/main/java/net/ranides/assira/reflection/query/ClassInspector.java

@@ -4,7 +4,7 @@
  * @license WTFPL
  * @url http://ranides.net/projects/assira
  */
-package net.ranides.assira.reflection.query;
+package net.ranides.assira.reflection.impl;
 
 import net.ranides.assira.reflection.IClass;
 
@@ -12,25 +12,17 @@ import net.ranides.assira.reflection.IClass;
  *
  * @author Ranides Atterwim <ranides@gmail.com>
  */
-public class ClassInspector {
+public final class FClass {
     
-    /**
-     * Collect information using java.reflection API
-     * @param clazz
-     * @return 
-     */
-    public static IClass reflective(Class<?> clazz) {
-        throw new UnsupportedOperationException("Not supported yet.");
+    private FClass() {
+        /* utility class */
     }
     
-    /**
-     * Collect information using ASM bytecode analyzer
-     * @param clazz
-     * @return 
-     */
-    public static IClass asm(Class<?> clazz) {
+    public static IClass typeinfo(Class<?> method) {
         throw new UnsupportedOperationException("Not supported yet.");
     }
     
-    
+    public static IClass codeinfo(Class<?> method) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
 }

+ 29 - 0
assira/src/main/java/net/ranides/assira/reflection/impl/FField.java

@@ -0,0 +1,29 @@
+/*
+ * @author Ranides Atterwim <ranides@gmail.com>
+ * @copyright Ranides Atterwim
+ * @license WTFPL
+ * @url http://ranides.net/projects/assira
+ */
+package net.ranides.assira.reflection.impl;
+
+import java.lang.reflect.Field;
+import net.ranides.assira.reflection.IField;
+
+/**
+ *
+ * @author Ranides Atterwim <ranides@gmail.com>
+ */
+public final class FField {
+    
+    private FField() {
+        /* utility class */
+    }
+    
+    public static IField typeinfo(Field method) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+    
+    public static IField codeinfo(Field method) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+}

+ 6 - 8
assira/src/main/java/net/ranides/assira/reflection/query/MethodInspector.java

@@ -4,28 +4,27 @@
  * @license WTFPL
  * @url http://ranides.net/projects/assira
  */
-package net.ranides.assira.reflection.query;
+package net.ranides.assira.reflection.impl;
 
 import java.lang.reflect.Method;
 import java.util.Optional;
-import net.ranides.assira.reflection.impl.CPInspector;
 import net.ranides.assira.reflection.IMethod;
 
 /**
  *
  * @author Ranides Atterwim <ranides@gmail.com>
  */
-public final class MethodInspector {
+public final class FMethod {
     
-    private MethodInspector() {
+    private FMethod() {
         /* utility class */
     }
     
-    public static IMethod reflective(Method method) {
+    public static IMethod typeinfo(Method method) {
         throw new UnsupportedOperationException("Not supported yet.");
     }
     
-    public static IMethod asm(Method method) {
+    public static IMethod codeinfo(Method method) {
         throw new UnsupportedOperationException("Not supported yet.");
     }
     
@@ -67,7 +66,6 @@ public final class MethodInspector {
         if( !method.isPresent() ) {
             throw new IllegalArgumentException(type + " is not lambda");
         }
-        return reflective(method.get());
+        return codeinfo(method.get());
     }
-
 }