Skip to content

Commit

Permalink
fix(java): Stop using Streams to render params (#459)
Browse files Browse the repository at this point in the history
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 🎉
  • Loading branch information
RomainMuller authored Apr 16, 2019
1 parent ebdd10d commit a5e8a93
Show file tree
Hide file tree
Showing 42 changed files with 81 additions and 89 deletions.
14 changes: 3 additions & 11 deletions packages/jsii-pacmak/lib/targets/java.ts
Original file line number Diff line number Diff line change
Expand Up @@ -987,17 +987,9 @@ class JavaGenerator extends Generator {

private renderMethodCallArguments(method: spec.Method) {
if (!method.parameters || method.parameters.length === 0) { return ''; }
let paramStream: string = '';
for (const param of method.parameters) {
const paramValue = isNullable(param) ? param.name : `java.util.Objects.requireNonNull(${param.name}, "${param.name} is required")`;
const thisParam = `${param.variadic ? 'java.util.Arrays.stream' : 'java.util.stream.Stream.of'}(${paramValue})`;
if (paramStream === '') {
paramStream = thisParam;
} else {
paramStream = `java.util.stream.Stream.concat(${paramStream}, ${thisParam})`;
}
}
return `, ${paramStream}.toArray()`;
const values = method.parameters.map(param =>
isNullable(param) ? param.name : `java.util.Objects.requireNonNull(${param.name}, "${param.name} is required")`);
return `, new Object[] { ${values.join(', ')} }`;
}

private renderMethodCall(cls: spec.TypeReference, method: spec.Method, async: boolean) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ protected Number(final software.amazon.jsii.JsiiObject.InitializationMode mode)
*/
public Number(final java.lang.Number value) {
super(software.amazon.jsii.JsiiObject.InitializationMode.Jsii);
software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this, java.util.stream.Stream.of(java.util.Objects.requireNonNull(value, "value is required")).toArray());
software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this, new Object[] { java.util.Objects.requireNonNull(value, "value is required") });
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public java.lang.String getAbstractProperty() {

@Override
public java.lang.String abstractMethod(final java.lang.String name) {
return this.jsiiCall("abstractMethod", java.lang.String.class, java.util.stream.Stream.of(java.util.Objects.requireNonNull(name, "name is required")).toArray());
return this.jsiiCall("abstractMethod", java.lang.String.class, new Object[] { java.util.Objects.requireNonNull(name, "name is required") });
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ protected Add(final software.amazon.jsii.JsiiObject.InitializationMode mode) {
*/
public Add(final software.amazon.jsii.tests.calculator.lib.Value lhs, final software.amazon.jsii.tests.calculator.lib.Value rhs) {
super(software.amazon.jsii.JsiiObject.InitializationMode.Jsii);
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());
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") });
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public AllTypes() {
}

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

@javax.annotation.Nullable
Expand All @@ -27,7 +27,7 @@ public java.lang.Object anyOut() {
}

public software.amazon.jsii.tests.calculator.StringEnum enumMethod(final software.amazon.jsii.tests.calculator.StringEnum value) {
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());
return this.jsiiCall("enumMethod", software.amazon.jsii.tests.calculator.StringEnum.class, new Object[] { java.util.Objects.requireNonNull(value, "value is required") });
}

public java.lang.Number getEnumPropertyValue() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,24 +12,24 @@ public AllowedMethodNames() {
}

public void getBar(final java.lang.String _p1, final java.lang.Number _p2) {
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());
this.jsiiCall("getBar", Void.class, new Object[] { java.util.Objects.requireNonNull(_p1, "_p1 is required"), java.util.Objects.requireNonNull(_p2, "_p2 is required") });
}

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

public void setBar(final java.lang.String _x, final java.lang.Number _y, final java.lang.Boolean _z) {
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());
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") });
}

/**
* setFoo(x) is not allowed (see negatives), but setXxx(a, b, ...) is okay.
*/
public void setFoo(final java.lang.String _x, final java.lang.Number _y) {
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());
this.jsiiCall("setFoo", Void.class, new Object[] { java.util.Objects.requireNonNull(_x, "_x is required"), java.util.Objects.requireNonNull(_y, "_y is required") });
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public java.lang.Number dontOverrideMe() {
}

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

public java.lang.Number overrideMeToo() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ protected BinaryOperation(final software.amazon.jsii.JsiiObject.InitializationMo
*/
public BinaryOperation(final software.amazon.jsii.tests.calculator.lib.Value lhs, final software.amazon.jsii.tests.calculator.lib.Value rhs) {
super(software.amazon.jsii.JsiiObject.InitializationMode.Jsii);
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());
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") });
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ protected Calculator(final software.amazon.jsii.JsiiObject.InitializationMode mo
*/
public Calculator(@javax.annotation.Nullable final software.amazon.jsii.tests.calculator.CalculatorProps props) {
super(software.amazon.jsii.JsiiObject.InitializationMode.Jsii);
software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this, java.util.stream.Stream.of(props).toArray());
software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this, new Object[] { props });
}
/**
* Creates a Calculator object.
Expand All @@ -30,14 +30,14 @@ public Calculator() {
* Adds a number to the current value.
*/
public void add(final java.lang.Number value) {
this.jsiiCall("add", Void.class, java.util.stream.Stream.of(java.util.Objects.requireNonNull(value, "value is required")).toArray());
this.jsiiCall("add", Void.class, new Object[] { java.util.Objects.requireNonNull(value, "value is required") });
}

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

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

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ protected ClassWithPrivateConstructorAndAutomaticProperties(final software.amazo
}

public static software.amazon.jsii.tests.calculator.ClassWithPrivateConstructorAndAutomaticProperties create(final java.lang.String readOnlyString, final java.lang.String readWriteString) {
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());
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") });
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@ protected ConstructorPassesThisOut(final software.amazon.jsii.JsiiObject.Initial
}
public ConstructorPassesThisOut(final software.amazon.jsii.tests.calculator.PartiallyInitializedThisConsumer consumer) {
super(software.amazon.jsii.JsiiObject.InitializationMode.Jsii);
software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this, java.util.stream.Stream.of(java.util.Objects.requireNonNull(consumer, "consumer is required")).toArray());
software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this, new Object[] { java.util.Objects.requireNonNull(consumer, "consumer is required") });
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@ public ConsumersOfThisCrazyTypeSystem() {
}

