diff --git a/packages/jsii-rosetta/lib/jsii/jsii-types.ts b/packages/jsii-rosetta/lib/jsii/jsii-types.ts index 3a1246bf81..d7ce8066e3 100644 --- a/packages/jsii-rosetta/lib/jsii/jsii-types.ts +++ b/packages/jsii-rosetta/lib/jsii/jsii-types.ts @@ -31,6 +31,22 @@ export function determineJsiiType(typeChecker: ts.TypeChecker, type: ts.Type): J }; } + if (type.symbol?.name === 'Array') { + const typeRef = type as ts.TypeReference; + + if (typeRef.typeArguments?.length === 1) { + return { + kind: 'list', + elementType: determineJsiiType(typeChecker, typeRef.typeArguments[0]), + }; + } + + return { + kind: 'list', + elementType: { kind: 'builtIn', builtIn: 'any' }, + }; + } + // User-defined or aliased type if (type.aliasSymbol) { return { kind: 'namedType', name: type.aliasSymbol.name }; diff --git a/packages/jsii-rosetta/lib/languages/csharp.ts b/packages/jsii-rosetta/lib/languages/csharp.ts index d125557f59..c3ad10fbaf 100644 --- a/packages/jsii-rosetta/lib/languages/csharp.ts +++ b/packages/jsii-rosetta/lib/languages/csharp.ts @@ -317,6 +317,7 @@ export class CSharpVisitor extends DefaultVisitor { public parameterDeclaration(node: ts.ParameterDeclaration, renderer: CSharpRenderer): OTree { return new OTree([ + ...(node.dotDotDotToken ? ['params '] : []), // Varargs. Render with 'params' keyword this.renderTypeNode(node.type, node.questionToken !== undefined, renderer), ' ', renderer.convert(node.name), diff --git a/packages/jsii-rosetta/lib/languages/default.ts b/packages/jsii-rosetta/lib/languages/default.ts index 468d864970..319c26a997 100644 --- a/packages/jsii-rosetta/lib/languages/default.ts +++ b/packages/jsii-rosetta/lib/languages/default.ts @@ -287,6 +287,13 @@ export abstract class DefaultVisitor implements AstHandler { return this.notImplemented(node, context); } + public elementAccessExpression(node: ts.ElementAccessExpression, context: AstRenderer): OTree { + const expression = context.convert(node.expression); + const index = context.convert(node.argumentExpression); + + return new OTree([expression, '[', index, ']']); + } + public nonNullExpression(node: ts.NonNullExpression, context: AstRenderer): OTree { // We default we drop the non-null assertion return context.convert(node.expression); diff --git a/packages/jsii-rosetta/lib/languages/java.ts b/packages/jsii-rosetta/lib/languages/java.ts index 35c01f22d5..f0bdc77231 100644 --- a/packages/jsii-rosetta/lib/languages/java.ts +++ b/packages/jsii-rosetta/lib/languages/java.ts @@ -262,7 +262,13 @@ export class JavaVisitor extends DefaultVisitor { } public parameterDeclaration(node: ts.ParameterDeclaration, renderer: JavaRenderer): OTree { - return new OTree([this.renderTypeNode(node.type, renderer), ' ', renderer.convert(node.name)]); + let renderedType = this.renderTypeNode(node.type, renderer); + if (node.dotDotDotToken && renderedType.endsWith('[]')) { + // Varargs. In Java, render this as `Element...` (instead of `Element[]` which is what we'll have gotten). + renderedType = `${renderedType.substr(0, renderedType.length - 2)}...`; + } + + return new OTree([renderedType, ' ', renderer.convert(node.name)]); } public block(node: ts.Block, renderer: JavaRenderer): OTree { @@ -691,6 +697,7 @@ export class JavaVisitor extends DefaultVisitor { if (!type) { return fallback; } + return doRender(determineJsiiType(renderer.typeChecker, type), false); // eslint-disable-next-line consistent-return diff --git a/packages/jsii-rosetta/lib/languages/python.ts b/packages/jsii-rosetta/lib/languages/python.ts index 86942390a8..39e065f6e0 100644 --- a/packages/jsii-rosetta/lib/languages/python.ts +++ b/packages/jsii-rosetta/lib/languages/python.ts @@ -301,7 +301,7 @@ export class PythonVisitor extends DefaultVisitor { const suffix = parameterAcceptsUndefined(node, type) ? '=None' : ''; - return new OTree([context.convert(node.name), suffix]); + return new OTree([node.dotDotDotToken ? '*' : '', context.convert(node.name), suffix]); function renderStructProperty(prop: StructProperty): string { const sfx = structPropertyAcceptsUndefined(prop) ? '=None' : ''; diff --git a/packages/jsii-rosetta/lib/languages/visualize.ts b/packages/jsii-rosetta/lib/languages/visualize.ts index 8eaa602a8b..a58e345dc4 100644 --- a/packages/jsii-rosetta/lib/languages/visualize.ts +++ b/packages/jsii-rosetta/lib/languages/visualize.ts @@ -170,6 +170,10 @@ export class VisualizeAstVisitor implements AstHandler { return this.defaultNode('templateExpression', node, context); } + public elementAccessExpression(node: ts.ElementAccessExpression, context: AstRenderer): OTree { + return this.defaultNode('elementAccessExpression', node, context); + } + public nonNullExpression(node: ts.NonNullExpression, context: AstRenderer): OTree { return this.defaultNode('nonNullExpression', node, context); } diff --git a/packages/jsii-rosetta/lib/renderer.ts b/packages/jsii-rosetta/lib/renderer.ts index e92629826d..cdca8ee037 100644 --- a/packages/jsii-rosetta/lib/renderer.ts +++ b/packages/jsii-rosetta/lib/renderer.ts @@ -362,6 +362,9 @@ export class AstRenderer { } return visitor.spreadElement(tree, this); } + if (ts.isElementAccessExpression(tree)) { + return visitor.elementAccessExpression(tree, this); + } if (ts.isTemplateExpression(tree)) { return visitor.templateExpression(tree, this); } @@ -492,6 +495,7 @@ export interface AstHandler { nonNullExpression(node: ts.NonNullExpression, context: AstRenderer): OTree; parenthesizedExpression(node: ts.ParenthesizedExpression, context: AstRenderer): OTree; maskingVoidExpression(node: ts.VoidExpression, context: AstRenderer): OTree; + elementAccessExpression(node: ts.ElementAccessExpression, context: AstRenderer): OTree; // Not a node, called when we recognize a spread element/assignment that is only // '...' and nothing else. diff --git a/packages/jsii-rosetta/test/translations/expressions/array_index.cs b/packages/jsii-rosetta/test/translations/expressions/array_index.cs new file mode 100644 index 0000000000..1b8231e558 --- /dev/null +++ b/packages/jsii-rosetta/test/translations/expressions/array_index.cs @@ -0,0 +1,3 @@ +string[] array; + +Console.WriteLine(array[3]); \ No newline at end of file diff --git a/packages/jsii-rosetta/test/translations/expressions/array_index.java b/packages/jsii-rosetta/test/translations/expressions/array_index.java new file mode 100644 index 0000000000..105dc0b480 --- /dev/null +++ b/packages/jsii-rosetta/test/translations/expressions/array_index.java @@ -0,0 +1,3 @@ +String[] array; + +System.out.println(array[3]); \ No newline at end of file diff --git a/packages/jsii-rosetta/test/translations/expressions/array_index.py b/packages/jsii-rosetta/test/translations/expressions/array_index.py new file mode 100644 index 0000000000..1ba41427e4 --- /dev/null +++ b/packages/jsii-rosetta/test/translations/expressions/array_index.py @@ -0,0 +1,3 @@ +# array is of type list of string + +print(array[3]) \ No newline at end of file diff --git a/packages/jsii-rosetta/test/translations/expressions/array_index.ts b/packages/jsii-rosetta/test/translations/expressions/array_index.ts new file mode 100644 index 0000000000..86100c3156 --- /dev/null +++ b/packages/jsii-rosetta/test/translations/expressions/array_index.ts @@ -0,0 +1,3 @@ +declare const array: string[]; + +console.log(array[3]); \ No newline at end of file diff --git a/packages/jsii-rosetta/test/translations/statements/vararg_any_call.cs b/packages/jsii-rosetta/test/translations/statements/vararg_any_call.cs index 6d653a93e7..20cb965f93 100644 --- a/packages/jsii-rosetta/test/translations/statements/vararg_any_call.cs +++ b/packages/jsii-rosetta/test/translations/statements/vararg_any_call.cs @@ -1,4 +1,4 @@ -public void Test(Array _args) +public void Test(params object[] _args) { } diff --git a/packages/jsii-rosetta/test/translations/statements/vararg_any_call.java b/packages/jsii-rosetta/test/translations/statements/vararg_any_call.java index bf9b4999e1..6a56a59a05 100644 --- a/packages/jsii-rosetta/test/translations/statements/vararg_any_call.java +++ b/packages/jsii-rosetta/test/translations/statements/vararg_any_call.java @@ -1,4 +1,4 @@ -public void test(Array _args) { +public void test(Object... _args) { } test(Map.of("Key", "Value", "also", 1337)); diff --git a/packages/jsii-rosetta/test/translations/statements/vararg_any_call.py b/packages/jsii-rosetta/test/translations/statements/vararg_any_call.py index 568099bf51..2b14375591 100644 --- a/packages/jsii-rosetta/test/translations/statements/vararg_any_call.py +++ b/packages/jsii-rosetta/test/translations/statements/vararg_any_call.py @@ -1,4 +1,4 @@ -def test(_args): +def test(*_args): pass test({"Key": "Value", "also": 1337})