Skip to content

Commit

Permalink
add nested class support
Browse files Browse the repository at this point in the history
  • Loading branch information
bsorrentino committed Sep 4, 2017
1 parent 3e9dc26 commit 6bc64dd
Show file tree
Hide file tree
Showing 3 changed files with 116 additions and 57 deletions.
24 changes: 21 additions & 3 deletions processor/src/main/java/org/bsc/processor/TypescriptHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,32 @@

import java.beans.PropertyDescriptor;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.util.Arrays;
import java.util.function.Supplier;
import java.util.function.BiConsumer;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public interface TypescriptHelper {

/**
*
* @param accumulator
* @return
*/
static <T> Collector<T,StringBuffer,String> tokenizer( final BiConsumer<StringBuffer,T> accumulator) {
return Collector.of(
() -> new StringBuffer(),
accumulator,
(sb_left,sb_right) -> sb_left.append(sb_right),
(sb) -> {
int len = sb.length();
if( len > 0 ) sb.deleteCharAt( len-1 );
return sb.toString();
}
);

}

static boolean isPropertyValid( PropertyDescriptor pd ) {
return !( "class".equalsIgnoreCase(pd.getName()) );
}
Expand Down
129 changes: 84 additions & 45 deletions processor/src/main/java/org/bsc/processor/TypescriptProcessor.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import static org.bsc.processor.TypescriptHelper.getName;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.Closeable;
import java.io.Serializable;
Expand All @@ -22,6 +23,8 @@
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.UnaryOperator;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import javax.annotation.processing.SupportedAnnotationTypes;
Expand All @@ -36,6 +39,7 @@

import io.reactivex.Observable;

import static org.bsc.processor.TypescriptHelper.tokenizer;
/**
*
* @author bsoorentino
Expand Down Expand Up @@ -150,11 +154,6 @@ private String getPropertyDecl( Class<?> declaringClass, PropertyDescriptor pd,
.toString();
}


private String getMethodDecl( final Method m, java.util.Map<String, Class<?>> declaredClassMap ) {
return getMethodDecl( m, m.getDeclaringClass(), declaredClassMap);
}

private String getMethodDecl( final Method m, Class<?> declaringClass, java.util.Map<String, Class<?>> declaredClassMap ) {
final Class<?> returnType = m.getReturnType();

Expand All @@ -174,27 +173,24 @@ private String getMethodDecl( final Method m, Class<?> declaringClass, java.util
sb.append("( ");

final Parameter[] params = m.getParameters();

final Collector<Parameter,StringBuffer,String> c =
tokenizer( (sb_result, tp) -> sb_result
.append( tp.getName())
.append(':')
.append( convertJavaToTS(tp.getType(),declaringClass,declaredClassMap) )
.append(",") );

if( params.length > 0 ) {
Arrays.stream(params)
.forEach( (tp) ->
sb.append( tp.getName())
.append(':')
.append( convertJavaToTS(tp.getType(),declaringClass,declaredClassMap) )
.append(",")
);
sb.deleteCharAt( sb.length()-1 );
}

sb.append(" ):");
final String params_string = Arrays.stream(params).collect(c);

final String tsType = convertJavaToTS( returnType,
declaringClass,
declaredClassMap);


return sb.append(tsType)
.toString();
return sb.append(params_string)
.append(" ):")
.append(tsType)
.toString();

}

Expand All @@ -219,44 +215,80 @@ private Set<Method> getMethods( final Class<?> type) {

}

private BeanInfo getBeanInfo( final Class<?> type ) {
try {
return java.beans.Introspector.getBeanInfo(type);
} catch (IntrospectionException e) {
throw new Error(e);
}
}

private String processNestedClasses( Class<?> type, java.util.Map<String, Class<?>> declaredClassMap ) {

final Class<?> nestedClasses[] = type.getClasses();

if( nestedClasses.length == 0 ) return "";

final StringBuilder sb = new StringBuilder();

sb.append( "export module " )
.append(type.getSimpleName())
.append(" {\n\n")
;

Arrays.stream(nestedClasses)
.map( this::getBeanInfo )
.map( (beanInfo) -> processClass(beanInfo, declaredClassMap) )
.forEach( (decl) -> sb.append('\t').append(decl) );

return sb.append("\n} // end module ")
.append(type.getSimpleName())
.append('\n')
.toString()
;
}

private String processClass( BeanInfo bi, java.util.Map<String, Class<?>> declaredClassMap ) {

final Class<?> type = bi.getBeanDescriptor().getBeanClass();

final StringBuilder sb = new StringBuilder();

final PropertyDescriptor[] pds = bi.getPropertyDescriptors();
final java.util.Set<String> propertySet =
new java.util.LinkedHashSet<>(pds.length);

Arrays.stream(pds)
final java.util.Set<String> propertySet =
Arrays.stream(pds)
.filter( TypescriptHelper::isPropertyValid )
.forEach( (pd) -> propertySet.add( getPropertyDecl( type, pd, declaredClassMap) ) );

final java.util.Set<String> methodSet =
new java.util.LinkedHashSet<>(/*methods.length*/);
.map( (pd) -> getPropertyDecl( type, pd, declaredClassMap) )
.collect( Collectors.toCollection(() -> new java.util.LinkedHashSet<String>(pds.length) ))
;

