Skip to content

Commit c2de100

Browse files
authored
fix(python): correctly handle interface declarations on returned objects (#980)
When the returned type had a known base type, the interfaces tagged on the object reference tag. This addresses this problem.
1 parent 948000d commit c2de100

18 files changed

Lines changed: 608 additions & 22 deletions

File tree

packages/jsii-calc/lib/compliance.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2208,3 +2208,31 @@ export class RootStructValidator {
22082208

22092209
private constructor() { }
22102210
}
2211+
2212+
/**
2213+
* Returns a subclass of a known class which implements an interface.
2214+
*/
2215+
export interface IReturnJsii976 {
2216+
readonly foo: number;
2217+
}
2218+
2219+
export class BaseJsii976 { }
2220+
2221+
export class SomeTypeJsii976 {
2222+
2223+
static returnReturn(): IReturnJsii976 {
2224+
class Derived extends BaseJsii976 implements IReturnJsii976 {
2225+
public readonly foo = 333
2226+
}
2227+
2228+
return new Derived();
2229+
}
2230+
2231+
static returnAnonymous(): any {
2232+
class Derived implements IReturnJsii976 {
2233+
public readonly foo = 1337;
2234+
}
2235+
2236+
return new Derived();
2237+
}
2238+
}

packages/jsii-calc/test/assembly.jsii

Lines changed: 94 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1236,6 +1236,20 @@
12361236
],
12371237
"name": "AugmentableClass"
12381238
},
1239+
"jsii-calc.BaseJsii976": {
1240+
"assembly": "jsii-calc",
1241+
"docs": {
1242+
"stability": "experimental"
1243+
},
1244+
"fqn": "jsii-calc.BaseJsii976",
1245+
"initializer": {},
1246+
"kind": "class",
1247+
"locationInModule": {
1248+
"filename": "lib/compliance.ts",
1249+
"line": 2219
1250+
},
1251+
"name": "BaseJsii976"
1252+
},
12391253
"jsii-calc.Bell": {
12401254
"assembly": "jsii-calc",
12411255
"docs": {
@@ -5140,6 +5154,37 @@
51405154
],
51415155
"name": "IRandomNumberGenerator"
51425156
},
5157+
"jsii-calc.IReturnJsii976": {
5158+
"assembly": "jsii-calc",
5159+
"docs": {
5160+
"stability": "experimental",
5161+
"summary": "Returns a subclass of a known class which implements an interface."
5162+
},
5163+
"fqn": "jsii-calc.IReturnJsii976",
5164+
"kind": "interface",
5165+
"locationInModule": {
5166+
"filename": "lib/compliance.ts",
5167+
"line": 2215
5168+
},
5169+
"name": "IReturnJsii976",
5170+
"properties": [
5171+
{
5172+
"abstract": true,
5173+
"docs": {
5174+
"stability": "experimental"
5175+
},
5176+
"immutable": true,
5177+
"locationInModule": {
5178+
"filename": "lib/compliance.ts",
5179+
"line": 2216
5180+
},
5181+
"name": "foo",
5182+
"type": {
5183+
"primitive": "number"
5184+
}
5185+
}
5186+
]
5187+
},
51435188
"jsii-calc.IReturnsNumber": {
51445189
"assembly": "jsii-calc",
51455190
"docs": {
@@ -8654,6 +8699,54 @@
86548699
],
86558700
"name": "SingletonStringEnum"
86568701
},
8702+
"jsii-calc.SomeTypeJsii976": {
8703+
"assembly": "jsii-calc",
8704+
"docs": {
8705+
"stability": "experimental"
8706+
},
8707+
"fqn": "jsii-calc.SomeTypeJsii976",
8708+
"initializer": {},
8709+
"kind": "class",
8710+
"locationInModule": {
8711+
"filename": "lib/compliance.ts",
8712+
"line": 2221
8713+
},
8714+
"methods": [
8715+
{
8716+
"docs": {
8717+
"stability": "experimental"
8718+
},
8719+
"locationInModule": {
8720+
"filename": "lib/compliance.ts",
8721+
"line": 2231
8722+
},
8723+
"name": "returnAnonymous",
8724+
"returns": {
8725+
"type": {
8726+
"primitive": "any"
8727+
}
8728+
},
8729+
"static": true
8730+
},
8731+
{
8732+
"docs": {
8733+
"stability": "experimental"
8734+
},
8735+
"locationInModule": {
8736+
"filename": "lib/compliance.ts",
8737+
"line": 2223
8738+
},
8739+
"name": "returnReturn",
8740+
"returns": {
8741+
"type": {
8742+
"fqn": "jsii-calc.IReturnJsii976"
8743+
}
8744+
},
8745+
"static": true
8746+
}
8747+
],
8748+
"name": "SomeTypeJsii976"
8749+
},
86578750
"jsii-calc.StableClass": {
86588751
"assembly": "jsii-calc",
86598752
"docs": {
@@ -10913,5 +11006,5 @@
1091311006
}
1091411007
},
1091511008
"version": "0.20.3",
10916-
"fingerprint": "1F+uskR3++T5mjRcWge9oG3H/jJvXm1C3IhR1AwsBTE="
11009+
"fingerprint": "umMeNAH41pX11GUAjHkw6RTyAwGCeTqRNJ2vPv5aeM0="
1091711010
}

