Skip to content
Snippets Groups Projects
Commit c77b7280 authored by piotr.kupczyk@id.ethz.ch's avatar piotr.kupczyk@id.ethz.ch
Browse files

BIS-757 : Write Translator to TypeScript - correct generics on classes and constructors

parent 422d096e
No related branches found
No related tags found
1 merge request!40SSDM-13578 : 2PT : Database and V3 Implementation - include the new AFS "free"...
...@@ -70,8 +70,10 @@ generateTypeScript { ...@@ -70,8 +70,10 @@ generateTypeScript {
"ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SampleIdDeserializer", "ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SampleIdDeserializer",
"ch.ethz.sis.openbis.generic.asapi.v3.dto.common.property.PropertiesDeserializer"] "ch.ethz.sis.openbis.generic.asapi.v3.dto.common.property.PropertiesDeserializer"]
mapClasses = "asInterfaces" mapClasses = "asInterfaces"
importDeclarations = ["export default openbis"]
outputKind = 'module' outputKind = 'module'
outputFileType = 'declarationFile' outputFileType = 'declarationFile'
namespace = 'openbis'
customTypeNaming = [ customTypeNaming = [
"ch.ethz.sis.openbis.generic.OpenBIS:facade", "ch.ethz.sis.openbis.generic.OpenBIS:facade",
"ch.ethz.sis.openbis.generic.asapi.v3.dto.pat.search.PersonalAccessTokenSessionNameSearchCriteria:PersonalAccessTokenSessionNameSearchCriteria", "ch.ethz.sis.openbis.generic.asapi.v3.dto.pat.search.PersonalAccessTokenSessionNameSearchCriteria:PersonalAccessTokenSessionNameSearchCriteria",
......
...@@ -24,7 +24,7 @@ dtos ...@@ -24,7 +24,7 @@ dtos
console.log("import stjs from '../../src/v3/lib/stjs/js/stjs'") console.log("import stjs from '../../src/v3/lib/stjs/js/stjs'")
console.log("import underscore from '../../src/v3/lib/underscore/js/underscore'") console.log("import underscore from '../../src/v3/lib/underscore/js/underscore'")
console.log("import openbis from '../../src/v3/openbis'") console.log("import facade from '../../src/v3/openbis'")
// use bundled DTOs when parsing JSON responses (i.e. overwrite the default Json.requireFn - it would load DTOs from the server using RequireJS) // use bundled DTOs when parsing JSON responses (i.e. overwrite the default Json.requireFn - it would load DTOs from the server using RequireJS)
...@@ -62,7 +62,7 @@ console.log('\nstjs._ = underscore') ...@@ -62,7 +62,7 @@ console.log('\nstjs._ = underscore')
// This way any DTOs with duplicated simple names can still be accessed via their full names. // This way any DTOs with duplicated simple names can still be accessed via their full names.
var exported = { var exported = {
"openbis" : "$$openbis$$", "facade" : "$$facade$$",
"noConflict" : "$$noConflict$$" "noConflict" : "$$noConflict$$"
} }
......
...@@ -37,6 +37,7 @@ import java.lang.reflect.Constructor; ...@@ -37,6 +37,7 @@ import java.lang.reflect.Constructor;
import java.lang.reflect.Executable; import java.lang.reflect.Executable;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
...@@ -150,6 +151,34 @@ public class AddMethodsExtension extends Extension ...@@ -150,6 +151,34 @@ public class AddMethodsExtension extends Extension
return tsType; return tsType;
} }
private static List<TsType.GenericVariableType> resolveTypeParameters(TsBeanModel bean, TsModel model, ProcessingContext processingContext, boolean withBounds){
TypeVariable<? extends Class<?>>[] typeParameters = bean.getOrigin().getTypeParameters();
return Arrays.stream(typeParameters).map(t ->
{
Type[] boundsTypes = t.getBounds();
if (withBounds && boundsTypes.length > 0)
{
try
{
List<String> boundsStrings = new ArrayList<>();
for (Type boundType : boundsTypes)
{
TsType tsBoundType = resolveGenericType(bean.getOrigin(), boundType, model, processingContext);
boundsStrings.add(tsBoundType.toString());
}
return new TsType.GenericVariableType(t.getName() + " extends " + boundsStrings.get(0));
} catch (UnresolvedTypeException e)
{
return new TsType.GenericVariableType(t.getName());
}
} else
{
return new TsType.GenericVariableType(t.getName());
}
}).collect(Collectors.toList());
}
private static TsType getReturnType(TsBeanModel bean, Method method, TsModel model, ProcessingContext processingContext) private static TsType getReturnType(TsBeanModel bean, Method method, TsModel model, ProcessingContext processingContext)
{ {
return resolveGenericType(bean.getOrigin(), method.getGenericReturnType(), model, processingContext); return resolveGenericType(bean.getOrigin(), method.getGenericReturnType(), model, processingContext);
...@@ -229,13 +258,17 @@ public class AddMethodsExtension extends Extension ...@@ -229,13 +258,17 @@ public class AddMethodsExtension extends Extension
List<TsParameterModel> paramsModel = List<TsParameterModel> paramsModel =
paramsWithoutDeclaringClass.stream().map(param -> new TsParameterModel(param.name, param.getTsType())).collect(Collectors.toList()); paramsWithoutDeclaringClass.stream().map(param -> new TsParameterModel(param.name, param.getTsType())).collect(Collectors.toList());
TsType returnType = null; TsType returnType = null;
if (beanModel.getTypeParameters() != null && !beanModel.getTypeParameters().isEmpty())
List<TsType.GenericVariableType> typeParameters = resolveTypeParameters(beanModel, model, processingContext, false);
if (!typeParameters.isEmpty())
{ {
returnType = new TsType.GenericReferenceType(beanModel.getName(), beanModel.getTypeParameters()); returnType = new TsType.GenericReferenceType(beanModel.getName(), typeParameters);
} else } else
{ {
returnType = new TsType.ReferenceType(beanModel.getName()); returnType = new TsType.ReferenceType(beanModel.getName());
} }
logger.info(String.format("Processing constructor %s, with params %s and return type %s", constructor, params, returnType)); logger.info(String.format("Processing constructor %s, with params %s and return type %s", constructor, params, returnType));
return new TsMethodModel("new ", TsModifierFlags.None, beanModel.getTypeParameters(), paramsModel, returnType, null, null); return new TsMethodModel("new ", TsModifierFlags.None, beanModel.getTypeParameters(), paramsModel, returnType, null, null);
} }
...@@ -303,7 +336,16 @@ public class AddMethodsExtension extends Extension ...@@ -303,7 +336,16 @@ public class AddMethodsExtension extends Extension
TypeProcessor localProcessor = new DefaultTypeProcessor(); TypeProcessor localProcessor = new DefaultTypeProcessor();
ProcessingContext processingContext = new ProcessingContext(context.getSymbolTable(), localProcessor); ProcessingContext processingContext = new ProcessingContext(context.getSymbolTable(), localProcessor);
//Add table of mapped types //Add table of mapped types
Stream<TsBeanModel> processedBeans = model.getBeans().stream().map(bean ->
List<TsBeanModel> processedBeans = model.getBeans().stream().map(bean ->
{
List<TsType.GenericVariableType> tsTypeParameters = resolveTypeParameters(bean, model, processingContext, true);
return new TsBeanModel(bean.getOrigin(), bean.getCategory(), bean.isClass(), bean.getName(), tsTypeParameters,
bean.getParent(), bean.getExtendsList(), bean.getImplementsList(), bean.getProperties(), bean.getConstructor(),
bean.getMethods(), bean.getComments());
}).collect(Collectors.toList());
processedBeans = processedBeans.stream().map(bean ->
{ {
if (asnycClasses.contains(bean.getOrigin().getName())) if (asnycClasses.contains(bean.getOrigin().getName()))
{ {
...@@ -312,7 +354,7 @@ public class AddMethodsExtension extends Extension ...@@ -312,7 +354,7 @@ public class AddMethodsExtension extends Extension
{ {
return addFunctions(bean, model, processingContext, AddMethodsExtension::makeFunction); return addFunctions(bean, model, processingContext, AddMethodsExtension::makeFunction);
} }
}); }).collect(Collectors.toList());
List<TsBeanModel> processedBeansWithSeparatedConstructors = new LinkedList<>(); List<TsBeanModel> processedBeansWithSeparatedConstructors = new LinkedList<>();
...@@ -331,16 +373,13 @@ public class AddMethodsExtension extends Extension ...@@ -331,16 +373,13 @@ public class AddMethodsExtension extends Extension
Collections.emptyList(), null, Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), null, Collections.emptyList(), null, Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), null,
constructors, Collections.emptyList()); constructors, Collections.emptyList());
processedBeansWithSeparatedConstructors.add(constructorBean); processedBeansWithSeparatedConstructors.add(constructorBean);
TsBeanModel beanWithoutConstructors =
new TsBeanModel(bean.getOrigin(), bean.getCategory(), bean.isClass(), bean.getName(), bean.getTypeParameters(),
bean.getParent(), bean.getExtendsList(), bean.getImplementsList(), bean.getProperties(), bean.getConstructor(),
regularMethods, bean.getComments());
processedBeansWithSeparatedConstructors.add(beanWithoutConstructors);
} else
{
processedBeansWithSeparatedConstructors.add(bean);
} }
TsBeanModel beanWithoutConstructors =
new TsBeanModel(bean.getOrigin(), bean.getCategory(), bean.isClass(), bean.getName(), bean.getTypeParameters(),
bean.getParent(), bean.getExtendsList(), bean.getImplementsList(), bean.getProperties(), bean.getConstructor(),
regularMethods, bean.getComments());
processedBeansWithSeparatedConstructors.add(beanWithoutConstructors);
}); });
return model.withBeans(processedBeansWithSeparatedConstructors); return model.withBeans(processedBeansWithSeparatedConstructors);
......
...@@ -55,22 +55,14 @@ public class AddOpenBISModuleExtension extends Extension ...@@ -55,22 +55,14 @@ public class AddOpenBISModuleExtension extends Extension
{ {
properties.add(new TsPropertyModel(bean.getName().getSimpleName(), properties.add(new TsPropertyModel(bean.getName().getSimpleName(),
new TsType.ReferenceType(new Symbol(bean.getName().getSimpleName() + "Constructor")), null, true, null)); new TsType.ReferenceType(new Symbol(bean.getName().getSimpleName() + "Constructor")), null, true, null));
} else
{
properties.add(
new TsPropertyModel(bean.getName().getSimpleName(), new TsType.ReferenceType(bean.getName()), null, true, null));
} }
} }
} }
beans.add(new TsBeanModel(null, TsBeanCategory.Data, false, new Symbol("openbis"), null, null, null, null, properties, null, null, null)); beans.add(new TsBeanModel(null, TsBeanCategory.Data, false, new Symbol("bundle"), null, null, null, null, properties, null, null, null));
return model.withBeans(beans); return model.withBeans(beans);
})); }));
} }
@Override public void emitElements(final Writer writer, final Settings settings, final boolean exportKeyword, final TsModel model)
{
writer.writeIndentedLine("export default openbis");
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment