44 */
55package software .amazon .smithy .model .transform .plugins ;
66
7- import static java .util .stream .Collectors .groupingBy ;
8- import static java .util .stream .Collectors .mapping ;
9-
107import java .util .ArrayList ;
118import java .util .Collection ;
9+ import java .util .HashMap ;
1210import java .util .HashSet ;
1311import java .util .List ;
1412import java .util .Map ;
1513import java .util .Optional ;
1614import java .util .Set ;
1715import java .util .function .Function ;
18- import java .util .stream .Collectors ;
1916import software .amazon .smithy .model .Model ;
2017import software .amazon .smithy .model .shapes .EnumShape ;
2118import software .amazon .smithy .model .shapes .IntEnumShape ;
2623import software .amazon .smithy .model .shapes .UnionShape ;
2724import software .amazon .smithy .model .transform .ModelTransformer ;
2825import software .amazon .smithy .model .transform .ModelTransformerPlugin ;
29- import software .amazon .smithy .utils .OptionalUtils ;
30- import software .amazon .smithy .utils .Pair ;
3126
3227/**
3328 * Cleans up structure, union, enum, and intEnum shapes after shapes are removed.
@@ -59,31 +54,39 @@ private Model removeMembersFromContainers(ModelTransformer transformer, Collecti
5954 private Collection <Shape > getEnumReplacements (Model model , Collection <Shape > removed ) {
6055 return createUpdatedShapes (model , removed , Shape ::asEnumShape , entry -> {
6156 EnumShape .Builder builder = entry .getKey ().toBuilder ();
62- entry .getValue ().forEach (member -> builder .removeMember (member .getMemberName ()));
57+ for (MemberShape member : entry .getValue ()) {
58+ builder .removeMember (member .getMemberName ());
59+ }
6360 return builder .build ();
6461 });
6562 }
6663
6764 private Collection <Shape > getIntEnumReplacements (Model model , Collection <Shape > removed ) {
6865 return createUpdatedShapes (model , removed , Shape ::asIntEnumShape , entry -> {
6966 IntEnumShape .Builder builder = entry .getKey ().toBuilder ();
70- entry .getValue ().forEach (member -> builder .removeMember (member .getMemberName ()));
67+ for (MemberShape member : entry .getValue ()) {
68+ builder .removeMember (member .getMemberName ());
69+ }
7170 return builder .build ();
7271 });
7372 }
7473
7574 private Collection <Shape > getStructureReplacements (Model model , Collection <Shape > removed ) {
7675 return createUpdatedShapes (model , removed , Shape ::asStructureShape , entry -> {
7776 StructureShape .Builder builder = entry .getKey ().toBuilder ();
78- entry .getValue ().forEach (member -> builder .removeMember (member .getMemberName ()));
77+ for (MemberShape member : entry .getValue ()) {
78+ builder .removeMember (member .getMemberName ());
79+ }
7980 return builder .build ();
8081 });
8182 }
8283
8384 private Collection <Shape > getUnionReplacements (Model model , Collection <Shape > removed ) {
8485 return createUpdatedShapes (model , removed , Shape ::asUnionShape , entry -> {
8586 UnionShape .Builder builder = entry .getKey ().toBuilder ();
86- entry .getValue ().forEach (member -> builder .removeMember (member .getMemberName ()));
87+ for (MemberShape member : entry .getValue ()) {
88+ builder .removeMember (member .getMemberName ());
89+ }
8790 return builder .build ();
8891 });
8992 }
@@ -115,16 +118,24 @@ private <S extends Shape> Collection<Shape> createUpdatedShapes(
115118 Function <Shape , Optional <S >> containerShapeMapper ,
116119 Function <Map .Entry <S , List <MemberShape >>, S > entryMapperAndFactory
117120 ) {
118- return removed .stream ()
119- .flatMap (shape -> OptionalUtils .stream (shape .asMemberShape ()))
120- .flatMap (member -> OptionalUtils .stream (model .getShape (member .getContainer ())
121- .flatMap (containerShapeMapper )
122- .map (container -> Pair .of (container , member ))))
123- .collect (groupingBy (Pair ::getLeft , mapping (Pair ::getRight , Collectors .toList ())))
124- .entrySet ()
125- .stream ()
126- .map (entryMapperAndFactory )
127- .collect (Collectors .toList ());
121+ Map <S , List <MemberShape >> containerMemberMap = new HashMap <>();
122+ for (Shape shape : removed ) {
123+ if (!shape .isMemberShape ()) {
124+ continue ;
125+ }
126+
127+ MemberShape member = (MemberShape ) shape ;
128+ Optional <S > container = model .getShape (member .getContainer ()).flatMap (containerShapeMapper );
129+ if (container .isPresent ()) {
130+ containerMemberMap .computeIfAbsent (container .get (), k -> new ArrayList <>()).add (member );
131+ }
132+ }
133+
134+ Collection <Shape > updatedShapes = new ArrayList <>();
135+ for (Map .Entry <S , List <MemberShape >> entry : containerMemberMap .entrySet ()) {
136+ updatedShapes .add (entryMapperAndFactory .apply (entry ));
137+ }
138+ return updatedShapes ;
128139 }
129140
130141 /**
@@ -137,16 +148,26 @@ private <S extends Shape> Collection<Shape> createUpdatedShapes(
137148 * their target was removed.
138149 */
139150 private Collection <Shape > findMembersThatNeedRemoval (Model model , Collection <Shape > removed ) {
140- Set <ShapeId > removedIds = removed .stream ().map (Shape ::getId ).collect (Collectors .toSet ());
151+ Set <ShapeId > removedIds = new HashSet <>();
152+ for (Shape shape : removed ) {
153+ removedIds .add (shape .getId ());
154+ }
155+
141156 Collection <Shape > removeMembers = new HashSet <>();
142- model .shapes (StructureShape .class )
143- .flatMap (shape -> shape .getAllMembers ().values ().stream ())
144- .filter (value -> removedIds .contains (value .getTarget ()))
145- .forEach (removeMembers ::add );
146- model .shapes (UnionShape .class )
147- .flatMap (shape -> shape .getAllMembers ().values ().stream ())
148- .filter (value -> removedIds .contains (value .getTarget ()))
149- .forEach (removeMembers ::add );
157+ for (StructureShape structure : model .getStructureShapes ()) {
158+ for (MemberShape member : structure .members ()) {
159+ if (removedIds .contains (member .getTarget ())) {
160+ removeMembers .add (member );
161+ }
162+ }
163+ }
164+ for (UnionShape structure : model .getUnionShapes ()) {
165+ for (MemberShape member : structure .members ()) {
166+ if (removedIds .contains (member .getTarget ())) {
167+ removeMembers .add (member );
168+ }
169+ }
170+ }
150171 return removeMembers ;
151172 }
152173}
0 commit comments