Skip to content

Commit 554420f

Browse files
Paweł Płazieńskivojtechhabarta
authored andcommitted
Order optional parameters to constructor as last (#396)
1 parent 7fd14b1 commit 554420f

File tree

3 files changed

+54
-3
lines changed

3 files changed

+54
-3
lines changed

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/ext/RequiredPropertyConstructorExtension.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ private TsBeanModel transformBean(TsBeanModel bean, TsModel model,
9292
private static Optional<TsConstructorModel> createConstructor(TsBeanModel bean, TsModel model,
9393
Map<String, TsConstructorModel> generatedConstructors) {
9494
List<TsParameterModel> parameters = new ArrayList<>();
95+
List<TsParameterModel> optionalParameters = new ArrayList<>();
9596
List<TsStatement> body = new ArrayList<>();
9697
TsType parent = bean.getParent();
9798
if (parent != null) {
@@ -107,7 +108,9 @@ private static Optional<TsConstructorModel> createConstructor(TsBeanModel bean,
107108
TsIdentifierReference[] callParameters = new TsIdentifierReference[parentParameters.size()];
108109
int i = 0;
109110
for (TsParameterModel parentParameter : parentParameters) {
110-
parameters.add(parentParameter);
111+
List<TsParameterModel> targetParameterList =
112+
parentParameter.tsType instanceof TsType.OptionalType ? optionalParameters : parameters;
113+
targetParameterList.add(parentParameter);
111114
callParameters[i] = new TsIdentifierReference(parentParameter.name);
112115
i++;
113116
}
@@ -122,14 +125,18 @@ private static Optional<TsConstructorModel> createConstructor(TsBeanModel bean,
122125
if (predefinedValue.isPresent()) {
123126
assignmentExpression = predefinedValue.get();
124127
} else {
125-
parameters.add(new TsParameterModel(property.name, property.tsType));
128+
TsParameterModel parameter = new TsParameterModel(property.name, property.tsType);
129+
List<TsParameterModel> targetParameterList =
130+
property.tsType instanceof TsType.OptionalType ? optionalParameters : parameters;
131+
targetParameterList.add(parameter);
126132
assignmentExpression = new TsIdentifierReference(property.name);
127133
}
128134
TsMemberExpression leftHandSideExpression = new TsMemberExpression(new TsThisExpression(), property.name);
129135
TsExpression assignment = new TsAssignmentExpression(leftHandSideExpression, assignmentExpression);
130136
TsExpressionStatement assignmentStatement = new TsExpressionStatement(assignment);
131137
body.add(assignmentStatement);
132138
}
139+
parameters.addAll(optionalParameters);
133140
if(parameters.isEmpty() && body.isEmpty()) {
134141
return Optional.empty();
135142
}

typescript-generator-core/src/test/java/cz/habarta/typescript/generator/ext/RequiredPropertyConstructorExtensionTest.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@
1111
import cz.habarta.typescript.generator.TypeScriptOutputKind;
1212
import cz.habarta.typescript.generator.util.Utils;
1313
import java.lang.reflect.Type;
14+
import java.util.ArrayList;
1415
import java.util.HashMap;
1516
import java.util.Map;
16-
17+
import javax.annotation.Nullable;
1718
import org.junit.Assert;
1819
import org.junit.Test;
1920

@@ -62,6 +63,16 @@ static class SecondClass extends SimpleClass {
6263
public int field3;
6364
}
6465

66+
static class SimpleOptionalClass {
67+
public String field1;
68+
@Nullable
69+
public Integer field2;
70+
}
71+
72+
static class SecondOptionalClass extends SimpleOptionalClass {
73+
public String field3;
74+
}
75+
6576
@Test
6677
public void testBasicWithReadOnly() {
6778
Settings settings = createBaseSettings(new RequiredPropertyConstructorExtension());
@@ -123,6 +134,19 @@ public void testInheritance() {
123134
Assert.assertEquals(expected, result);
124135
}
125136

137+
@Test
138+
public void testOptionalParameters() {
139+
Settings settings = createBaseSettings();
140+
settings.declarePropertiesAsReadOnly = true;
141+
settings.optionalAnnotations = new ArrayList<>();
142+
settings.optionalAnnotations.add(Nullable.class);
143+
144+
String result = generateTypeScript(settings, SecondOptionalClass.class);
145+
146+
String expected = readResource("optionalParameters.ts");
147+
Assert.assertEquals(expected, result);
148+
}
149+
126150
private static String generateTypeScript(Settings settings, Type... types) {
127151
TypeScriptGenerator typeScriptGenerator = new TypeScriptGenerator(settings);
128152
String result = typeScriptGenerator.generateTypeScript(Input.from(types));
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/* tslint:disable */
2+
3+
export class SimpleOptionalClass {
4+
readonly field1: string;
5+
readonly field2?: number;
6+
7+
constructor(field1: string, field2?: number) {
8+
this.field1 = field1;
9+
this.field2 = field2;
10+
}
11+
}
12+
13+
export class SecondOptionalClass extends SimpleOptionalClass {
14+
readonly field3: string;
15+
16+
constructor(field1: string, field3: string, field2?: number) {
17+
super(field1, field2);
18+
this.field3 = field3;
19+
}
20+
}

0 commit comments

Comments
 (0)