Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
bsorrentino committed Aug 29, 2017
1 parent f90898d commit 3e9dc26
Show file tree
Hide file tree
Showing 9 changed files with 185 additions and 97 deletions.
32 changes: 17 additions & 15 deletions processor/src/main/java/org/bsc/processor/TypescriptHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,45 +35,46 @@ static String getClassDecl( Class<?> type,
Class<?>> declaredClassMap )
{

final StringBuilder sb = new StringBuilder();
final StringBuilder statement = new StringBuilder();

if( type.isInterface() ) {

sb.append( "interface ")
statement.append( "interface ")
.append( getSimpleName(type) )
.append( "/*") // COMMENT INHERITED
;

}
else {

sb.append( "class ")
statement.append( "class ")
.append( getSimpleName(type) )
.append( "/*") // COMMENT INHERITED
;


final Class<?> inherited = type.getSuperclass();

if( isSuperclassValid(inherited) ) {
sb.append( " extends ")
statement.append( " extends ")
.append( getName(inherited, type) )
;
}
}

final Class<?>[] inherited = type.getInterfaces();

final Supplier<Stream<Class<?>>> s = () ->
Arrays.asList(inherited)
.stream()
//.filter( TypescriptHelper::isInterfaceValid )
;
if(inherited.length > 0 ) {
statement.append( (type.isInterface()) ? " extends " : " implements ");
Arrays.stream(inherited).forEach( (c) -> statement.append( getName(c,type) ).append(","));

if( s.get().count() > 0 ) {
sb.append( (type.isInterface()) ? " extends " : " implements ");
s.get().forEach( (c) -> sb.append( getName(c,type) ).append(","));
sb.deleteCharAt( sb.length()-1 );
statement.deleteCharAt( statement.length()-1 );
}


return sb.append( " {").toString();
return statement.append("*/").append( " {").toString();

}

Expand Down Expand Up @@ -140,10 +141,11 @@ static String getName( Class<?> type, Class<?> declaringClass ) {
final java.util.List<String> parameters =
dc_parameters_list.size() == type_parameters_list.size() ? dc_parameters_list : type_parameters_list ;

boolean isFunctionaInterface = ( type.isInterface() && type.isAnnotationPresent(FunctionalInterface.class));

return new StringBuilder()
.append(
type.getPackage().equals(currentNS) ?
type.getPackage().equals(currentNS) || isFunctionaInterface ?
type.getSimpleName() :
type.getName()
)
Expand Down
120 changes: 54 additions & 66 deletions processor/src/main/java/org/bsc/processor/TypescriptProcessor.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,14 @@
import java.lang.reflect.Type;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.RandomAccess;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.UnaryOperator;
import java.util.stream.Stream;

import javax.annotation.processing.SupportedAnnotationTypes;
import javax.annotation.processing.SupportedOptions;
Expand Down Expand Up @@ -49,7 +55,11 @@ public class TypescriptProcessor extends AbstractProcessorEx {
AutoCloseable.class,
Comparable.class,
Cloneable.class,
RandomAccess.class
RandomAccess.class,
Consumer.class,
UnaryOperator.class,
Predicate.class,
Runnable.class
);

/**
Expand Down Expand Up @@ -81,12 +91,13 @@ public boolean process( Context processingContext ) throws Exception {
declaredClasses.values().toArray( new Class[ declaredClasses.size() ]));

// PREDEFINED CLASS
PREDEFINED_CLASSES.forEach( (clazz) -> {
PREDEFINED_CLASSES
.forEach( (clazz) -> {
declaredClasses.put( clazz.getName(), clazz);
});

return Observable.fromIterable(classes)
.filter( (clazz) -> !PREDEFINED_CLASSES.contains(clazz))
.filter( (clazz) -> !PREDEFINED_CLASSES.contains(clazz) )
.map( (clazz) -> processClass(java.beans.Introspector.getBeanInfo(clazz), declaredClasses));
})
.doOnComplete( () -> w.close() )
Expand All @@ -111,7 +122,7 @@ private String getPropertyDecl( Class<?> declaringClass, PropertyDescriptor pd,

final String typeName = pClass.getTypeName();

try {
try {
final String name = getName( pClass, pd.getPropertyType());

final String r = rType.getTypeName()
Expand Down Expand Up @@ -141,21 +152,25 @@ private String getPropertyDecl( Class<?> declaringClass, PropertyDescriptor pd,


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();

final StringBuilder sb = new StringBuilder();

if( Modifier.isStatic(m.getModifiers()) ) {

if( m.getDeclaringClass().isInterface() ) {
if( declaringClass.isInterface() ) {
sb.append( "// ");
}
sb.append("static ");

}

sb.append(m.getName());
if( m.getDeclaringClass().isInterface()) sb.append('?');
//if( m.getDeclaringClass().isInterface()) sb.append('?');
sb.append("( ");

final Parameter[] params = m.getParameters();
Expand All @@ -165,60 +180,44 @@ private String getMethodDecl( final Method m, java.util.Map<String, Class<?>> de
.forEach( (tp) ->
sb.append( tp.getName())
.append(':')
.append( convertJavaToTS(tp.getType(),m.getDeclaringClass(),declaredClassMap) )
.append( convertJavaToTS(tp.getType(),declaringClass,declaredClassMap) )
.append(",")
);
sb.deleteCharAt( sb.length()-1 );
}

sb.append(" ):");

/*
// Check if there is a paramized type
final Type rType = m.getGenericReturnType();
if( rType instanceof ParameterizedType ) {
final Type pClass = ((ParameterizedType)rType).getActualTypeArguments()[0];
final String typeName = pClass.getTypeName();
info( "getMethodDecl: [%s] [%s] [%s] - j2ts [%s]", m.getName(), typeName, rType.getTypeName() );
String r;
try {
final String name = getName(pClass, m.getDeclaringClass());
r = rType.getTypeName().replaceAll(typeName, name);
} catch (ClassNotFoundException e) {
warn("getMethodDecl: type [%s] not found!", typeName);
r = rType.getTypeName().replace(format("<%s>", typeName), "<any>");
final String tsType = convertJavaToTS( returnType,
declaringClass,
declaredClassMap);


return sb.append(tsType)
.toString();

}

private Set<Method> getMethods( final Class<?> type) {
final Predicate<Method> include = m ->
!m.isBridge() &&
!m.isSynthetic() &&
Character.isJavaIdentifierStart(m.getName().charAt(0)) &&
m.getName().chars().skip(1).allMatch(Character::isJavaIdentifierPart);

final Set<Method> methods = new LinkedHashSet<>();

Stream.of(type.getMethods())
.filter(include)
.forEach(methods::add);

}
info("getMethodDecl: result: [%s]", r);
Stream.of(type.getDeclaredMethods())
.filter(include)
.forEach(methods::add);

return sb.append( r )
.toString();
}
*/

final String tsType = convertJavaToTS( returnType,
m.getDeclaringClass(),
declaredClassMap);
return methods;


return sb.append(tsType)
.toString();

}


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

Expand All @@ -233,12 +232,11 @@ private String processClass( BeanInfo bi, java.util.Map<String, Class<?>> decla
Arrays.stream(pds)
.filter( TypescriptHelper::isPropertyValid )
.forEach( (pd) -> propertySet.add( getPropertyDecl( type, pd, declaredClassMap) ) );

final Method[] methods = type.getDeclaredMethods();

final java.util.Set<String> methodSet =
new java.util.LinkedHashSet<>(methods.length);

Arrays.asList(methods)
new java.util.LinkedHashSet<>(/*methods.length*/);
getMethods( type )
.stream()
.filter( (md) -> { // Remove setter and getter
return !Arrays.asList(pds).stream().anyMatch( (pd) -> {
Expand All @@ -247,10 +245,8 @@ private String processClass( BeanInfo bi, java.util.Map<String, Class<?>> decla
return (md.equals(rm) || md.equals(wm));
});
})
.filter( (md) -> { // Remove unnamed
return !md.getName().contains("$");
})
.forEach((md) -> methodSet.add( getMethodDecl(md, declaredClassMap) ) );
.filter( (md) -> !md.getName().contains("$") ) // remove unnamed
.forEach((md) -> methodSet.add( getMethodDecl(md, type, declaredClassMap) ) );

sb.append( "declare namespace " )
.append(type.getPackage().getName())
Expand All @@ -276,15 +272,7 @@ private String processClass( BeanInfo bi, java.util.Map<String, Class<?>> decla

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

/*
Arrays.asList(t.$0.getMethodDescriptors()).stream().forEach( (md) -> {
final Class<?> returnType = md.getMethod().getReturnType();
info( String.format( "\t%s", getMethodDecl(md.getMethod(), t.$1)) );

});
*/
return sb.toString();

}
Expand Down
55 changes: 54 additions & 1 deletion processor/src/main/resources/header.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,65 @@ type long = number;
type float = number;
type double = number;
type byte = number;
type char = number;
type char = string;


type chararray = [byte];
type bytearray = [char];

// Nashorn
declare function print( ...args: any[]):void

type Runnable = () => void;

interface Consumer<T> /*extends Function*/ {
andThen?( arg0:Consumer<T> ):Consumer<T>;
( v:T ):void; //accept(t:T):void
}

interface ConsumerConstructor {
new<T>( args: T): Consumer<T>;
<T>( args: T): Consumer<T>;
readonly prototype: Function;
}

declare const Consumer : ConsumerConstructor;

interface UnaryOperator<T>/* extends Function<T,any>*/ {

andThen?( arg0:any /* java.util.function.Function */ ):any /* java.util.function.Function */;
compose?( arg0:any /* java.util.function.Function */ ):any /* java.util.function.Function */;
( v:T ):T //apply(t:T):T

}

interface UnaryOperatorConstructor {
new<T>( args: T): UnaryOperator<T>;
<T>( args: T): UnaryOperator<T>;
/*static */identity<T>( ):UnaryOperator<T>;
readonly prototype: Function;
}

declare const UnaryOperator : UnaryOperatorConstructor;

interface Predicate<T>/**/ {

and?( arg0:Predicate<T> ):Predicate<T>;
negate?():Predicate<T>;
or?( arg0:Predicate<T> ):Predicate<T>;
( v:T ):boolean //test( arg0:T /* java.lang.Object */ ):boolean;

}

interface PredicateConstructor/**/ {
new<T>( args: T): UnaryOperator<T>;
<T>( args: T): UnaryOperator<T>;

/*static*/ isEqual<T>( arg0:any /* java.lang.Object */ ):Predicate<T>;

}

declare const Predicate : PredicateConstructor;

declare namespace java.lang {

Expand Down
3 changes: 3 additions & 0 deletions test/.vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"java.configuration.updateBuildConfiguration": "interactive"
}
6 changes: 6 additions & 0 deletions test/main.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@

load( "target/jvm-npm.js");

require.paths = [ "target" ];

load( "target/test.js");
Loading

0 comments on commit 3e9dc26

Please sign in to comment.