Skip to content

Commit 391def8

Browse files
authored
Change generated Getters to have a 'get' prefix (#655)
* Change generated Getters to have a 'get' prefix * Remove unused method * Fix integ tests * Use Method escaper. Fix getter names for booleans
1 parent 7134b96 commit 391def8

File tree

31 files changed

+228
-166
lines changed

31 files changed

+228
-166
lines changed

Diff for: aws/aws-service-bundle/src/main/java/software/amazon/smithy/java/aws/servicebundle/provider/AwsAuthProvider.java

+6-5
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,16 @@ public PreRequest parse(Document input) {
4242

4343
@Override
4444
public IdentityResolver<?> identityResolver(PreRequest input) {
45-
return new SdkCredentialsResolver(ProfileCredentialsProvider.create(input.awsProfileName()));
45+
return new SdkCredentialsResolver(ProfileCredentialsProvider.create(input.getAwsProfileName()));
4646
}
4747

4848
@Override
4949
public EndpointResolver endpointResolver(PreRequest input) {
5050
// TODO: error reporting
5151
return ignore -> {
52-
var endpoint = URI.create(Objects.requireNonNull(serviceMetadata.endpoints().get(input.awsRegion()),
53-
"no endpoint for region " + input.awsRegion()));
52+
var endpoint =
53+
URI.create(Objects.requireNonNull(serviceMetadata.getEndpoints().get(input.getAwsProfileName()),
54+
"no endpoint for region " + input.getAwsRegion()));
5455
return CompletableFuture.completedFuture(Endpoint.builder()
5556
.uri(endpoint)
5657
.build());
@@ -59,13 +60,13 @@ public EndpointResolver endpointResolver(PreRequest input) {
5960

6061
@Override
6162
public AuthScheme<?, ?> authScheme(PreRequest input) {
62-
return new SigV4AuthScheme(serviceMetadata.sigv4SigningName());
63+
return new SigV4AuthScheme(serviceMetadata.getSigv4SigningName());
6364
}
6465

6566
@Override
6667
public RequestOverrideConfig.Builder adaptConfig(PreRequest args) {
6768
return ConfigProvider.super.adaptConfig(args)
68-
.putConfig(RegionSetting.REGION, args.awsRegion());
69+
.putConfig(RegionSetting.REGION, args.getAwsRegion());
6970
}
7071

7172
}

Diff for: aws/aws-service-bundler/src/test/java/software/amazon/smithy/java/aws/servicebundle/bundler/AwsServiceBundlerTest.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ public class AwsServiceBundlerTest {
1717
@Test
1818
public void accessAnalyzer() {
1919
var bundler = new AwsServiceBundler("accessanalyzer-2019-11-01.json", AwsServiceBundlerTest::getModel);
20-
var bundle = bundler.bundle().config().asShape(AwsServiceMetadata.builder());
20+
var bundle = bundler.bundle().getConfig().asShape(AwsServiceMetadata.builder());
2121

22-
assertEquals("access-analyzer", bundle.sigv4SigningName());
23-
assertEquals("AccessAnalyzer", bundle.serviceName());
22+
assertEquals("access-analyzer", bundle.getSigv4SigningName());
23+
assertEquals("AccessAnalyzer", bundle.getServiceName());
2424

25-
assertNotEquals(0, bundle.endpoints().size());
25+
assertNotEquals(0, bundle.getEndpoints().size());
2626
}
2727

2828
private static String getModel(String path) {

Diff for: codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/BuilderTest.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ public void testToBuilderList() {
2222
.build();
2323
var copy = original.toBuilder().optionalList(List.of("1")).build();
2424
assertThat(copy)
25-
.returns(original.requiredList(), ListMembersInput::requiredList)
26-
.returns(List.of("1"), ListMembersInput::optionalList);
25+
.returns(original.getRequiredList(), ListMembersInput::getRequiredList)
26+
.returns(List.of("1"), ListMembersInput::getOptionalList);
2727
}
2828

2929
@Test
@@ -33,7 +33,7 @@ public void testToBuilderMap() {
3333
.build();
3434
var copy = original.toBuilder().optionalMap(Map.of("1", "2")).build();
3535
assertThat(copy)
36-
.returns(original.requiredMap(), MapMembersInput::requiredMap)
37-
.returns(Map.of("1", "2"), MapMembersInput::optionalMap);
36+
.returns(original.getRequiredMap(), MapMembersInput::getRequiredMap)
37+
.returns(Map.of("1", "2"), MapMembersInput::getOptionalMap);
3838
}
3939
}

Diff for: codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/ClientErrorCorrectionTest.java

+21-20
Original file line numberDiff line numberDiff line change
@@ -21,31 +21,32 @@
2121
import software.amazon.smithy.java.codegen.test.model.NestedIntEnum;
2222

2323
public class ClientErrorCorrectionTest {
24+
2425
@Test
2526
void correctsErrors() {
2627
var corrected = ClientErrorCorrectionInput.builder()
2728
.errorCorrection()
2829
.build();
2930

30-
assertFalse(corrected.booleanMember());
31-
assertEquals(corrected.bigDecimal(), BigDecimal.ZERO);
32-
assertEquals(corrected.bigInteger(), BigInteger.ZERO);
33-
assertEquals(corrected.byteMember(), (byte) 0);
34-
assertEquals(corrected.doubleMember(), 0);
35-
assertEquals(corrected.floatMember(), 0);
36-
assertEquals(corrected.integer(), 0);
37-
assertEquals(corrected.longMember(), 0);
38-
assertEquals(corrected.shortMember(), (short) 0);
39-
assertEquals(corrected.blob(), ByteBuffer.allocate(0));
40-
assertEquals(corrected.streamingBlob().contentLength(), 0);
41-
corrected.streamingBlob().asByteBuffer().thenAccept(bytes -> assertEquals(0, bytes.remaining()));
42-
assertNull(corrected.document());
43-
assertEquals(corrected.list(), List.of());
44-
assertEquals(corrected.map(), Map.of());
45-
assertEquals(corrected.timestamp(), Instant.EPOCH);
46-
assertEquals(corrected.enumMember().type(), NestedEnum.Type.$UNKNOWN);
47-
assertEquals(corrected.enumMember().value(), "");
48-
assertEquals(corrected.intEnum().type(), NestedIntEnum.Type.$UNKNOWN);
49-
assertEquals(corrected.intEnum().value(), 0);
31+
assertFalse(corrected.isBoolean());
32+
assertEquals(corrected.getBigDecimal(), BigDecimal.ZERO);
33+
assertEquals(corrected.getBigInteger(), BigInteger.ZERO);
34+
assertEquals(corrected.getByte(), (byte) 0);
35+
assertEquals(corrected.getDouble(), 0);
36+
assertEquals(corrected.getFloat(), 0);
37+
assertEquals(corrected.getInteger(), 0);
38+
assertEquals(corrected.getLong(), 0);
39+
assertEquals(corrected.getShort(), (short) 0);
40+
assertEquals(corrected.getBlob(), ByteBuffer.allocate(0));
41+
assertEquals(corrected.getStreamingBlob().contentLength(), 0);
42+
corrected.getStreamingBlob().asByteBuffer().thenAccept(bytes -> assertEquals(0, bytes.remaining()));
43+
assertNull(corrected.getDocument());
44+
assertEquals(corrected.getList(), List.of());
45+
assertEquals(corrected.getMap(), Map.of());
46+
assertEquals(corrected.getTimestamp(), Instant.EPOCH);
47+
assertEquals(corrected.getEnum().getType(), NestedEnum.Type.$UNKNOWN);
48+
assertEquals(corrected.getEnum().getValue(), "");
49+
assertEquals(corrected.getIntEnum().getType(), NestedIntEnum.Type.$UNKNOWN);
50+
assertEquals(corrected.getIntEnum().getValue(), 0);
5051
}
5152
}

Diff for: codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/DefaultsTest.java

+22-22
Original file line numberDiff line numberDiff line change
@@ -27,29 +27,29 @@ public class DefaultsTest {
2727
void setsCorrectDefault() {
2828
var defaults = DefaultsInput.builder().build();
2929

30-
assertTrue(defaults.booleanMember());
31-
assertEquals(defaults.bigDecimal(), BigDecimal.valueOf(1.0));
32-
assertEquals(defaults.bigInteger(), BigInteger.valueOf(1));
33-
assertEquals(defaults.byteMember(), (byte) 1);
34-
assertEquals(defaults.doubleMember(), 1.0);
35-
assertEquals(defaults.floatMember(), 1f);
36-
assertEquals(defaults.integer(), 1);
37-
assertEquals(defaults.longMember(), 1);
38-
assertEquals(defaults.shortMember(), (short) 1);
39-
assertEquals(defaults.blob(), ByteBuffer.wrap(Base64.getDecoder().decode("YmxvYg==")));
40-
defaults.streamingBlob()
30+
assertTrue(defaults.isBoolean());
31+
assertEquals(defaults.getBigDecimal(), BigDecimal.valueOf(1.0));
32+
assertEquals(defaults.getBigInteger(), BigInteger.valueOf(1));
33+
assertEquals(defaults.getByte(), (byte) 1);
34+
assertEquals(defaults.getDouble(), 1.0);
35+
assertEquals(defaults.getFloat(), 1f);
36+
assertEquals(defaults.getInteger(), 1);
37+
assertEquals(defaults.getLong(), 1);
38+
assertEquals(defaults.getShort(), (short) 1);
39+
assertEquals(defaults.getBlob(), ByteBuffer.wrap(Base64.getDecoder().decode("YmxvYg==")));
40+
defaults.getStreamingBlob()
4141
.asByteBuffer()
4242
.thenAccept(b -> assertEquals(b, ByteBuffer.wrap(Base64.getDecoder().decode("c3RyZWFtaW5n"))));
43-
assertEquals(defaults.boolDoc(), Document.of(true));
44-
assertEquals(defaults.stringDoc(), Document.of("string"));
45-
assertEquals(defaults.numberDoc(), Document.of(1));
46-
assertEquals(defaults.floatingPointnumberDoc(), Document.of(1.2));
47-
assertEquals(defaults.listDoc(), Document.of(Collections.emptyList()));
48-
assertEquals(defaults.mapDoc(), Document.of(Collections.emptyMap()));
49-
assertEquals(defaults.list(), List.of());
50-
assertEquals(defaults.map(), Map.of());
51-
assertEquals(defaults.timestamp(), Instant.parse("1985-04-12T23:20:50.52Z"));
52-
assertEquals(defaults.enumMember(), NestedEnum.A);
53-
assertEquals(defaults.intEnum(), NestedIntEnum.A);
43+
assertEquals(defaults.getBoolDoc(), Document.of(true));
44+
assertEquals(defaults.getStringDoc(), Document.of("string"));
45+
assertEquals(defaults.getNumberDoc(), Document.of(1));
46+
assertEquals(defaults.getFloatingPointnumberDoc(), Document.of(1.2));
47+
assertEquals(defaults.getListDoc(), Document.of(Collections.emptyList()));
48+
assertEquals(defaults.getMapDoc(), Document.of(Collections.emptyMap()));
49+
assertEquals(defaults.getList(), List.of());
50+
assertEquals(defaults.getMap(), Map.of());
51+
assertEquals(defaults.getTimestamp(), Instant.parse("1985-04-12T23:20:50.52Z"));
52+
assertEquals(defaults.getEnum(), NestedEnum.A);
53+
assertEquals(defaults.getIntEnum(), NestedIntEnum.A);
5454
}
5555
}

Diff for: codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/EnumTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,6 @@ void unknownTypeDeserializedIntoUnknownVariant() {
1919
try (var codec = JsonCodec.builder().useJsonName(true).useTimestampFormat(true).build()) {
2020
output = codec.deserializeShape("\"option-n\"", EnumType.builder());
2121
}
22-
assertEquals(output.type(), EnumType.Type.$UNKNOWN);
22+
assertEquals(output.getType(), EnumType.Type.$UNKNOWN);
2323
}
2424
}

Diff for: codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/ListsTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -223,8 +223,8 @@ void nullDistinctFromEmpty() {
223223
assertTrue(emptyInput.hasListOfBoolean());
224224
assertFalse(nullInput.hasListOfBoolean());
225225
// Collections should return empty collections for access
226-
assertEquals(emptyInput.listOfBoolean(), Collections.emptyList());
227-
assertEquals(emptyInput.listOfBoolean(), nullInput.listOfBoolean());
226+
assertEquals(emptyInput.getListOfBoolean(), Collections.emptyList());
227+
assertEquals(emptyInput.getListOfBoolean(), nullInput.getListOfBoolean());
228228
var emptyDocument = Document.of(emptyInput);
229229
var nullDocument = Document.of(nullInput);
230230
assertNotNull(emptyDocument.getMember("listOfBoolean"));

Diff for: codegen/codegen-core/src/it/java/software/amazon/smithy/java/codegen/test/MapsTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -248,8 +248,8 @@ void nullDistinctFromEmpty() {
248248
assertTrue(emptyInput.hasStringBooleanMap());
249249
assertFalse(nullInput.hasStringBooleanMap());
250250
// Collections should return empty collections for access
251-
assertEquals(emptyInput.stringBooleanMap(), Collections.emptyMap());
252-
assertEquals(emptyInput.stringBooleanMap(), nullInput.stringBooleanMap());
251+
assertEquals(emptyInput.getStringBooleanMap(), Collections.emptyMap());
252+
assertEquals(emptyInput.getStringBooleanMap(), nullInput.getStringBooleanMap());
253253

254254
var emptyDocument = Document.of(emptyInput);
255255
var nullDocument = Document.of(nullInput);

Diff for: codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/CodegenUtils.java

+76
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ public final class CodegenUtils {
4646
CodegenUtils.class.getResource("object-reserved-members.txt"));
4747
private static final URL SMITHY_RESERVED_MEMBERS_FILE = Objects.requireNonNull(
4848
CodegenUtils.class.getResource("smithy-reserved-members.txt"));
49+
private static final URL SMITHY_RESERVED_METHODS_FILE = Objects.requireNonNull(
50+
CodegenUtils.class.getResource("smithy-reserved-methods.txt"));
51+
52+
private static final List<String> DELIMITERS = List.of("_", "-", " ");
4953

5054
public static final ReservedWords SHAPE_ESCAPER = new ReservedWordsBuilder()
5155
.loadCaseInsensitiveWords(RESERVED_WORDS_FILE, word -> word + "Shape")
@@ -55,6 +59,9 @@ public final class CodegenUtils {
5559
.loadCaseInsensitiveWords(OBJECT_RESERVED_MEMBERS_FILE, word -> word + "Member")
5660
.loadCaseInsensitiveWords(SMITHY_RESERVED_MEMBERS_FILE, word -> word + "Member")
5761
.build();
62+
public static final ReservedWords METHODS_ESCAPER = new ReservedWordsBuilder()
63+
.loadCaseInsensitiveWords(SMITHY_RESERVED_METHODS_FILE, word -> word + "Member")
64+
.build();
5865

5966
private static final String SCHEMA_STATIC_NAME = "$SCHEMA";
6067

@@ -255,6 +262,33 @@ public static String toDefaultValueName(String memberName) {
255262
return CaseUtils.toSnakeCase(memberName).toUpperCase(Locale.ENGLISH) + "_DEFAULT";
256263
}
257264

265+
/**
266+
*
267+
* Gets the name to use when defining a member as instance variable in a class.
268+
*
269+
* @param memberShape MemberShape
270+
* @param model Model
271+
* @return Instance variable name of a member.
272+
*/
273+
public static String toMemberName(MemberShape memberShape, Model model) {
274+
return getMemberName(memberShape, model, true);
275+
}
276+
277+
/**
278+
* Gets the name to use when defining the getter method of a member.
279+
*
280+
* @param memberShape memberShape.
281+
* @return Getter method name of a member.
282+
*/
283+
public static String toGetterName(MemberShape memberShape, Model model) {
284+
var target = model.expectShape(memberShape.getTarget());
285+
var prefix = target.isBooleanShape() ? "is" : "get";
286+
var memberName = getMemberName(memberShape, model, false);
287+
var suffix =
288+
Character.toUpperCase(memberName.charAt(0)) + (memberName.length() == 1 ? "" : memberName.substring(1));
289+
return METHODS_ESCAPER.escape(prefix + suffix);
290+
}
291+
258292
/**
259293
* Gets the file name to use for the SharedSerde utility class
260294
*
@@ -449,4 +483,46 @@ public static Symbol getServiceApiSymbol(String packageNamespace, String service
449483
.declarationFile(filename)
450484
.build();
451485
}
486+
487+
private static String getMemberName(MemberShape shape, Model model, boolean escape) {
488+
Shape containerShape = model.expectShape(shape.getContainer());
489+
if (containerShape.isEnumShape() || containerShape.isIntEnumShape()) {
490+
return CaseUtils.toSnakeCase(shape.getMemberName()).toUpperCase(Locale.ENGLISH);
491+
}
492+
493+
// If a member name contains an underscore, space, or dash, convert to camel case using Smithy utility
494+
var memberName = shape.getMemberName();
495+
if (DELIMITERS.stream().anyMatch(memberName::contains)) {
496+
memberName = CaseUtils.toCamelCase(memberName);
497+
} else {
498+
memberName = uncapitalizeAcronymAware(memberName);
499+
}
500+
501+
if (escape) {
502+
memberName = CodegenUtils.MEMBER_ESCAPER.escape(memberName);
503+
}
504+
return memberName;
505+
}
506+
507+
private static String uncapitalizeAcronymAware(String str) {
508+
if (Character.isLowerCase(str.charAt(0))) {
509+
return str;
510+
} else if (str.equals(str.toUpperCase())) {
511+
return str.toLowerCase();
512+
}
513+
int strLen = str.length();
514+
StringBuilder sb = new StringBuilder(strLen);
515+
boolean nextIsUpperCase;
516+
for (int idx = 0; idx < strLen; idx++) {
517+
var currentChar = str.charAt(idx);
518+
nextIsUpperCase = (idx + 1 < strLen) && Character.isUpperCase(str.charAt(idx + 1));
519+
if (Character.isUpperCase(currentChar) && (nextIsUpperCase || idx == 0)) {
520+
sb.append(Character.toLowerCase(currentChar));
521+
} else {
522+
sb.append(currentChar);
523+
}
524+
}
525+
return sb.toString();
526+
}
527+
452528
}

Diff for: codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/JavaSymbolProvider.java

+1-36
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import java.util.ArrayList;
1515
import java.util.LinkedHashMap;
1616
import java.util.List;
17-
import java.util.Locale;
1817
import java.util.Map;
1918
import java.util.concurrent.Flow;
2019
import software.amazon.smithy.codegen.core.CodegenException;
@@ -52,7 +51,6 @@
5251
import software.amazon.smithy.model.shapes.UnionShape;
5352
import software.amazon.smithy.model.traits.StreamingTrait;
5453
import software.amazon.smithy.model.traits.UnitTypeTrait;
55-
import software.amazon.smithy.utils.CaseUtils;
5654

5755
/**
5856
* Maps Smithy types to Java Symbols
@@ -61,7 +59,6 @@ public class JavaSymbolProvider implements ShapeVisitor<Symbol>, SymbolProvider
6159

6260
private static final InternalLogger LOGGER = InternalLogger.getLogger(JavaSymbolProvider.class);
6361
private static final Symbol UNIT_SYMBOL = CodegenUtils.fromClass(Unit.class);
64-
private static final List<String> DELIMITERS = List.of("_", "-", " ");
6562

6663
private final Model model;
6764
private final ServiceShape service;
@@ -82,39 +79,7 @@ public Symbol toSymbol(Shape shape) {
8279

8380
@Override
8481
public String toMemberName(MemberShape shape) {
85-
Shape containerShape = model.expectShape(shape.getContainer());
86-
if (containerShape.isEnumShape() || containerShape.isIntEnumShape()) {
87-
return CaseUtils.toSnakeCase(shape.getMemberName()).toUpperCase(Locale.ENGLISH);
88-
}
89-
90-
// If a member name contains an underscore, space, or dash, convert to camel case using Smithy utility
91-
var memberName = shape.getMemberName();
92-
if (DELIMITERS.stream().anyMatch(memberName::contains)) {
93-
return CodegenUtils.MEMBER_ESCAPER.escape(CaseUtils.toCamelCase(memberName));
94-
}
95-
96-
return CodegenUtils.MEMBER_ESCAPER.escape(uncapitalizeAcronymAware(memberName));
97-
}
98-
99-
private static String uncapitalizeAcronymAware(String str) {
100-
if (Character.isLowerCase(str.charAt(0))) {
101-
return str;
102-
} else if (str.equals(str.toUpperCase())) {
103-
return str.toLowerCase();
104-
}
105-
int strLen = str.length();
106-
StringBuilder sb = new StringBuilder(strLen);
107-
boolean nextIsUpperCase;
108-
for (int idx = 0; idx < strLen; idx++) {
109-
var currentChar = str.charAt(idx);
110-
nextIsUpperCase = (idx + 1 < strLen) && Character.isUpperCase(str.charAt(idx + 1));
111-
if (Character.isUpperCase(currentChar) && (nextIsUpperCase || idx == 0)) {
112-
sb.append(Character.toLowerCase(currentChar));
113-
} else {
114-
sb.append(currentChar);
115-
}
116-
}
117-
return sb.toString();
82+
return CodegenUtils.toMemberName(shape, model);
11883
}
11984

12085
@Override

Diff for: codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/EnumGenerator.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -174,14 +174,14 @@ public void run() {
174174
/**
175175
* Value contained by this Enum.
176176
*/
177-
public ${value:N} value() {
177+
public ${value:N} getValue() {
178178
return value;
179179
}
180180
181181
/**
182182
* Type of this Enum variant.
183183
*/
184-
public ${type:N} type() {
184+
public ${type:N} getType() {
185185
return type;
186186
}
187187

0 commit comments

Comments
 (0)