47
47
import java .util .stream .Stream ;
48
48
49
49
import static software .amazon .polymorph .smithydotnet .DotNetNameResolver .TYPE_CONVERSION_CLASS_NAME ;
50
- import static software .amazon .polymorph .smithydotnet .DotNetNameResolver .typeConverterForCommonError ;
51
50
import static software .amazon .polymorph .smithydotnet .DotNetNameResolver .typeConverterForShape ;
52
51
import static software .amazon .polymorph .smithydotnet .TypeConversionDirection .FROM_DAFNY ;
53
52
import static software .amazon .polymorph .smithydotnet .TypeConversionDirection .TO_DAFNY ;
@@ -91,18 +90,25 @@ public Map<Path, TokenTree> generate() {
91
90
.stream ()
92
91
.map (model ::expectShape )
93
92
.map (this ::generateConverter );
94
- final Stream <TypeConverter > unmodeledConverters = Stream . of ( generateCommonExceptionConverter () );
93
+ final Stream <TypeConverter > unmodeledConverters = generateUnmodeledConverters ( );
95
94
final Stream <TypeConverter > converters = Stream .concat (modeledConverters , unmodeledConverters );
96
95
final TokenTree conversionClassBody = TokenTree .of (converters
97
96
.flatMap (typeConverter -> Stream .of (typeConverter .fromDafny , typeConverter .toDafny )))
98
97
.lineSeparated ()
99
98
.braced ();
100
99
final TokenTree conversionClass = conversionClassBody
101
100
.prepend (TokenTree .of ("internal static class" , TYPE_CONVERSION_CLASS_NAME ))
102
- .namespaced (Token .of (nameResolver . namespaceForService ()));
101
+ .namespaced (Token .of (getTypeConversionNamespace ()));
103
102
return Map .of (TYPE_CONVERSION_CLASS_PATH , conversionClass .prepend (prelude ));
104
103
}
105
104
105
+ /**
106
+ * Returns a stream of type converters for synthetic types (types that aren't defined in the model).
107
+ */
108
+ protected Stream <TypeConverter > generateUnmodeledConverters () {
109
+ return Stream .of (generateCommonExceptionConverter ());
110
+ }
111
+
106
112
/**
107
113
* Returns all shape IDs that require converters.
108
114
*/
@@ -398,7 +404,7 @@ private TypeConverter generateRegularStructureConverter(final StructureShape str
398
404
final TokenTree isSetTernaries = TokenTree .of (
399
405
ModelUtils .streamStructureMembers (structureShape )
400
406
.filter (nameResolver ::memberShapeIsOptional )
401
- .map (this ::generateIsSetTernary )
407
+ .map (this ::generateExtractOptionalMember )
402
408
).lineSeparated ();
403
409
404
410
final TokenTree constructorArgs = TokenTree .of (ModelUtils .streamStructureMembers (structureShape )
@@ -425,7 +431,7 @@ private TypeConverter generateRegularStructureConverter(final StructureShape str
425
431
* OR :
426
432
* "ToDafny_memberShape(propertyName)"
427
433
*/
428
- public String generateConstructorArg (final MemberShape memberShape ) {
434
+ private String generateConstructorArg (final MemberShape memberShape ) {
429
435
if (nameResolver .memberShapeIsOptional (memberShape )) {
430
436
return "%s(%s)" .formatted (
431
437
typeConverterForShape (memberShape .getId (), TO_DAFNY ),
@@ -440,7 +446,7 @@ public String generateConstructorArg(final MemberShape memberShape) {
440
446
* Returns:
441
447
* "type varName = value.IsSetPropertyName() ? value.PropertyName : (type) null;"
442
448
*/
443
- public TokenTree generateIsSetTernary (final MemberShape memberShape ) {
449
+ public TokenTree generateExtractOptionalMember (final MemberShape memberShape ) {
444
450
final String type = nameResolver .baseTypeForShape (memberShape .getId ());
445
451
final String varName = nameResolver .variableNameForClassProperty (memberShape );
446
452
final String isSetMethod = nameResolver .isSetMethodForStructureMember (memberShape );
@@ -699,7 +705,7 @@ cSharpType, typeConverterForShape(ShapeId.from("smithy.api#String"), FROM_DAFNY)
699
705
final TokenTree fromDafnyBody = TokenTree .of (
700
706
TokenTree .of ("switch(value)" ), fromDafnySwitchCases ).lineSeparated ();
701
707
final TokenTree fromDafnyConverterSignature = Token .of ("public static %s %s(%s value)" .formatted (
702
- cSharpType , typeConverterForCommonError (serviceShape , FROM_DAFNY ), dafnyType ));
708
+ cSharpType , nameResolver . typeConverterForCommonError (serviceShape , FROM_DAFNY ), dafnyType ));
703
709
final TokenTree fromDafnyConverterMethod = TokenTree .of (fromDafnyConverterSignature , fromDafnyBody .braced ());
704
710
705
711
// Generate the TO_DAFNY method
@@ -735,7 +741,7 @@ cSharpType, typeConverterForShape(ShapeId.from("smithy.api#String"), FROM_DAFNY)
735
741
TokenTree .of ("%s rtn;\n switch (value)\n " .formatted (nameResolver .dafnyBaseTypeForServiceError ())),
736
742
toDafnySwitchCases );
737
743
final TokenTree toDafnyConverterSignature = Token .of ("public static %s %s(System.Exception value)" .formatted (
738
- dafnyType , typeConverterForCommonError (serviceShape , TO_DAFNY )));
744
+ dafnyType , nameResolver . typeConverterForCommonError (serviceShape , TO_DAFNY )));
739
745
final TokenTree toDafnyConverterMethod = TokenTree .of (toDafnyConverterSignature , toDafnyBody .braced ());
740
746
741
747
// The Common Exception Converter is novel to Polymorph, it is not native to smithy.
@@ -793,6 +799,16 @@ protected TypeConverter buildConverterFromMethodBodies(
793
799
return new TypeConverter (shape .getId (), fromDafnyConverterMethod , toDafnyConverterMethod );
794
800
}
795
801
802
+ /**
803
+ * Returns the namespace in which to generate the type conversion class.
804
+ *
805
+ * Subclasses can override this in case it differs from the service's "main" namespace, e.g. in the case of AWS SDK
806
+ * type conversion.
807
+ */
808
+ protected String getTypeConversionNamespace () {
809
+ return nameResolver .namespaceForService ();
810
+ }
811
+
796
812
@ VisibleForTesting
797
813
public Model getModel () {
798
814
return model ;
0 commit comments