All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.snapscript.core.type.index.MethodIndexer Maven / Gradle / Ivy

package org.snapscript.core.type.index;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import org.snapscript.core.ModifierType;
import org.snapscript.core.type.Type;
import org.snapscript.core.annotation.Annotation;
import org.snapscript.core.annotation.AnnotationExtractor;
import org.snapscript.core.function.Function;
import org.snapscript.core.platform.PlatformProvider;
import org.snapscript.core.type.extend.ClassExtender;

public class MethodIndexer {
   
   private final AnnotationExtractor extractor;
   private final FunctionGenerator generator;
   private final ConstructorIndexer indexer;
   private final ModifierConverter converter;
   private final ClassExtender extender;
   
   public MethodIndexer(ClassExtender extender, PlatformProvider provider){
      this.indexer = new ConstructorIndexer(provider);
      this.generator = new FunctionGenerator(provider);
      this.extractor = new AnnotationExtractor();
      this.converter = new ModifierConverter();
      this.extender = extender;
   }

   public List index(Type type) throws Exception {
      List functions = new ArrayList();
      
      if(type != null) {
         Class source = type.getType();
         List extensions = extender.extend(source);
         List constructors = indexer.index(type);
         Method[] methods = source.getDeclaredMethods();
         
         functions.addAll(constructors);
         functions.addAll(extensions);
         
         for(Method method : methods){
            int modifiers = converter.convert(method);
            
            if(ModifierType.isPublic(modifiers) || ModifierType.isProtected(modifiers)) {
               String name = method.getName();
               Function function = generator.generate(type, method, name, modifiers);
               List extracted = extractor.extract(method);
               List actual = function.getAnnotations();
               
               functions.add(function);
               actual.addAll(extracted);
            }
         }
      }
      return functions;
   }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy