Skip to content

Commit a5e8a93

Browse files
authored
fix(java): Stop using Streams to render params (#459)
The Java cod egenerated by `jsii-pacmak` used to use `Stream` concatenations to render parameters into an `Object` array when passing to the low-level `jsii` engine. In the majority of cases this worked fine, however in casesw where the last argument was an `enum`, this caused `javac` type inferrence to impose bounds on the `Stream`'s item type that could not be met by non-`enum` types. Additionally, as this code demonstrates, the `Stream`-based code was unnecessarily complicated as it is possible to initialize an array literal in place, by using less code, which also reads simpler, and incurs less memory churn. It's a win all over the board 🎉
1 parent ebdd10d commit a5e8a93

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+81
-89
lines changed

packages/jsii-pacmak/lib/targets/java.ts

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -987,17 +987,9 @@ class JavaGenerator extends Generator {
987987

988988
private renderMethodCallArguments(method: spec.Method) {
989989
if (!method.parameters || method.parameters.length === 0) { return ''; }
990-
let paramStream: string = '';
991-
for (const param of method.parameters) {
992-
const paramValue = isNullable(param) ? param.name : `java.util.Objects.requireNonNull(${param.name}, "${param.name} is required")`;
993-
const thisParam = `${param.variadic ? 'java.util.Arrays.stream' : 'java.util.stream.Stream.of'}(${paramValue})`;
994-
if (paramStream === '') {
995-
paramStream = thisParam;
996-
} else {
997-
paramStream = `java.util.stream.Stream.concat(${paramStream}, ${thisParam})`;
998-
}
999-
}
1000-
return `, ${paramStream}.toArray()`;
990+
const values = method.parameters.map(param =>
991+
isNullable(param) ? param.name : `java.util.Objects.requireNonNull(${param.name}, "${param.name} is required")`);
992+
return `, new Object[] { ${values.join(', ')} }`;
1001993
}
1002994

1003995
private renderMethodCall(cls: spec.TypeReference, method: spec.Method, async: boolean) {

packages/jsii-pacmak/test/expected.jsii-calc-lib/java/src/main/java/software/amazon/jsii/tests/calculator/lib/Number.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ protected Number(final software.amazon.jsii.JsiiObject.InitializationMode mode)
1616
*/
1717
public Number(final java.lang.Number value) {
1818
super(software.amazon.jsii.JsiiObject.InitializationMode.Jsii);
19-
software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this, java.util.stream.Stream.of(java.util.Objects.requireNonNull(value, "value is required")).toArray());
19+
software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this, new Object[] { java.util.Objects.requireNonNull(value, "value is required") });
2020
}
2121

2222
/**

packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/AbstractClass.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public java.lang.String getAbstractProperty() {
4242

4343
@Override
4444
public java.lang.String abstractMethod(final java.lang.String name) {
45-
return this.jsiiCall("abstractMethod", java.lang.String.class, java.util.stream.Stream.of(java.util.Objects.requireNonNull(name, "name is required")).toArray());
45+
return this.jsiiCall("abstractMethod", java.lang.String.class, new Object[] { java.util.Objects.requireNonNull(name, "name is required") });
4646
}
4747
}
4848
}

packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/Add.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ protected Add(final software.amazon.jsii.JsiiObject.InitializationMode mode) {
1717
*/
1818
public Add(final software.amazon.jsii.tests.calculator.lib.Value lhs, final software.amazon.jsii.tests.calculator.lib.Value rhs) {
1919
super(software.amazon.jsii.JsiiObject.InitializationMode.Jsii);
20-
software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this, java.util.stream.Stream.concat(java.util.stream.Stream.of(java.util.Objects.requireNonNull(lhs, "lhs is required")), java.util.stream.Stream.of(java.util.Objects.requireNonNull(rhs, "rhs is required"))).toArray());
20+
software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this, new Object[] { java.util.Objects.requireNonNull(lhs, "lhs is required"), java.util.Objects.requireNonNull(rhs, "rhs is required") });
2121
}
2222

2323
/**

packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/AllTypes.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public AllTypes() {
1818
}
1919

2020
public void anyIn(@javax.annotation.Nullable final java.lang.Object inp) {
21-
this.jsiiCall("anyIn", Void.class, java.util.stream.Stream.of(inp).toArray());
21+
this.jsiiCall("anyIn", Void.class, new Object[] { inp });
2222
}
2323

2424
@javax.annotation.Nullable
@@ -27,7 +27,7 @@ public java.lang.Object anyOut() {
2727
}
2828

2929
public software.amazon.jsii.tests.calculator.StringEnum enumMethod(final software.amazon.jsii.tests.calculator.StringEnum value) {
30-
return this.jsiiCall("enumMethod", software.amazon.jsii.tests.calculator.StringEnum.class, java.util.stream.Stream.of(java.util.Objects.requireNonNull(value, "value is required")).toArray());
30+
return this.jsiiCall("enumMethod", software.amazon.jsii.tests.calculator.StringEnum.class, new Object[] { java.util.Objects.requireNonNull(value, "value is required") });
3131
}
3232

3333
public java.lang.Number getEnumPropertyValue() {

packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/AllowedMethodNames.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,24 @@ public AllowedMethodNames() {
1212
}
1313

1414
public void getBar(final java.lang.String _p1, final java.lang.Number _p2) {
15-
this.jsiiCall("getBar", Void.class, java.util.stream.Stream.concat(java.util.stream.Stream.of(java.util.Objects.requireNonNull(_p1, "_p1 is required")), java.util.stream.Stream.of(java.util.Objects.requireNonNull(_p2, "_p2 is required"))).toArray());
15+
this.jsiiCall("getBar", Void.class, new Object[] { java.util.Objects.requireNonNull(_p1, "_p1 is required"), java.util.Objects.requireNonNull(_p2, "_p2 is required") });
1616
}
1717

1818
/**
1919
* getXxx() is not allowed (see negatives), but getXxx(a, ...) is okay.
2020
*/
2121
public java.lang.String getFoo(final java.lang.String withParam) {
22-
return this.jsiiCall("getFoo", java.lang.String.class, java.util.stream.Stream.of(java.util.Objects.requireNonNull(withParam, "withParam is required")).toArray());
22+
return this.jsiiCall("getFoo", java.lang.String.class, new Object[] { java.util.Objects.requireNonNull(withParam, "withParam is required") });
2323
}
2424

2525
public void setBar(final java.lang.String _x, final java.lang.Number _y, final java.lang.Boolean _z) {
26-
this.jsiiCall("setBar", Void.class, java.util.stream.Stream.concat(java.util.stream.Stream.concat(java.util.stream.Stream.of(java.util.Objects.requireNonNull(_x, "_x is required")), java.util.stream.Stream.of(java.util.Objects.requireNonNull(_y, "_y is required"))), java.util.stream.Stream.of(java.util.Objects.requireNonNull(_z, "_z is required"))).toArray());
26+
this.jsiiCall("setBar", Void.class, new Object[] { java.util.Objects.requireNonNull(_x, "_x is required"), java.util.Objects.requireNonNull(_y, "_y is required"), java.util.Objects.requireNonNull(_z, "_z is required") });
2727
}
2828

2929
/**
3030
* setFoo(x) is not allowed (see negatives), but setXxx(a, b, ...) is okay.
3131
*/
3232
public void setFoo(final java.lang.String _x, final java.lang.Number _y) {
33-
this.jsiiCall("setFoo", Void.class, java.util.stream.Stream.concat(java.util.stream.Stream.of(java.util.Objects.requireNonNull(_x, "_x is required")), java.util.stream.Stream.of(java.util.Objects.requireNonNull(_y, "_y is required"))).toArray());
33+
this.jsiiCall("setFoo", Void.class, new Object[] { java.util.Objects.requireNonNull(_x, "_x is required"), java.util.Objects.requireNonNull(_y, "_y is required") });
3434
}
3535
}

packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/AsyncVirtualMethods.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public java.lang.Number dontOverrideMe() {
3838
}
3939

4040
public java.lang.Number overrideMe(final java.lang.Number mult) {
41-
return this.jsiiAsyncCall("overrideMe", java.lang.Number.class, java.util.stream.Stream.of(java.util.Objects.requireNonNull(mult, "mult is required")).toArray());
41+
return this.jsiiAsyncCall("overrideMe", java.lang.Number.class, new Object[] { java.util.Objects.requireNonNull(mult, "mult is required") });
4242
}
4343

4444
public java.lang.Number overrideMeToo() {

packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/BinaryOperation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ protected BinaryOperation(final software.amazon.jsii.JsiiObject.InitializationMo
1717
*/
1818
public BinaryOperation(final software.amazon.jsii.tests.calculator.lib.Value lhs, final software.amazon.jsii.tests.calculator.lib.Value rhs) {
1919
super(software.amazon.jsii.JsiiObject.InitializationMode.Jsii);
20-
software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this, java.util.stream.Stream.concat(java.util.stream.Stream.of(java.util.Objects.requireNonNull(lhs, "lhs is required")), java.util.stream.Stream.of(java.util.Objects.requireNonNull(rhs, "rhs is required"))).toArray());
20+
software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this, new Object[] { java.util.Objects.requireNonNull(lhs, "lhs is required"), java.util.Objects.requireNonNull(rhs, "rhs is required") });
2121
}
2222

2323
/**

packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/Calculator.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ protected Calculator(final software.amazon.jsii.JsiiObject.InitializationMode mo
1616
*/
1717
public Calculator(@javax.annotation.Nullable final software.amazon.jsii.tests.calculator.CalculatorProps props) {
1818
super(software.amazon.jsii.JsiiObject.InitializationMode.Jsii);
19-
software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this, java.util.stream.Stream.of(props).toArray());
19+
software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this, new Object[] { props });
2020
}
2121
/**
2222
* Creates a Calculator object.
@@ -30,14 +30,14 @@ public Calculator() {
3030
* Adds a number to the current value.
3131
*/
3232
public void add(final java.lang.Number value) {
33-
this.jsiiCall("add", Void.class, java.util.stream.Stream.of(java.util.Objects.requireNonNull(value, "value is required")).toArray());
33+
this.jsiiCall("add", Void.class, new Object[] { java.util.Objects.requireNonNull(value, "value is required") });
3434
}
3535

3636
/**
3737
* Multiplies the current value by a number.
3838
*/
3939
public void mul(final java.lang.Number value) {
40-
this.jsiiCall("mul", Void.class, java.util.stream.Stream.of(java.util.Objects.requireNonNull(value, "value is required")).toArray());
40+
this.jsiiCall("mul", Void.class, new Object[] { java.util.Objects.requireNonNull(value, "value is required") });
4141
}
4242

4343
/**
@@ -51,7 +51,7 @@ public void neg() {
5151
* Raises the current value by a power.
5252
*/
5353
public void pow(final java.lang.Number value) {
54-
this.jsiiCall("pow", Void.class, java.util.stream.Stream.of(java.util.Objects.requireNonNull(value, "value is required")).toArray());
54+
this.jsiiCall("pow", Void.class, new Object[] { java.util.Objects.requireNonNull(value, "value is required") });
5555
}
5656

5757
/**

packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/ClassWithPrivateConstructorAndAutomaticProperties.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ protected ClassWithPrivateConstructorAndAutomaticProperties(final software.amazo
1111
}
1212

1313
public static software.amazon.jsii.tests.calculator.ClassWithPrivateConstructorAndAutomaticProperties create(final java.lang.String readOnlyString, final java.lang.String readWriteString) {
14-
return software.amazon.jsii.JsiiObject.jsiiStaticCall(software.amazon.jsii.tests.calculator.ClassWithPrivateConstructorAndAutomaticProperties.class, "create", software.amazon.jsii.tests.calculator.ClassWithPrivateConstructorAndAutomaticProperties.class, java.util.stream.Stream.concat(java.util.stream.Stream.of(java.util.Objects.requireNonNull(readOnlyString, "readOnlyString is required")), java.util.stream.Stream.of(java.util.Objects.requireNonNull(readWriteString, "readWriteString is required"))).toArray());
14+
return software.amazon.jsii.JsiiObject.jsiiStaticCall(software.amazon.jsii.tests.calculator.ClassWithPrivateConstructorAndAutomaticProperties.class, "create", software.amazon.jsii.tests.calculator.ClassWithPrivateConstructorAndAutomaticProperties.class, new Object[] { java.util.Objects.requireNonNull(readOnlyString, "readOnlyString is required"), java.util.Objects.requireNonNull(readWriteString, "readWriteString is required") });
1515
}
1616

1717
@Override

0 commit comments

Comments
 (0)