public java.lang.String consumeAnotherPublicInterface(final software.amazon.jsii.tests.calculator.IAnotherPublicInterface obj) {
return this.jsiiCall("consumeAnotherPublicInterface", java.lang.String.class, java.util.stream.Stream.of(java.util.Objects.requireNonNull(obj, "obj is required")).toArray());
return this.jsiiCall("consumeAnotherPublicInterface", java.lang.String.class, new Object[] { java.util.Objects.requireNonNull(obj, "obj is required") });
}

@javax.annotation.Nullable
public java.lang.Object consumeNonInternalInterface(final software.amazon.jsii.tests.calculator.INonInternalInterface obj) {
return this.jsiiCall("consumeNonInternalInterface", java.lang.Object.class, java.util.stream.Stream.of(java.util.Objects.requireNonNull(obj, "obj is required")).toArray());
return this.jsiiCall("consumeNonInternalInterface", java.lang.Object.class, new Object[] { java.util.Objects.requireNonNull(obj, "obj is required") });
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@ protected DefaultedConstructorArgument(final software.amazon.jsii.JsiiObject.Ini
}
public DefaultedConstructorArgument(@javax.annotation.Nullable final java.lang.Number arg1, @javax.annotation.Nullable final java.lang.String arg2, @javax.annotation.Nullable final java.time.Instant arg3) {
super(software.amazon.jsii.JsiiObject.InitializationMode.Jsii);
software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this, java.util.stream.Stream.concat(java.util.stream.Stream.concat(java.util.stream.Stream.of(arg1), java.util.stream.Stream.of(arg2)), java.util.stream.Stream.of(arg3)).toArray());
software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this, new Object[] { arg1, arg2, arg3 });
}
public DefaultedConstructorArgument(@javax.annotation.Nullable final java.lang.Number arg1, @javax.annotation.Nullable final java.lang.String arg2) {
super(software.amazon.jsii.JsiiObject.InitializationMode.Jsii);
software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this, java.util.stream.Stream.concat(java.util.stream.Stream.of(arg1), java.util.stream.Stream.of(arg2)).toArray());
software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this, new Object[] { arg1, arg2 });
}
public DefaultedConstructorArgument(@javax.annotation.Nullable final java.lang.Number arg1) {
super(software.amazon.jsii.JsiiObject.InitializationMode.Jsii);
software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this, java.util.stream.Stream.of(arg1).toArray());
software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this, new Object[] { arg1 });
}
public DefaultedConstructorArgument() {
super(software.amazon.jsii.JsiiObject.InitializationMode.Jsii);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public DoNotOverridePrivates() {
}

public void changePrivatePropertyValue(final java.lang.String newValue) {
this.jsiiCall("changePrivatePropertyValue", Void.class, java.util.stream.Stream.of(java.util.Objects.requireNonNull(newValue, "newValue is required")).toArray());
this.jsiiCall("changePrivatePropertyValue", Void.class, new Object[] { java.util.Objects.requireNonNull(newValue, "newValue is required") });
}

public java.lang.String privateMethodValue() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,14 @@ public DoNotRecognizeAnyAsOptional() {
}

public void method(@javax.annotation.Nullable final java.lang.Object _requiredAny, @javax.annotation.Nullable final java.lang.Object _optionalAny, @javax.annotation.Nullable final java.lang.String _optionalString) {
this.jsiiCall("method", Void.class, java.util.stream.Stream.concat(java.util.stream.Stream.concat(java.util.stream.Stream.of(_requiredAny), java.util.stream.Stream.of(_optionalAny)), java.util.stream.Stream.of(_optionalString)).toArray());
this.jsiiCall("method", Void.class, new Object[] { _requiredAny, _optionalAny, _optionalString });
}

public void method(@javax.annotation.Nullable final java.lang.Object _requiredAny, @javax.annotation.Nullable final java.lang.Object _optionalAny) {
this.jsiiCall("method", Void.class, java.util.stream.Stream.concat(java.util.stream.Stream.of(_requiredAny), java.util.stream.Stream.of(_optionalAny)).toArray());
this.jsiiCall("method", Void.class, new Object[] { _requiredAny, _optionalAny });
}

public void method(@javax.annotation.Nullable final java.lang.Object _requiredAny) {
this.jsiiCall("method", Void.class, java.util.stream.Stream.of(_requiredAny).toArray());
this.jsiiCall("method", Void.class, new Object[] { _requiredAny });
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public DocumentedClass() {
* @param greetee The person to be greeted.
*/
public java.lang.Number greet(@javax.annotation.Nullable final software.amazon.jsii.tests.calculator.Greetee greetee) {
return this.jsiiCall("greet", java.lang.Number.class, java.util.stream.Stream.of(greetee).toArray());
return this.jsiiCall("greet", java.lang.Number.class, new Object[] { greetee });
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@ public DontComplainAboutVariadicAfterOptional() {
}

public java.lang.String optionalAndVariadic(@javax.annotation.Nullable final java.lang.String optional, final java.lang.String... things) {
return this.jsiiCall("optionalAndVariadic", java.lang.String.class, java.util.stream.Stream.concat(java.util.stream.Stream.of(optional), java.util.Arrays.stream(java.util.Objects.requireNonNull(things, "things is required"))).toArray());
return this.jsiiCall("optionalAndVariadic", java.lang.String.class, new Object[] { optional, java.util.Objects.requireNonNull(things, "things is required") });
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public EraseUndefinedHashValues() {
* are being erased when sending values from native code to JS.
*/
public static java.lang.Boolean doesKeyExist(final software.amazon.jsii.tests.calculator.EraseUndefinedHashValuesOptions opts, final java.lang.String key) {
return software.amazon.jsii.JsiiObject.jsiiStaticCall(software.amazon.jsii.tests.calculator.EraseUndefinedHashValues.class, "doesKeyExist", java.lang.Boolean.class, java.util.stream.Stream.concat(java.util.stream.Stream.of(java.util.Objects.requireNonNull(opts, "opts is required")), java.util.stream.Stream.of(java.util.Objects.requireNonNull(key, "key is required"))).toArray());
return software.amazon.jsii.JsiiObject.jsiiStaticCall(software.amazon.jsii.tests.calculator.EraseUndefinedHashValues.class, "doesKeyExist", java.lang.Boolean.class, new Object[] { java.util.Objects.requireNonNull(opts, "opts is required"), java.util.Objects.requireNonNull(key, "key is required") });
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ protected ExportedBaseClass(final software.amazon.jsii.JsiiObject.Initialization
}
public ExportedBaseClass(final java.lang.Boolean success) {
super(software.amazon.jsii.JsiiObject.InitializationMode.Jsii);
software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this, java.util.stream.Stream.of(java.util.Objects.requireNonNull(success, "success is required")).toArray());
software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this, new Object[] { java.util.Objects.requireNonNull(success, "success is required") });
}

public java.lang.Boolean getSuccess() {
Expand Down
Loading

0 comments on commit a5e8a93

Please sign in to comment.