package cz.habarta.typescript.generator; import cz.habarta.typescript.generator.compiler.SymbolTable; import cz.habarta.typescript.generator.compiler.Symbol; import java.lang.reflect.Type; import java.util.*; public interface TypeProcessor { /** * @return <code>null</code> if this processor didn't process passed java type */ public Result processType(Type javaType, Context context); public static class Context { private final SymbolTable symbolTable; private final TypeProcessor typeProcessor; public Context(SymbolTable symbolTable, TypeProcessor typeProcessor) { this.symbolTable = symbolTable; this.typeProcessor = typeProcessor; } public Symbol getSymbol(Class<?> cls) { return symbolTable.getSymbol(cls); } public Result processType(Type javaType) { return typeProcessor.processType(javaType, this); } } public static class Result { private final TsType tsType; private final List<Class<?>> discoveredClasses; public Result(TsType tsType, List<Class<?>> discoveredClasses) { this.tsType = tsType; this.discoveredClasses = discoveredClasses; } public Result(TsType tsType, Class<?>... discoveredClasses) { this.tsType = tsType; this.discoveredClasses = Arrays.asList(discoveredClasses); } public TsType getTsType() { return tsType; } public List<Class<?>> getDiscoveredClasses() { return discoveredClasses; } } public static class Chain implements TypeProcessor { private final List<TypeProcessor> processors; public Chain(List<TypeProcessor> processors) { this.processors = processors; } public Chain(TypeProcessor... processors) { this.processors = Arrays.asList(processors); } @Override public Result processType(Type javaType, Context context) { for (TypeProcessor processor : processors) { final Result result = processor.processType(javaType, context); if (result != null) { return result; } } return null; } } }