use of cz.habarta.typescript.generator.emitter.TsExpression in project typescript-generator by vojtechhabarta.
the class RequiredPropertyConstructorExtension method createConstructor.
private static Optional<TsConstructorModel> createConstructor(TsBeanModel bean, TsModel model, Map<String, TsConstructorModel> generatedConstructors) {
List<TsParameterModel> parameters = new ArrayList<>();
List<TsParameterModel> optionalParameters = new ArrayList<>();
List<TsStatement> body = new ArrayList<>();
TsType parent = bean.getParent();
if (parent != null) {
if (!(parent instanceof TsType.ReferenceType)) {
throw new IllegalStateException("Generating constructor for non-reference parent types is not currently supported");
}
TsType.ReferenceType referenceParent = (TsType.ReferenceType) parent;
TsConstructorModel parentConstructor = generatedConstructors.get(referenceParent.symbol.getFullName());
if (parentConstructor == null) {
throw new IllegalStateException("Generating constructor for class with non-generated constructor is not currently supported");
}
List<TsParameterModel> parentParameters = parentConstructor.getParameters();
TsIdentifierReference[] callParameters = new TsIdentifierReference[parentParameters.size()];
int i = 0;
for (TsParameterModel parentParameter : parentParameters) {
List<TsParameterModel> targetParameterList = parentParameter.tsType instanceof TsType.OptionalType ? optionalParameters : parameters;
targetParameterList.add(parentParameter);
callParameters[i] = new TsIdentifierReference(parentParameter.name);
i++;
}
body.add(new TsExpressionStatement(new TsCallExpression(new TsSuperExpression(), callParameters)));
}
for (TsPropertyModel property : bean.getProperties()) {
if (!property.modifiers.isReadonly) {
continue;
}
TsExpression assignmentExpression;
Optional<TsExpression> predefinedValue = getPredefinedValueForProperty(property, model);
if (predefinedValue.isPresent()) {
assignmentExpression = predefinedValue.get();
} else {
TsParameterModel parameter = new TsParameterModel(property.name, property.tsType);
List<TsParameterModel> targetParameterList = property.tsType instanceof TsType.OptionalType ? optionalParameters : parameters;
targetParameterList.add(parameter);
assignmentExpression = new TsIdentifierReference(property.name);
}
TsMemberExpression leftHandSideExpression = new TsMemberExpression(new TsThisExpression(), property.name);
TsExpression assignment = new TsAssignmentExpression(leftHandSideExpression, assignmentExpression);
TsExpressionStatement assignmentStatement = new TsExpressionStatement(assignment);
body.add(assignmentStatement);
}
parameters.addAll(optionalParameters);
if (parameters.isEmpty() && body.isEmpty()) {
return Optional.empty();
}
TsConstructorModel constructor = new TsConstructorModel(TsModifierFlags.None, parameters, body, null);
return Optional.of(constructor);
}
use of cz.habarta.typescript.generator.emitter.TsExpression in project typescript-generator by vojtechhabarta.
the class JsonDeserializationExtension method createDeserializationGenericFunctionConstructor.
private static TsMethodModel createDeserializationGenericFunctionConstructor(SymbolTable symbolTable, TsModel tsModel, TsBeanModel bean) {
final Symbol beanIdentifier = symbolTable.getSymbol(bean.getOrigin());
List<TsType.GenericVariableType> typeParameters = getTypeParameters(bean.getOrigin());
final TsType.ReferenceType dataType = new TsType.GenericReferenceType(beanIdentifier, typeParameters);
final List<TsParameterModel> constructorFnOfParameters = getConstructorFnOfParameters(typeParameters);
final List<TsExpression> arguments = new ArrayList<>();
arguments.add(new TsIdentifierReference("data"));
for (TsParameterModel constructorFnOfParameter : constructorFnOfParameters) {
arguments.add(new TsIdentifierReference(constructorFnOfParameter.name));
}
final List<TsStatement> body = new ArrayList<>();
body.add(new TsReturnStatement(new TsArrowFunction(Arrays.asList(new TsParameter("data", null)), new TsCallExpression(new TsMemberExpression(new TsTypeReferenceExpression(new TsType.ReferenceType(beanIdentifier)), "fromData"), null, arguments))));
return new TsMethodModel("fromDataFn", TsModifierFlags.None.setStatic(), typeParameters, constructorFnOfParameters, new TsType.FunctionType(Arrays.asList(new TsParameter("data", dataType)), dataType), body, null);
}
use of cz.habarta.typescript.generator.emitter.TsExpression in project typescript-generator by vojtechhabarta.
the class JsonDeserializationExtension method getCopyFunctionForTsType.
private static TsExpression getCopyFunctionForTsType(SymbolTable symbolTable, TsModel tsModel, TsType tsType) {
if (tsType instanceof TsType.GenericReferenceType) {
final TsType.GenericReferenceType genericReferenceType = (TsType.GenericReferenceType) tsType;
// Class.fromDataFn<T1...>(constructorFnOfT1...)
final List<TsExpression> arguments = new ArrayList<>();
for (TsType typeArgument : genericReferenceType.typeArguments) {
arguments.add(getCopyFunctionForTsType(symbolTable, tsModel, typeArgument));
}
return new TsCallExpression(new TsMemberExpression(new TsTypeReferenceExpression(new TsType.ReferenceType(genericReferenceType.symbol)), "fromDataFn"), genericReferenceType.typeArguments, arguments);
}
if (tsType instanceof TsType.ReferenceType) {
final TsType.ReferenceType referenceType = (TsType.ReferenceType) tsType;
final TsBeanModel referencedBean = tsModel.getBean(symbolTable.getSymbolClass(referenceType.symbol));
if (referencedBean != null && referencedBean.isClass()) {
if (referencedBean.getTaggedUnionAlias() != null) {
// Class.fromDataUnion (tagged union)
return new TsMemberExpression(new TsTypeReferenceExpression(new TsType.ReferenceType(referencedBean.getName())), "fromDataUnion");
} else {
// Class.fromData
return new TsMemberExpression(new TsTypeReferenceExpression(referenceType), "fromData");
}
}
}
if (tsType instanceof TsType.BasicArrayType) {
// __getCopyArrayFn
final TsType.BasicArrayType arrayType = (TsType.BasicArrayType) tsType;
return new TsCallExpression(new TsIdentifierReference("__getCopyArrayFn"), getCopyFunctionForTsType(symbolTable, tsModel, arrayType.elementType));
}
if (tsType instanceof TsType.IndexedArrayType) {
// __getCopyObjectFn
final TsType.IndexedArrayType objectType = (TsType.IndexedArrayType) tsType;
return new TsCallExpression(new TsIdentifierReference("__getCopyObjectFn"), getCopyFunctionForTsType(symbolTable, tsModel, objectType.elementType));
}
if (tsType instanceof TsType.GenericVariableType) {
// constructorFnOfT
final TsType.GenericVariableType genericVariableType = (TsType.GenericVariableType) tsType;
return new TsIdentifierReference("constructorFnOf" + genericVariableType.name);
}
// __identity
return new TsCallExpression(new TsIdentifierReference("__identity"), Arrays.asList(tsType), Collections.<TsExpression>emptyList());
}
use of cz.habarta.typescript.generator.emitter.TsExpression in project typescript-generator by vojtechhabarta.
the class OnePossiblePropertyValueAssigningExtension method findOnlyValueForEnumReferenceType.
private static Optional<TsExpression> findOnlyValueForEnumReferenceType(TsModel model, TsType.EnumReferenceType propertyType) {
Symbol symbol = propertyType.symbol;
Optional<TsEnumModel> enumModelOption = model.getOriginalStringEnums().stream().filter(candidate -> candidate.getName().getFullName().equals(symbol.getFullName())).findAny();
if (!enumModelOption.isPresent()) {
return Optional.empty();
}
TsEnumModel enumModel = enumModelOption.get();
if (enumModel.getMembers().size() != 1) {
return Optional.empty();
}
EnumMemberModel singleElement = enumModel.getMembers().iterator().next();
Object enumValue = singleElement.getEnumValue();
TsStringLiteral expression = new TsStringLiteral((String) enumValue);
return Optional.of(expression);
}
use of cz.habarta.typescript.generator.emitter.TsExpression in project typescript-generator by vojtechhabarta.
the class RequiredPropertyConstructorExtension method getPredefinedValueForProperty.
private static Optional<TsExpression> getPredefinedValueForProperty(TsPropertyModel property, TsModel model) {
if (property.tsType instanceof TsType.UnionType) {
List<TsType> unionTypeElements = ((TsType.UnionType) property.tsType).types;
if (unionTypeElements.size() != 1) {
return Optional.empty();
}
TsType onlyElement = unionTypeElements.iterator().next();
if (!(onlyElement instanceof TsType.StringLiteralType)) {
return Optional.empty();
}
TsType.StringLiteralType onlyValue = (TsType.StringLiteralType) onlyElement;
TsStringLiteral expression = new TsStringLiteral(onlyValue.literal);
return Optional.of(expression);
}
if (property.tsType instanceof TsType.EnumReferenceType) {
Symbol symbol = ((TsType.EnumReferenceType) property.tsType).symbol;
Optional<TsEnumModel> enumModelOption = model.getOriginalStringEnums().stream().filter(candidate -> candidate.getName().getFullName().equals(symbol.getFullName())).findAny();
if (!enumModelOption.isPresent()) {
return Optional.empty();
}
TsEnumModel enumModel = enumModelOption.get();
if (enumModel.getMembers().size() != 1) {
return Optional.empty();
}
EnumMemberModel singleElement = enumModel.getMembers().iterator().next();
Object enumValue = singleElement.getEnumValue();
TsStringLiteral expression = new TsStringLiteral((String) enumValue);
return Optional.of(expression);
}
return Optional.empty();
}
Aggregations