getMethods( type )
.stream()
.filter( (md) -> { // Remove setter and getter
return !Arrays.asList(pds).stream().anyMatch( (pd) -> {
final Method rm = pd.getReadMethod();
final Method wm = pd.getWriteMethod();
return (md.equals(rm) || md.equals(wm));
});
})
.filter( (md) -> !md.getName().contains("$") ) // remove unnamed
.forEach((md) -> methodSet.add( getMethodDecl(md, type, declaredClassMap) ) );
final java.util.Set<String> methodSet =
getMethods( type )
.stream()
.filter( (md) -> { // Remove setter and getter
return !Arrays.asList(pds).stream().anyMatch( (pd) -> {
final Method rm = pd.getReadMethod();
final Method wm = pd.getWriteMethod();
return (md.equals(rm) || md.equals(wm));
});
})
.filter( (md) -> !md.getName().contains("$") ) // remove unnamed
.map( (md) -> getMethodDecl(md, type, declaredClassMap) )
.collect( Collectors.toCollection(() -> new java.util.LinkedHashSet<String>() ))
;

sb.append( "declare namespace " )
.append(type.getPackage().getName())
.append(" {\n\n")
;
final String namespace = type.getPackage().getName();

if( !type.isMemberClass() )
sb.append( "declare namespace " )
.append(namespace)
.append(" {\n\n")
;

sb.append( getClassDecl(type, declaredClassMap) )
.append("\n\n");


propertySet.stream().sorted().forEach((decl) -> {
sb.append( '\t' )
.append(decl)
Expand All @@ -270,9 +302,16 @@ private String processClass( BeanInfo bi, java.util.Map<String, Class<?>> decla

});

sb.append("\n}\n")
.append("\n}\n");
sb.append("\n} \n");

// NESTED CLASSES
sb.append( processNestedClasses(type, declaredClassMap) );

if( !type.isMemberClass() )
sb.append("\n} // end namespace ")
.append( namespace )
.append('\n');

return sb.toString();

}
Expand Down
20 changes: 11 additions & 9 deletions processor/src/main/resources/header.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ declare namespace java.lang {
interface Class<T> {}
interface AutoCloseable {}
interface Cloneable {}

interface Comparable<T> {

compareTo?( arg0:T ):number;
Expand All @@ -90,15 +91,16 @@ declare namespace java.io {

declare namespace java.util.stream {

interface StreamInitializer<T>{
//builder?( ):any /* java.util.stream.Stream$Builder */;
concat?( arg0:Stream<T>,arg1:Stream<T> ):Stream<T>;
empty?( ):Stream<T>;
generate?( arg0:any /* java.util.function.Supplier */ ):Stream<T>;
iterate?( arg0:java.lang.Object,arg1:any /* java.util.function.UnaryOperator */ ):Stream<T>;
of?( arg0:[any] /* [Ljava.lang.Object; */ ):Stream<T>;
of?( arg0:java.lang.Object ):Stream<T>;
interface StreamConstructor{
builder<T>( ):Stream.Builder<T>;
concat<T>( arg0:Stream<T>,arg1:Stream<T> ):Stream<T>;
empty<T>( ):Stream<T>;
generate<T>( arg0:any /* java.util.function.Supplier */ ):Stream<T>;
iterate<T>( seed:T,arg1:any /* java.util.function.UnaryOperator */ ):Stream<T>;
of<T>( arg0:Array<T> /* [Ljava.lang.Object; */ ):Stream<T>;
of<T>( arg0:T ):Stream<T>;

}


export const Stream : java.util.stream.StreamConstructor;
}

0 comments on commit 6bc64dd

Please sign in to comment.