@@ -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
@@ -255,6 +262,33 @@ public static String toDefaultValueName(String memberName) {
255
262
return CaseUtils .toSnakeCase (memberName ).toUpperCase (Locale .ENGLISH ) + "_DEFAULT" ;
256
263
}
257
264
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
+
258
292
/**
259
293
* Gets the file name to use for the SharedSerde utility class
260
294
*
@@ -449,4 +483,46 @@ public static Symbol getServiceApiSymbol(String packageNamespace, String service
449
483
.declarationFile (filename )
450
484
.build ();
451
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
+
452
528
}
0 commit comments