From c174ac5822d9923c904ec38b3f7d0513310ef973 Mon Sep 17 00:00:00 2001 From: Romain Marcadier Date: Wed, 1 Jul 2020 14:52:38 +0200 Subject: [PATCH] fix(python): relative import missing for kwargs types (#1768) Relative import statements were not emitted for lifted keyword argument types, occasionally leading to invalid python modules. This adds the necessary feature to collect required imports from keyword arguments. --- By submitting this pull request, I confirm that my contribution is made under the terms of the [Apache 2.0 license]. [Apache 2.0 license]: https://www.apache.org/licenses/LICENSE-2.0 --- packages/jsii-calc/lib/submodule/my-class.ts | 4 +- packages/jsii-calc/test/assembly.jsii | 26 +++++++- packages/jsii-pacmak/lib/targets/python.ts | 3 + .../.jsii | 26 +++++++- .../CalculatorNamespace/Submodule/MyClass.cs | 13 +++- .../tests/calculator/submodule/MyClass.java | 59 ++++++++++++++++++- .../src/jsii_calc/submodule/__init__.py | 24 +++++++- .../test/__snapshots__/jsii-tree.test.js.snap | 11 +++- 8 files changed, 151 insertions(+), 15 deletions(-) diff --git a/packages/jsii-calc/lib/submodule/my-class.ts b/packages/jsii-calc/lib/submodule/my-class.ts index aa7e40a83c..f286717c8f 100644 --- a/packages/jsii-calc/lib/submodule/my-class.ts +++ b/packages/jsii-calc/lib/submodule/my-class.ts @@ -1,5 +1,5 @@ import { nested_submodule } from './nested_submodule'; -import { Awesomeness, Goodness } from './child'; +import { Awesomeness, Goodness, SomeStruct } from './child'; import { AllTypes } from '..'; export class MyClass implements nested_submodule.deeplyNested.INamespaced { @@ -8,5 +8,5 @@ export class MyClass implements nested_submodule.deeplyNested.INamespaced { public readonly awesomeness = Awesomeness.AWESOME; public allTypes?: AllTypes; - public constructor() { } + public constructor(public readonly props: SomeStruct) { } } diff --git a/packages/jsii-calc/test/assembly.jsii b/packages/jsii-calc/test/assembly.jsii index 04b30af5dc..f3a438b09c 100644 --- a/packages/jsii-calc/test/assembly.jsii +++ b/packages/jsii-calc/test/assembly.jsii @@ -12789,7 +12789,15 @@ "initializer": { "docs": { "stability": "experimental" - } + }, + "parameters": [ + { + "name": "props", + "type": { + "fqn": "jsii-calc.submodule.child.SomeStruct" + } + } + ] }, "interfaces": [ "jsii-calc.submodule.nested_submodule.deeplyNested.INamespaced" @@ -12845,6 +12853,20 @@ "fqn": "jsii-calc.submodule.child.Goodness" } }, + { + "docs": { + "stability": "experimental" + }, + "immutable": true, + "locationInModule": { + "filename": "lib/submodule/my-class.ts", + "line": 11 + }, + "name": "props", + "type": { + "fqn": "jsii-calc.submodule.child.SomeStruct" + } + }, { "docs": { "stability": "experimental" @@ -13196,5 +13218,5 @@ } }, "version": "0.0.0", - "fingerprint": "/0S7DMfFaE1kfja4CpY5k0Gl6j6opo50SUPCiBgy3Zg=" + "fingerprint": "5Tv5ECDhqPZgUeGoaL8LTa8pvOZnosdszen+rYjvQ8s=" } diff --git a/packages/jsii-pacmak/lib/targets/python.ts b/packages/jsii-pacmak/lib/targets/python.ts index 8c5b7ffba9..328351d363 100644 --- a/packages/jsii-pacmak/lib/targets/python.ts +++ b/packages/jsii-pacmak/lib/targets/python.ts @@ -402,6 +402,9 @@ abstract class BaseMethod implements PythonBase { ...this.parameters.map((param) => toTypeName(param).requiredImports(context), ), + ...(this.liftedProp?.properties?.map((prop) => + toTypeName(prop.type).requiredImports(context), + ) ?? []), ); } diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/.jsii b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/.jsii index 04b30af5dc..f3a438b09c 100644 --- a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/.jsii +++ b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/.jsii @@ -12789,7 +12789,15 @@ "initializer": { "docs": { "stability": "experimental" - } + }, + "parameters": [ + { + "name": "props", + "type": { + "fqn": "jsii-calc.submodule.child.SomeStruct" + } + } + ] }, "interfaces": [ "jsii-calc.submodule.nested_submodule.deeplyNested.INamespaced" @@ -12845,6 +12853,20 @@ "fqn": "jsii-calc.submodule.child.Goodness" } }, + { + "docs": { + "stability": "experimental" + }, + "immutable": true, + "locationInModule": { + "filename": "lib/submodule/my-class.ts", + "line": 11 + }, + "name": "props", + "type": { + "fqn": "jsii-calc.submodule.child.SomeStruct" + } + }, { "docs": { "stability": "experimental" @@ -13196,5 +13218,5 @@ } }, "version": "0.0.0", - "fingerprint": "/0S7DMfFaE1kfja4CpY5k0Gl6j6opo50SUPCiBgy3Zg=" + "fingerprint": "5Tv5ECDhqPZgUeGoaL8LTa8pvOZnosdszen+rYjvQ8s=" } diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Submodule/MyClass.cs b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Submodule/MyClass.cs index 3f9ac65bff..977d3ba5ac 100644 --- a/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Submodule/MyClass.cs +++ b/packages/jsii-pacmak/test/expected.jsii-calc/dotnet/Amazon.JSII.Tests.CalculatorPackageId/Amazon/JSII/Tests/CalculatorNamespace/Submodule/MyClass.cs @@ -7,13 +7,13 @@ namespace Amazon.JSII.Tests.CalculatorNamespace.Submodule /// /// Stability: Experimental /// - [JsiiClass(nativeType: typeof(Amazon.JSII.Tests.CalculatorNamespace.Submodule.MyClass), fullyQualifiedName: "jsii-calc.submodule.MyClass")] + [JsiiClass(nativeType: typeof(Amazon.JSII.Tests.CalculatorNamespace.Submodule.MyClass), fullyQualifiedName: "jsii-calc.submodule.MyClass", parametersJson: "[{\"name\":\"props\",\"type\":{\"fqn\":\"jsii-calc.submodule.child.SomeStruct\"}}]")] public class MyClass : DeputyBase, Amazon.JSII.Tests.CalculatorNamespace.Submodule.NestedSubmodule.DeeplyNested.INamespaced { /// /// Stability: Experimental /// - public MyClass(): base(new DeputyProps(new object[]{})) + public MyClass(Amazon.JSII.Tests.CalculatorNamespace.Submodule.Child.ISomeStruct props): base(new DeputyProps(new object[]{props})) { } @@ -58,6 +58,15 @@ public virtual Amazon.JSII.Tests.CalculatorNamespace.Submodule.Child.Goodness Go get => GetInstanceProperty(); } + /// + /// Stability: Experimental + /// + [JsiiProperty(name: "props", typeJson: "{\"fqn\":\"jsii-calc.submodule.child.SomeStruct\"}")] + public virtual Amazon.JSII.Tests.CalculatorNamespace.Submodule.Child.ISomeStruct Props + { + get => GetInstanceProperty(); + } + /// /// Stability: Experimental /// diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/submodule/MyClass.java b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/submodule/MyClass.java index 0ac621ba45..3768bf78bd 100644 --- a/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/submodule/MyClass.java +++ b/packages/jsii-pacmak/test/expected.jsii-calc/java/src/main/java/software/amazon/jsii/tests/calculator/submodule/MyClass.java @@ -18,11 +18,13 @@ protected MyClass(final software.amazon.jsii.JsiiObject.InitializationMode initi /** * EXPERIMENTAL + *

+ * @param props This parameter is required. */ @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Experimental) - public MyClass() { + public MyClass(final @org.jetbrains.annotations.NotNull software.amazon.jsii.tests.calculator.submodule.child.SomeStruct props) { super(software.amazon.jsii.JsiiObject.InitializationMode.JSII); - software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this); + software.amazon.jsii.JsiiEngine.getInstance().createNewObject(this, new Object[] { java.util.Objects.requireNonNull(props, "props is required") }); } /** @@ -50,6 +52,14 @@ public MyClass() { return this.jsiiGet("goodness", software.amazon.jsii.tests.calculator.submodule.child.Goodness.class); } + /** + * EXPERIMENTAL + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Experimental) + public @org.jetbrains.annotations.NotNull software.amazon.jsii.tests.calculator.submodule.child.SomeStruct getProps() { + return this.jsiiGet("props", software.amazon.jsii.tests.calculator.submodule.child.SomeStruct.class); + } + /** * EXPERIMENTAL */ @@ -65,4 +75,49 @@ public MyClass() { public void setAllTypes(final @org.jetbrains.annotations.Nullable software.amazon.jsii.tests.calculator.AllTypes value) { this.jsiiSet("allTypes", value); } + + /** + * A fluent builder for {@link software.amazon.jsii.tests.calculator.submodule.MyClass}. + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Experimental) + public static final class Builder implements software.amazon.jsii.Builder { + /** + * EXPERIMENTAL + *

+ * @return a new instance of {@link Builder}. + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Experimental) + public static Builder create() { + return new Builder(); + } + + private final software.amazon.jsii.tests.calculator.submodule.child.SomeStruct.Builder props; + + private Builder() { + this.props = new software.amazon.jsii.tests.calculator.submodule.child.SomeStruct.Builder(); + } + + /** + * EXPERIMENTAL + *

+ * @return {@code this} + * @param prop This parameter is required. + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Experimental) + public Builder prop(final software.amazon.jsii.tests.calculator.submodule.child.SomeEnum prop) { + this.props.prop(prop); + return this; + } + + /** + * @returns a newly built instance of {@link software.amazon.jsii.tests.calculator.submodule.MyClass}. + */ + @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Experimental) + @Override + public software.amazon.jsii.tests.calculator.submodule.MyClass build() { + return new software.amazon.jsii.tests.calculator.submodule.MyClass( + this.props.build() + ); + } + } } diff --git a/packages/jsii-pacmak/test/expected.jsii-calc/python/src/jsii_calc/submodule/__init__.py b/packages/jsii-pacmak/test/expected.jsii-calc/python/src/jsii_calc/submodule/__init__.py index 37ceaee3e7..dbfd234f69 100644 --- a/packages/jsii-pacmak/test/expected.jsii-calc/python/src/jsii_calc/submodule/__init__.py +++ b/packages/jsii-pacmak/test/expected.jsii-calc/python/src/jsii_calc/submodule/__init__.py @@ -11,7 +11,12 @@ from .._jsii import * from .. import AllTypes as _AllTypes_b08307c5 -from .child import Awesomeness as _Awesomeness_d37a24df, Goodness as _Goodness_2df26737 +from .child import ( + SomeStruct as _SomeStruct_91627123, + SomeEnum as _SomeEnum_b2e41d92, + Awesomeness as _Awesomeness_d37a24df, + Goodness as _Goodness_2df26737, +) from .nested_submodule.deeply_nested import INamespaced as _INamespaced_e2f386ad @@ -22,12 +27,16 @@ class MyClass(metaclass=jsii.JSIIMeta, jsii_type="jsii-calc.submodule.MyClass"): :stability: experimental """ - def __init__(self) -> None: + def __init__(self, *, prop: _SomeEnum_b2e41d92) -> None: """ + :param prop: + stability :stability: experimental """ - jsii.create(MyClass, self, []) + props = _SomeStruct_91627123(prop=prop) + + jsii.create(MyClass, self, [props]) @builtins.property @jsii.member(jsii_name="awesomeness") @@ -56,6 +65,15 @@ def goodness(self) -> _Goodness_2df26737: """ return jsii.get(self, "goodness") + @builtins.property + @jsii.member(jsii_name="props") + def props(self) -> _SomeStruct_91627123: + """ + stability + :stability: experimental + """ + return jsii.get(self, "props") + @builtins.property @jsii.member(jsii_name="allTypes") def all_types(self) -> typing.Optional[_AllTypes_b08307c5]: diff --git a/packages/jsii-reflect/test/__snapshots__/jsii-tree.test.js.snap b/packages/jsii-reflect/test/__snapshots__/jsii-tree.test.js.snap index c3b3f1b3b1..9cf59a43d5 100644 --- a/packages/jsii-reflect/test/__snapshots__/jsii-tree.test.js.snap +++ b/packages/jsii-reflect/test/__snapshots__/jsii-tree.test.js.snap @@ -174,7 +174,10 @@ exports[`jsii-tree --all 1`] = ` │ │ └─┬ class MyClass (experimental) │ │ ├── interfaces: INamespaced │ │ └─┬ members - │ │ ├── () initializer (experimental) + │ │ ├─┬ (props) initializer (experimental) + │ │ │ └─┬ parameters + │ │ │ └─┬ props + │ │ │ └── type: jsii-calc.submodule.child.SomeStruct │ │ ├─┬ awesomeness property (experimental) │ │ │ ├── immutable │ │ │ └── type: jsii-calc.submodule.child.Awesomeness @@ -184,6 +187,9 @@ exports[`jsii-tree --all 1`] = ` │ │ ├─┬ goodness property (experimental) │ │ │ ├── immutable │ │ │ └── type: jsii-calc.submodule.child.Goodness + │ │ ├─┬ props property (experimental) + │ │ │ ├── immutable + │ │ │ └── type: jsii-calc.submodule.child.SomeStruct │ │ └─┬ allTypes property (experimental) │ │ └── type: Optional │ └─┬ types @@ -3062,10 +3068,11 @@ exports[`jsii-tree --members 1`] = ` │ │ └─┬ types │ │ └─┬ class MyClass │ │ └─┬ members - │ │ ├── () initializer + │ │ ├── (props) initializer │ │ ├── awesomeness property │ │ ├── definedAt property │ │ ├── goodness property + │ │ ├── props property │ │ └── allTypes property │ └─┬ types │ ├─┬ class AbstractClass