Skip to content

Commit e3f0f6c

Browse files
authored
fix(java): correctly search for protected override implementations (#905)
The code looking for overrides implementations was using the `Class#getMethods` method, but this only considers `public` members of the class. Chanegd to `#getDeclaredMethods` which accounts for *all* the methods. Fixes #903
1 parent 8bacfb1 commit e3f0f6c

23 files changed

Lines changed: 1999 additions & 2755 deletions

File tree

packages/jsii-calc/lib/compliance.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1880,3 +1880,23 @@ export class ClassWithCollections {
18801880
return {'key1': 'value1', 'key2': 'value2'};
18811881
}
18821882
}
1883+
1884+
/**
1885+
* @see https://github.com/aws/jsii/issues/903
1886+
*/
1887+
export class OverridableProtectedMember {
1888+
protected readonly overrideReadOnly: string = 'Baz';
1889+
protected overrideReadWrite: string = 'zinga!';
1890+
1891+
public valueFromProtected(): string {
1892+
return this.overrideMe();
1893+
}
1894+
1895+
public switchModes(): void {
1896+
this.overrideReadWrite = 'zaar...';
1897+
}
1898+
1899+
protected overrideMe(): string {
1900+
return this.overrideReadOnly + this.overrideReadWrite;
1901+
}
1902+
}

packages/jsii-calc/test/assembly.jsii

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6846,6 +6846,95 @@
68466846
}
68476847
]
68486848
},
6849+
"jsii-calc.OverridableProtectedMember": {
6850+
"assembly": "jsii-calc",
6851+
"docs": {
6852+
"see": "https://github.com/aws/jsii/issues/903",
6853+
"stability": "experimental"
6854+
},
6855+
"fqn": "jsii-calc.OverridableProtectedMember",
6856+
"initializer": {},
6857+
"kind": "class",
6858+
"locationInModule": {
6859+
"filename": "lib/compliance.ts",
6860+
"line": 1887
6861+
},
6862+
"methods": [
6863+
{
6864+
"docs": {
6865+
"stability": "experimental"
6866+
},
6867+
"locationInModule": {
6868+
"filename": "lib/compliance.ts",
6869+
"line": 1899
6870+
},
6871+
"name": "overrideMe",
6872+
"protected": true,
6873+
"returns": {
6874+
"type": {
6875+
"primitive": "string"
6876+
}
6877+
}
6878+
},
6879+
{
6880+
"docs": {
6881+
"stability": "experimental"
6882+
},
6883+
"locationInModule": {
6884+
"filename": "lib/compliance.ts",
6885+
"line": 1895
6886+
},
6887+
"name": "switchModes"
6888+
},
6889+
{
6890+
"docs": {
6891+
"stability": "experimental"
6892+
},
6893+
"locationInModule": {
6894+
"filename": "lib/compliance.ts",
6895+
"line": 1891
6896+
},
6897+
"name": "valueFromProtected",
6898+
"returns": {
6899+
"type": {
6900+
"primitive": "string"
6901+
}
6902+
}
6903+
}
6904+
],
6905+
"name": "OverridableProtectedMember",
6906+
"properties": [
6907+
{
6908+
"docs": {
6909+
"stability": "experimental"
6910+
},
6911+
"immutable": true,
6912+
"locationInModule": {
6913+
"filename": "lib/compliance.ts",
6914+
"line": 1888
6915+
},
6916+
"name": "overrideReadOnly",
6917+
"protected": true,
6918+
"type": {
6919+
"primitive": "string"
6920+
}
6921+
},
6922+
{
6923+
"docs": {
6924+
"stability": "experimental"
6925+
},
6926+
"locationInModule": {
6927+
"filename": "lib/compliance.ts",
6928+
"line": 1889
6929+
},
6930+
"name": "overrideReadWrite",
6931+
"protected": true,
6932+
"type": {
6933+
"primitive": "string"
6934+
}
6935+
}
6936+
]
6937+
},
68496938
"jsii-calc.OverrideReturnsObject": {
68506939
"assembly": "jsii-calc",
68516940
"docs": {
@@ -9610,5 +9699,5 @@
96109699
}
96119700
},
96129701
"version": "0.19.0",
9613-
"fingerprint": "nQMF6ipA96E38PvG3NsgKOJIb3ZEit4jNrxZAkgRlbs="
9702+
"fingerprint": "KFKFyrJ+3+cfNKWPiNetngWkPFI32ydxfJyaR43/wDI="
96149703
}

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

