Skip to content

Commit c1af1d6

Browse files
authored
fix: accept variadic arguments after optional arguments (#307)
The following type signature is valid: function(optional?: string, ...args: string[]) The function can be called with anywhere from 0-infinity arguments.
1 parent 7b89d01 commit c1af1d6

File tree

8 files changed

+162
-7
lines changed

8 files changed

+162
-7
lines changed

packages/jsii-calc/lib/compliance.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -994,6 +994,12 @@ export interface NullShouldBeTreatedAsUndefinedData {
994994
arrayWithThreeElementsAndUndefinedAsSecondArgument: any[];
995995
}
996996

997+
export class DontComplainAboutVariadicAfterOptional {
998+
public optionalAndVariadic(optional?: string, ...things: string[]) {
999+
return `${optional} and ${things.join(',')}`;
1000+
}
1001+
}
1002+
9971003
/**
9981004
* jsii#298: show default values in sphinx documentation, and respect newlines.
9991005
**/
@@ -1012,7 +1018,7 @@ export interface LoadBalancedFargateServiceProps {
10121018
* @default 256
10131019
*/
10141020
cpu?: string;
1015-
1021+
10161022
/**
10171023
* The amount (in MiB) of memory used by the task.
10181024
*
@@ -1034,21 +1040,21 @@ export interface LoadBalancedFargateServiceProps {
10341040
* @default 512
10351041
*/
10361042
memoryMiB?: string;
1037-
1043+
10381044
/**
10391045
* The container port of the application load balancer attached to your Fargate service. Corresponds to container port mapping.
10401046
*
10411047
* @default 80
10421048
*/
10431049
containerPort?: number;
1044-
1050+
10451051
/**
10461052
* Determines whether the Application Load Balancer will be internet-facing
10471053
*
10481054
* @default true
10491055
*/
10501056
publicLoadBalancer?: boolean;
1051-
1057+
10521058
/**
10531059
* Determines whether your Fargate Service will be assigned a public IP address.
10541060
*

packages/jsii-calc/test/assembly.jsii

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1336,6 +1336,40 @@
13361336
],
13371337
"name": "DoNotRecognizeAnyAsOptional"
13381338
},
1339+
"jsii-calc.DontComplainAboutVariadicAfterOptional": {
1340+
"assembly": "jsii-calc",
1341+
"fqn": "jsii-calc.DontComplainAboutVariadicAfterOptional",
1342+
"initializer": {
1343+
"initializer": true
1344+
},
1345+
"kind": "class",
1346+
"methods": [
1347+
{
1348+
"name": "optionalAndVariadic",
1349+
"parameters": [
1350+
{
1351+
"name": "optional",
1352+
"type": {
1353+
"optional": true,
1354+
"primitive": "string"
1355+
}
1356+
},
1357+
{
1358+
"name": "things",
1359+
"type": {
1360+
"primitive": "string"
1361+
},
1362+
"variadic": true
1363+
}
1364+
],
1365+
"returns": {
1366+
"primitive": "string"
1367+
},
1368+
"variadic": true
1369+
}
1370+
],
1371+
"name": "DontComplainAboutVariadicAfterOptional"
1372+
},
13391373
"jsii-calc.DoubleTrouble": {
13401374
"assembly": "jsii-calc",
13411375
"fqn": "jsii-calc.DoubleTrouble",
@@ -3612,5 +3646,5 @@
36123646
}
36133647
},
36143648
"version": "0.7.8",
3615-
"fingerprint": "3UAOWGBZzphiNp40hKAbXcsM27uWdwmXnbiPU74ZroU="
3649+
"fingerprint": "MNdOxOP9VioCZlGXuccW1Zu64GAKSSIg93bLN+YDPYE="
36163650
}

packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/.jsii

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1336,6 +1336,40 @@
13361336
],
13371337
"name": "DoNotRecognizeAnyAsOptional"
13381338
},
1339+
"jsii-calc.DontComplainAboutVariadicAfterOptional": {
1340+
"assembly": "jsii-calc",
1341+
"fqn": "jsii-calc.DontComplainAboutVariadicAfterOptional",
1342+
"initializer": {
1343+
"initializer": true
1344+
},
1345+
"kind": "class",
1346+
"methods": [
1347+
{
1348+
"name": "optionalAndVariadic",
1349+
"parameters": [
1350+
{
1351+
"name": "optional",
1352+
"type": {
1353+
"optional": true,
1354+
"primitive": "string"
1355+
}
1356+
},
1357+
{
1358+
"name": "things",
1359+
"type": {
1360+
"primitive": "string"
1361+
},
1362+
"variadic": true
1363+
}
1364+
],
1365+
"returns": {
1366+
"primitive": "string"
1367+
},
1368+
"variadic": true
1369+
}
1370+
],
1371+
"name": "DontComplainAboutVariadicAfterOptional"
1372+
},
13391373
"jsii-calc.DoubleTrouble": {
13401374
"assembly": "jsii-calc",
13411375
"fqn": "jsii-calc.DoubleTrouble",
@@ -3612,5 +3646,5 @@
36123646
}
36133647
},
36143648
"version": "0.7.8",
3615-
"fingerprint": "3UAOWGBZzphiNp40hKAbXcsM27uWdwmXnbiPU74ZroU="
3649+
"fingerprint": "MNdOxOP9VioCZlGXuccW1Zu64GAKSSIg93bLN+YDPYE="
36163650
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using Amazon.JSII.Runtime.Deputy;
2+
3+
namespace Amazon.JSII.Tests.CalculatorNamespace
4+
{
5+
[JsiiClass(typeof(DontComplainAboutVariadicAfterOptional), "jsii-calc.DontComplainAboutVariadicAfterOptional", "[]")]
6+
public class DontComplainAboutVariadicAfterOptional : DeputyBase
7+
{
8+
public DontComplainAboutVariadicAfterOptional(): base(new DeputyProps(new object[]{}))
9+
{
10+
}
11+
12+
protected DontComplainAboutVariadicAfterOptional(ByRefValue reference): base(reference)
13+
{
14+
}
15+
16+
protected DontComplainAboutVariadicAfterOptional(DeputyProps props): base(props)
17+
{
18+
}
19+
20+
[JsiiMethod("optionalAndVariadic", "{\"primitive\":\"string\"}", "[{\"name\":\"optional\",\"type\":{\"primitive\":\"string\",\"optional\":true}},{\"name\":\"things\",\"type\":{\"primitive\":\"string\"}}]")]
21+
public virtual string OptionalAndVariadic(string optional, string things)
22+
{
23+
return InvokeInstanceMethod<string>(new object[]{optional, things});
24+
}
25+
}
26+
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ protected Class<?> resolveClass(final String fqn) throws ClassNotFoundException
3737
case "jsii-calc.DerivedStruct": return software.amazon.jsii.tests.calculator.DerivedStruct.class;
3838
case "jsii-calc.DoNotOverridePrivates": return software.amazon.jsii.tests.calculator.DoNotOverridePrivates.class;
3939
case "jsii-calc.DoNotRecognizeAnyAsOptional": return software.amazon.jsii.tests.calculator.DoNotRecognizeAnyAsOptional.class;
40+
case "jsii-calc.DontComplainAboutVariadicAfterOptional": return software.amazon.jsii.tests.calculator.DontComplainAboutVariadicAfterOptional.class;
4041
case "jsii-calc.DoubleTrouble": return software.amazon.jsii.tests.calculator.DoubleTrouble.class;
4142
case "jsii-calc.GiveMeStructs": return software.amazon.jsii.tests.calculator.GiveMeStructs.class;
4243
case "jsii-calc.IFriendlier": return software.amazon.jsii.tests.calculator.IFriendlier.class;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package software.amazon.jsii.tests.calculator;
2+
3+
@javax.annotation.Generated(value = "jsii-pacmak")
4+
@software.amazon.jsii.Jsii(module = software.amazon.jsii.tests.calculator.$Module.class, fqn = "jsii-calc.DontComplainAboutVariadicAfterOptional")
5+
public class DontComplainAboutVariadicAfterOptional extends software.amazon.jsii.JsiiObject {
6+
protected DontComplainAboutVariadicAfterOptional(final software.amazon.jsii.JsiiObject.InitializationMode mode) {
7+
super(mode);
8+
}
9+
public DontComplainAboutVariadicAfterOptional() {
10+
super(software.amazon.jsii.JsiiObject.InitializationMode.Jsii);
11+
software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this);
12+
}
13+
14+
public java.lang.String optionalAndVariadic(@javax.annotation.Nullable final java.lang.String optional, final java.lang.String... things) {
15+
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());
16+
}
17+
}

packages/jsii-pacmak/test/expected.jsii-calc/sphinx/jsii-calc.rst

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1418,6 +1418,43 @@ DoNotRecognizeAnyAsOptional
14181418
:type _optionalString: string *(optional)*
14191419

14201420

1421+
DontComplainAboutVariadicAfterOptional
1422+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1423+
1424+
.. py:class:: DontComplainAboutVariadicAfterOptional()
1425+
1426+
**Language-specific names:**
1427+
1428+
.. tabs::
1429+
1430+
.. code-tab:: c#
1431+
1432+
using Amazon.JSII.Tests.CalculatorNamespace;
1433+
1434+
.. code-tab:: java
1435+
1436+
import software.amazon.jsii.tests.calculator.DontComplainAboutVariadicAfterOptional;
1437+
1438+
.. code-tab:: javascript
1439+
1440+
const { DontComplainAboutVariadicAfterOptional } = require('jsii-calc');
1441+
1442+
.. code-tab:: typescript
1443+
1444+
import { DontComplainAboutVariadicAfterOptional } from 'jsii-calc';
1445+
1446+
1447+
1448+
1449+
.. py:method:: optionalAndVariadic(optional, *things) -> string
1450+
1451+
:param optional:
1452+
:type optional: string *(optional)*
1453+
:param \*things:
1454+
:type \*things: string
1455+
:rtype: string
1456+
1457+
14211458
DoubleTrouble
14221459
^^^^^^^^^^^^^
14231460

packages/jsii/lib/assembler.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -951,7 +951,7 @@ export class Assembler implements Emitter {
951951

952952
let optional = false;
953953
for (const p of parameters) {
954-
if (optional && !p.type.optional) {
954+
if (optional && !p.type.optional && !p.variadic) {
955955
this._diagnostic(node, ts.DiagnosticCategory.Error,
956956
`Parameter ${p.name} must be optional since it comes after an optional parameter`);
957957
}

0 commit comments

Comments
 (0)