packages/jsii-dotnet-runtime-test/test/Amazon.JSII.Runtime.IntegrationTests/ComplianceTests.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1033,6 +1033,13 @@ public void VariadicCallbacksAreHandledCorrectly()
10331033
Assert.Equal(new double[]{2d, 3d, 4d}, invoker.AsArray(1, 2, 3));
10341034
}
10351035

1036+
[Fact(DisplayName = Prefix + nameof(ReturnSubclassThatImplementsInterface976))]
1037+
public void ReturnSubclassThatImplementsInterface976()
1038+
{
1039+
var obj = SomeTypeJsii976.ReturnReturn();
1040+
Assert.Equal(obj.Foo, 333);
1041+
}
1042+
10361043
private sealed class OverrideVariadicMethod : VariadicMethod
10371044
{
10381045
public override double[] AsArray(double first, params double[] others)

packages/jsii-java-runtime-test/project/src/test/java/software/amazon/jsii/testing/ComplianceTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1391,6 +1391,12 @@ public void correctlyDeserializesStructUnions() {
13911391
assertTrue(StructUnionConsumer.isStructB(b1));
13921392
}
13931393

1394+
@Test
1395+
public void returnSubclassThatImplementsInterface976() {
1396+
IReturnJsii976 obj = SomeTypeJsii976.returnReturn();
1397+
assertEquals(obj.getFoo(), 333);
1398+
}
1399+
13941400
static class PartiallyInitializedThisConsumerImpl extends PartiallyInitializedThisConsumer {
13951401
@Override
13961402
public String consumePartiallyInitializedThis(final ConstructorPassesThisOut obj,

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

Lines changed: 94 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1236,6 +1236,20 @@
12361236
],
12371237
"name": "AugmentableClass"
12381238
},
1239+
"jsii-calc.BaseJsii976": {
1240+
"assembly": "jsii-calc",
1241+
"docs": {
1242+
"stability": "experimental"
1243+
},
1244+
"fqn": "jsii-calc.BaseJsii976",
1245+
"initializer": {},
1246+
"kind": "class",
1247+
"locationInModule": {
1248+
"filename": "lib/compliance.ts",
1249+
"line": 2219
1250+
},
1251+
"name": "BaseJsii976"
1252+
},
12391253
"jsii-calc.Bell": {
12401254
"assembly": "jsii-calc",
12411255
"docs": {
@@ -5140,6 +5154,37 @@
51405154
],
51415155
"name": "IRandomNumberGenerator"
51425156
},
5157+
"jsii-calc.IReturnJsii976": {
5158+
"assembly": "jsii-calc",
5159+
"docs": {
5160+
"stability": "experimental",
5161+
"summary": "Returns a subclass of a known class which implements an interface."
5162+
},
5163+
"fqn": "jsii-calc.IReturnJsii976",
5164+
"kind": "interface",
5165+
"locationInModule": {
5166+
"filename": "lib/compliance.ts",
5167+
"line": 2215
5168+
},
5169+
"name": "IReturnJsii976",
5170+
"properties": [
5171+
{
5172+
"abstract": true,
5173+
"docs": {
5174+
"stability": "experimental"
5175+
},
5176+
"immutable": true,
5177+
"locationInModule": {
5178+
"filename": "lib/compliance.ts",
5179+
"line": 2216
5180+
},
5181+
"name": "foo",
5182+
"type": {
5183+
"primitive": "number"
5184+
}
5185+
}
5186+
]
5187+
},
51435188
"jsii-calc.IReturnsNumber": {
51445189
"assembly": "jsii-calc",
51455190
"docs": {
@@ -8654,6 +8699,54 @@
86548699
],
86558700
"name": "SingletonStringEnum"
86568701
},
8702+
"jsii-calc.SomeTypeJsii976": {
8703+
"assembly": "jsii-calc",
8704+
"docs": {
8705+
"stability": "experimental"
8706+
},
8707+
"fqn": "jsii-calc.SomeTypeJsii976",
8708+
"initializer": {},
8709+
"kind": "class",
8710+
"locationInModule": {
8711+
"filename": "lib/compliance.ts",
8712+
"line": 2221
8713+
},
8714+
"methods": [
8715+
{
8716+
"docs": {
8717+
"stability": "experimental"
8718+
},
8719+
"locationInModule": {
8720+
"filename": "lib/compliance.ts",
8721+
"line": 2231
8722+
},
8723+
"name": "returnAnonymous",
8724+
"returns": {
8725+
"type": {
8726+
"primitive": "any"
8727+
}
8728+
},
8729+
"static": true
8730+
},
8731+
{
8732+
"docs": {
8733+
"stability": "experimental"
8734+
},
8735+
"locationInModule": {
8736+
"filename": "lib/compliance.ts",
8737+
"line": 2223
8738+
},
8739+
"name": "returnReturn",
8740+
"returns": {
8741+
"type": {
8742+
"fqn": "jsii-calc.IReturnJsii976"
8743+
}
8744+
},
8745+
"static": true
8746+
}
8747+
],
8748+
"name": "SomeTypeJsii976"
8749+
},
86578750
"jsii-calc.StableClass": {
86588751
"assembly": "jsii-calc",
86598752
"docs": {
@@ -10913,5 +11006,5 @@
1091311006
}
1091411007
},
1091511008
"version": "0.20.3",
10916-
"fingerprint": "1F+uskR3++T5mjRcWge9oG3H/jJvXm1C3IhR1AwsBTE="
11009+
"fingerprint": "umMeNAH41pX11GUAjHkw6RTyAwGCeTqRNJ2vPv5aeM0="
1091711010
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using Amazon.JSII.Runtime.Deputy;
2+
3+
namespace Amazon.JSII.Tests.CalculatorNamespace
4+
{
5+
/// <remarks>
6+
/// stability: Experimental
7+
/// </remarks>
8+
[JsiiClass(nativeType: typeof(Amazon.JSII.Tests.CalculatorNamespace.BaseJsii976), fullyQualifiedName: "jsii-calc.BaseJsii976")]
9+
public class BaseJsii976 : DeputyBase
10+
{
11+
public BaseJsii976(): base(new DeputyProps(new object[]{}))
12+
{
13+
}
14+
15+
protected BaseJsii976(ByRefValue reference): base(reference)
16+
{
17+
}
18+
19+
protected BaseJsii976(DeputyProps props): base(props)
20+
{
21+
}
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using Amazon.JSII.Runtime.Deputy;
2+
3+
namespace Amazon.JSII.Tests.CalculatorNamespace
4+
{
5+
/// <summary>Returns a subclass of a known class which implements an interface.</summary>
6+
/// <remarks>
7+
/// stability: Experimental
8+
/// </remarks>
9+
[JsiiInterface(nativeType: typeof(IReturnJsii976), fullyQualifiedName: "jsii-calc.IReturnJsii976")]
10+
public interface IReturnJsii976
11+
{
12+
/// <remarks>
13+
/// stability: Experimental
14+
/// </remarks>
15+
[JsiiProperty(name: "foo", typeJson: "{\"primitive\":\"number\"}")]
16+
double Foo
17+
{
18+
get;
19+
}
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using Amazon.JSII.Runtime.Deputy;
2+
3+
namespace Amazon.JSII.Tests.CalculatorNamespace
4+
{
5+
/// <summary>Returns a subclass of a known class which implements an interface.</summary>
6+
/// <remarks>
7+
/// stability: Experimental
8+
/// </remarks>
9+
[JsiiTypeProxy(nativeType: typeof(IReturnJsii976), fullyQualifiedName: "jsii-calc.IReturnJsii976")]
10+
internal sealed class IReturnJsii976Proxy : DeputyBase, Amazon.JSII.Tests.CalculatorNamespace.IReturnJsii976
11+
{
12+
private IReturnJsii976Proxy(ByRefValue reference): base(reference)
13+
{
14+
}
15+
16+
/// <remarks>
17+
/// stability: Experimental
18+
/// </remarks>
19+
[JsiiProperty(name: "foo", typeJson: "{\"primitive\":\"number\"}")]
20+
public double Foo
21+
{
22+
get => GetInstanceProperty<double>();
23+
}
24+
}
25+
}

0 commit comments

Comments
 (0)