Lines changed: 54 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -3,70 +3,16 @@
33
import com.fasterxml.jackson.databind.ObjectMapper;
44
import com.fasterxml.jackson.databind.node.ObjectNode;
55
import org.junit.Test;
6+
import software.amazon.jsii.JsiiEngine;
67
import software.amazon.jsii.JsiiException;
7-
import software.amazon.jsii.tests.calculator.AbstractClass;
8-
import software.amazon.jsii.tests.calculator.AbstractClassReturner;
9-
import software.amazon.jsii.tests.calculator.Add;
10-
import software.amazon.jsii.tests.calculator.AllTypes;
11-
import software.amazon.jsii.tests.calculator.AllTypesEnum;
12-
import software.amazon.jsii.tests.calculator.AsyncVirtualMethods;
13-
import software.amazon.jsii.tests.calculator.Calculator;
14-
import software.amazon.jsii.tests.calculator.CalculatorProps;
15-
import software.amazon.jsii.tests.calculator.ClassWithCollections;
16-
import software.amazon.jsii.tests.calculator.ClassWithJavaReservedWords;
17-
import software.amazon.jsii.tests.calculator.ClassWithPrivateConstructorAndAutomaticProperties;
18-
import software.amazon.jsii.tests.calculator.Constructors;
19-
import software.amazon.jsii.tests.calculator.DataRenderer;
20-
import software.amazon.jsii.tests.calculator.DerivedStruct;
21-
import software.amazon.jsii.tests.calculator.DiamondInheritanceTopLevelStruct;
22-
import software.amazon.jsii.tests.calculator.DoNotOverridePrivates;
23-
import software.amazon.jsii.tests.calculator.DoubleTrouble;
24-
import software.amazon.jsii.tests.calculator.EnumDispenser;
25-
import software.amazon.jsii.tests.calculator.EraseUndefinedHashValues;
26-
import software.amazon.jsii.tests.calculator.EraseUndefinedHashValuesOptions;
27-
import software.amazon.jsii.tests.calculator.GiveMeStructs;
28-
import software.amazon.jsii.tests.calculator.GreetingAugmenter;
29-
import software.amazon.jsii.tests.calculator.IFriendlier;
30-
import software.amazon.jsii.tests.calculator.IFriendlyRandomGenerator;
31-
import software.amazon.jsii.tests.calculator.IInterfaceWithProperties;
32-
import software.amazon.jsii.tests.calculator.IPublicInterface;
33-
import software.amazon.jsii.tests.calculator.IRandomNumberGenerator;
34-
import software.amazon.jsii.tests.calculator.InbetweenClass;
35-
import software.amazon.jsii.tests.calculator.IInterfaceImplementedByAbstractClass;
36-
import software.amazon.jsii.tests.calculator.JSObjectLiteralForInterface;
37-
import software.amazon.jsii.tests.calculator.JSObjectLiteralToNative;
38-
import software.amazon.jsii.tests.calculator.JSObjectLiteralToNativeClass;
39-
import software.amazon.jsii.tests.calculator.JavaReservedWords;
40-
import software.amazon.jsii.tests.calculator.JsiiAgent;
41-
import software.amazon.jsii.tests.calculator.Multiply;
42-
import software.amazon.jsii.tests.calculator.Negate;
43-
import software.amazon.jsii.tests.calculator.NodeStandardLibrary;
44-
import software.amazon.jsii.tests.calculator.NullShouldBeTreatedAsUndefined;
45-
import software.amazon.jsii.tests.calculator.NullShouldBeTreatedAsUndefinedData;
46-
import software.amazon.jsii.tests.calculator.NumberGenerator;
47-
import software.amazon.jsii.tests.calculator.OptionalStruct;
48-
import software.amazon.jsii.tests.calculator.PartiallyInitializedThisConsumer;
49-
import software.amazon.jsii.tests.calculator.Polymorphism;
50-
import software.amazon.jsii.tests.calculator.Power;
51-
import software.amazon.jsii.tests.calculator.PublicClass;
52-
import software.amazon.jsii.tests.calculator.ReferenceEnumFromScopedPackage;
53-
import software.amazon.jsii.tests.calculator.ReturnsPrivateImplementationOfInterface;
54-
import software.amazon.jsii.tests.calculator.StableStruct;
55-
import software.amazon.jsii.tests.calculator.Statics;
56-
import software.amazon.jsii.tests.calculator.StructWithJavaReservedWords;
57-
import software.amazon.jsii.tests.calculator.Sum;
58-
import software.amazon.jsii.tests.calculator.SyncVirtualMethods;
59-
import software.amazon.jsii.tests.calculator.UnionProperties;
60-
import software.amazon.jsii.tests.calculator.UsesInterfaceWithProperties;
61-
import software.amazon.jsii.tests.calculator.VariadicMethod;
8+
import software.amazon.jsii.tests.calculator.*;
629
import software.amazon.jsii.tests.calculator.composition.CompositeOperation;
6310
import software.amazon.jsii.tests.calculator.lib.EnumFromScopedModule;
6411
import software.amazon.jsii.tests.calculator.lib.IFriendly;
6512
import software.amazon.jsii.tests.calculator.lib.MyFirstStruct;
6613
import software.amazon.jsii.tests.calculator.lib.Number;
6714
import software.amazon.jsii.tests.calculator.lib.StructWithOnlyOptionals;
6815
import software.amazon.jsii.tests.calculator.lib.Value;
69-
import software.amazon.jsii.tests.calculator.ConstructorPassesThisOut;
7016

