@@ -46,6 +46,10 @@ public final class CodegenUtils {
46
46
CodegenUtils .class .getResource ("object-reserved-members.txt" ));
47
47
private static final URL SMITHY_RESERVED_MEMBERS_FILE = Objects .requireNonNull (
48
48
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 ("_" , "-" , " " );
49
53
50
54
public static final ReservedWords SHAPE_ESCAPER = new ReservedWordsBuilder ()
51
55
.loadCaseInsensitiveWords (RESERVED_WORDS_FILE , word -> word + "Shape" )
@@ -55,6 +59,9 @@ public final class CodegenUtils {
55
59
.loadCaseInsensitiveWords (OBJECT_RESERVED_MEMBERS_FILE , word -> word + "Member" )
56
60
.loadCaseInsensitiveWords (SMITHY_RESERVED_MEMBERS_FILE , word -> word + "Member" )
57
61
.build ();
62
+ public static final ReservedWords METHODS_ESCAPER = new ReservedWordsBuilder ()
63
+ .loadCaseInsensitiveWords (SMITHY_RESERVED_METHODS_FILE , word -> word + "Member" )
64
+ .build ();
58
65
59
66
private static final String SCHEMA_STATIC_NAME = "$SCHEMA" ;
60
67
@@ -256,16 +263,30 @@ public static String toDefaultValueName(String memberName) {
256
263
}
257
264
258
265
/**
259
- * Gets the name to use when defining the default value of a member.
260
266
*
261
- * @param memberShape memberShape.
262
- * @return Upper snake case name of default
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.
263
272
*/
264
- public static String toGetterName (MemberShape memberShape , String memberName ) {
265
- var prefix = memberShape .isBooleanShape () ? "is" : "get" ;
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 );
266
287
var suffix =
267
288
Character .toUpperCase (memberName .charAt (0 )) + (memberName .length () == 1 ? "" : memberName .substring (1 ));
268
- return prefix + suffix ;
289
+ return METHODS_ESCAPER . escape ( prefix + suffix ) ;
269
290
}
270
291
271
292
/**
@@ -462,4 +483,46 @@ public static Symbol getServiceApiSymbol(String packageNamespace, String service
462
483
.declarationFile (filename )
463
484
.build ();
464
485
}
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
+
465
528
}
0 commit comments