7117
import java.io.IOException;
7218
import java.time.Instant;
@@ -88,6 +34,7 @@
8834
import static org.junit.Assert.assertSame;
8935
import static org.junit.Assert.assertTrue;
9036

37+
@SuppressWarnings("deprecated")
9138
public class ComplianceTest {
9239
/**
9340
* Verify that we can marshal and unmarshal objects without type information.
@@ -640,10 +587,16 @@ public void syncOverrides_callsSuper() {
640587

641588
@Test(expected = JsiiException.class)
642589
public void fail_syncOverrides_callsDoubleAsync_method() {
643-
SyncOverrides obj = new SyncOverrides();
644-
obj.callAsync = true;
590+
try {
591+
JsiiEngine.setQuietMode(true);
592+
593+
SyncOverrides obj = new SyncOverrides();
594+
obj.callAsync = true;
645595

646-
obj.callerIsMethod();
596+
obj.callerIsMethod();
597+
} finally {
598+
JsiiEngine.setQuietMode(false);
599+
}
647600
}
648601

649602
@Test(expected = JsiiException.class)
@@ -1360,6 +1313,48 @@ public void mapReturnedByMethodCanBeRead() {
13601313
assertThat(result.size(), is(2));
13611314
}
13621315

1316+
@Test
1317+
public void canOverrideProtectedMethod() {
1318+
final String challenge = "Cthulhu Fhtagn!";
1319+
final OverridableProtectedMember overridden = new OverridableProtectedMember() {
1320+
@Override
1321+
protected String overrideMe() {
1322+
return challenge;
1323+
}
1324+
};
1325+
assertEquals(challenge, overridden.valueFromProtected());
1326+
}
1327+
1328+
@Test
1329+
public void canOverrideProtectedGetter() {
1330+
final String challenge = "Cthulhu Fhtagn!";
1331+
final OverridableProtectedMember overridden = new OverridableProtectedMember() {
1332+
@Override
1333+
protected String getOverrideReadOnly() {
1334+
return "Cthulhu ";
1335+
}
1336+
1337+
@Override
1338+
protected String getOverrideReadWrite() {
1339+
return "Fhtagn!";
1340+
}
1341+
};
1342+
assertEquals(challenge, overridden.valueFromProtected());
1343+
}
1344+
1345+
@Test
1346+
public void canOverrideProtectedSetter() {
1347+
final String challenge = "Bazzzzzzzzzzzaar...";
1348+
final OverridableProtectedMember overridden = new OverridableProtectedMember() {
1349+
@Override
1350+
protected void setOverrideReadWrite(String value) {
1351+
super.setOverrideReadWrite("zzzzzzzzz" + value);
1352+
}
1353+
};
1354+
overridden.switchModes();
1355+
assertEquals(challenge, overridden.valueFromProtected());
1356+
}
1357+
13631358
static class PartiallyInitializedThisConsumerImpl extends PartiallyInitializedThisConsumer {
13641359
@Override
13651360
public String consumePartiallyInitializedThis(final ConstructorPassesThisOut obj,

0 commit comments

Comments
 (0)