Skip to content

Commit 21c0bca

Browse files
Chase CoalwellJordonPhillips
authored andcommitted
Use service renames (#292)
* Use service renames
1 parent dc5b386 commit 21c0bca

File tree

10 files changed

+126
-91
lines changed

10 files changed

+126
-91
lines changed

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/CodegenVisitor.java

Lines changed: 5 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import java.util.Collection;
2020
import java.util.Comparator;
2121
import java.util.HashMap;
22-
import java.util.LinkedHashMap;
2322
import java.util.List;
2423
import java.util.Map;
2524
import java.util.Objects;
@@ -29,15 +28,13 @@
2928
import java.util.logging.Logger;
3029
import software.amazon.smithy.build.FileManifest;
3130
import software.amazon.smithy.build.PluginContext;
32-
import software.amazon.smithy.codegen.core.CodegenException;
3331
import software.amazon.smithy.codegen.core.Symbol;
3432
import software.amazon.smithy.codegen.core.SymbolDependency;
3533
import software.amazon.smithy.codegen.core.SymbolProvider;
3634
import software.amazon.smithy.codegen.core.TopologicalIndex;
3735
import software.amazon.smithy.model.Model;
3836
import software.amazon.smithy.model.knowledge.TopDownIndex;
3937
import software.amazon.smithy.model.neighbor.Walker;
40-
import software.amazon.smithy.model.shapes.MemberShape;
4138
import software.amazon.smithy.model.shapes.OperationShape;
4239
import software.amazon.smithy.model.shapes.ServiceShape;
4340
import software.amazon.smithy.model.shapes.Shape;
@@ -46,10 +43,8 @@
4643
import software.amazon.smithy.model.shapes.StringShape;
4744
import software.amazon.smithy.model.shapes.StructureShape;
4845
import software.amazon.smithy.model.shapes.UnionShape;
49-
import software.amazon.smithy.model.traits.BoxTrait;
5046
import software.amazon.smithy.model.traits.EnumTrait;
5147
import software.amazon.smithy.model.traits.PaginatedTrait;
52-
import software.amazon.smithy.model.traits.Trait;
5348
import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator;
5449
import software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin;
5550
import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration;
@@ -116,7 +111,7 @@ class CodegenVisitor extends ShapeVisitor.Default<Void> {
116111
LOGGER.info(() -> "Generating TypeScript for service " + service.getId());
117112

118113
// Decorate the symbol provider using integrations.
119-
SymbolProvider resolvedProvider = TypeScriptCodegenPlugin.createSymbolProvider(model);
114+
SymbolProvider resolvedProvider = TypeScriptCodegenPlugin.createSymbolProvider(model, settings);
120115
for (TypeScriptIntegration integration : integrations) {
121116
resolvedProvider = integration.decorateSymbolProvider(settings, model, resolvedProvider);
122117
}
@@ -169,11 +164,12 @@ void execute() {
169164

170165
// Generate models that are connected to the service being generated.
171166
LOGGER.fine("Walking shapes from " + service.getId() + " to find shapes to generate");
172-
// Walk the tree and condense duplicate shapes
173-
Collection<Shape> shapeSet = condenseShapes(new Walker(nonTraits).walkShapes(service));
167+
// Walk the tree.
168+
Collection<Shape> shapeSet = new Walker(nonTraits).walkShapes(service);
169+
174170
Model prunedModel = Model.builder().addShapes(shapeSet).build();
175171

176-
// Generate models from condensed shapes
172+
// Generate models from shapes.
177173
for (Shape shape : TopologicalIndex.of(prunedModel).getOrderedShapes()) {
178174
shape.accept(this);
179175
}
@@ -416,57 +412,4 @@ private void generateCommands(ServiceShape shape) {
416412
}
417413
}
418414
}
419-
420-
private Collection<Shape> condenseShapes(Set<Shape> shapes) {
421-
Map<String, Shape> shapeMap = new LinkedHashMap<>();
422-
423-
// Check for colliding shapes and prune non-unique shapes
424-
for (Shape shape : shapes) {
425-
String shapeReference = shape.getType().toString() + shape.getId().asRelativeReference();
426-
427-
if (shapeMap.containsKey(shapeReference)) {
428-
Shape knownShape = shapeMap.get(shapeReference);
429-
if (isShapeCollision(shape, knownShape)) {
430-
throw new CodegenException(("Shape Collision: cannot condense " + shape + " and " + knownShape));
431-
}
432-
} else {
433-
shapeMap.put(shapeReference, shape);
434-
}
435-
}
436-
437-
return shapeMap.values();
438-
}
439-
440-
private boolean isShapeCollision(Shape shapeA, Shape shapeB) {
441-
// Check names match.
442-
if (!shapeA.getId().getName().equals(shapeB.getId().getName())) {
443-
return true;
444-
}
445-
446-
// Check traits match.
447-
Map<ShapeId, Trait> traitsA = new HashMap<>(shapeA.getAllTraits());
448-
Map<ShapeId, Trait> traitsB = new HashMap<>(shapeB.getAllTraits());
449-
// Ignore the box trait since it has no effect in JavaScript.
450-
traitsA.remove(BoxTrait.ID);
451-
traitsB.remove(BoxTrait.ID);
452-
if (!traitsA.equals(traitsB)) {
453-
return false;
454-
}
455-
456-
// Check members match.
457-
Collection<MemberShape> memberShapesA = shapeA.members();
458-
Collection<MemberShape> memberShapesB = shapeB.members();
459-
for (MemberShape memberShape : memberShapesA) {
460-
if (!memberShapesB.stream().anyMatch(s -> s.getMemberName().contains(memberShape.getMemberName()))) {
461-
return true;
462-
}
463-
}
464-
for (MemberShape otherMemberShape : memberShapesB) {
465-
if (!memberShapesA.stream().anyMatch(s -> s.getMemberName().contains(otherMemberShape.getMemberName()))) {
466-
return true;
467-
}
468-
}
469-
470-
return false;
471-
}
472415
}

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/SymbolVisitor.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,16 +77,18 @@ final class SymbolVisitor implements SymbolProvider, ShapeVisitor<Symbol> {
7777
private static final Logger LOGGER = Logger.getLogger(SymbolVisitor.class.getName());
7878

7979
private final Model model;
80+
private final TypeScriptSettings settings;
8081
private final ReservedWordSymbolProvider.Escaper escaper;
8182
private final Set<StructureShape> errorShapes = new HashSet<>();
8283
private final ModuleNameDelegator moduleNameDelegator;
8384

84-
SymbolVisitor(Model model) {
85-
this(model, ModuleNameDelegator.DEFAULT_CHUNK_SIZE);
85+
SymbolVisitor(Model model, TypeScriptSettings settings) {
86+
this(model, settings, ModuleNameDelegator.DEFAULT_CHUNK_SIZE);
8687
}
8788

88-
SymbolVisitor(Model model, int shapeChunkSize) {
89+
SymbolVisitor(Model model, TypeScriptSettings settings, int shapeChunkSize) {
8990
this.model = model;
91+
this.settings = settings;
9092

9193
// Load reserved words from a new-line delimited file.
9294
ReservedWords reservedWords = new ReservedWordsBuilder()
@@ -285,7 +287,7 @@ public Symbol resourceShape(ResourceShape shape) {
285287

286288
@Override
287289
public Symbol serviceShape(ServiceShape shape) {
288-
String name = StringUtils.capitalize(shape.getId().getName()) + "Client";
290+
String name = StringUtils.capitalize(shape.getId().getName(shape)) + "Client";
289291
String moduleName = moduleNameDelegator.formatModuleName(shape, name);
290292
return createGeneratedSymbolBuilder(shape, name, moduleName).build();
291293
}
@@ -368,7 +370,8 @@ public Symbol timestampShape(TimestampShape shape) {
368370
}
369371

370372
private String flattenShapeName(ToShapeId id) {
371-
return StringUtils.capitalize(id.toShapeId().getName());
373+
ServiceShape serviceShape = model.expectShape(settings.getService(), ServiceShape.class);
374+
return StringUtils.capitalize(id.toShapeId().getName(serviceShape));
372375
}
373376

374377
private Symbol.Builder createObjectSymbolBuilder(Shape shape) {

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/TypeScriptCodegenPlugin.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,10 @@ public void execute(PluginContext context) {
3939
* Creates a TypeScript symbol provider.
4040
*
4141
* @param model Model to generate symbols for.
42+
* @param settings Settings used by the plugin.
4243
* @return Returns the created provider.
4344
*/
44-
public static SymbolProvider createSymbolProvider(Model model) {
45-
return new SymbolVisitor(model);
45+
public static SymbolProvider createSymbolProvider(Model model, TypeScriptSettings settings) {
46+
return new SymbolVisitor(model, settings);
4647
}
4748
}

smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/EnumGeneratorTest.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.junit.jupiter.api.Test;
77
import software.amazon.smithy.codegen.core.Symbol;
88
import software.amazon.smithy.model.Model;
9+
import software.amazon.smithy.model.node.Node;
910
import software.amazon.smithy.model.shapes.StringShape;
1011
import software.amazon.smithy.model.traits.EnumDefinition;
1112
import software.amazon.smithy.model.traits.EnumTrait;
@@ -19,7 +20,16 @@ public void generatesNamedEnums() {
1920
.build();
2021
StringShape shape = StringShape.builder().id("com.foo#Baz").addTrait(trait).build();
2122
TypeScriptWriter writer = new TypeScriptWriter("foo");
22-
Symbol symbol = TypeScriptCodegenPlugin.createSymbolProvider(Model.builder().build()).toSymbol(shape);
23+
Model model = Model.assembler()
24+
.addShape(shape)
25+
.addImport(getClass().getResource("simple-service.smithy"))
26+
.assemble()
27+
.unwrap();
28+
TypeScriptSettings settings = TypeScriptSettings.from(model, Node.objectNodeBuilder()
29+
.withMember("package", Node.from("example"))
30+
.withMember("packageVersion", Node.from("1.0.0"))
31+
.build());
32+
Symbol symbol = TypeScriptCodegenPlugin.createSymbolProvider(model, settings).toSymbol(shape);
2333
new EnumGenerator(shape, symbol, writer).run();
2434

2535
assertThat(writer.toString(), containsString("export enum Baz {"));
@@ -35,7 +45,16 @@ public void generatesUnnamedEnums() {
3545
.build();
3646
StringShape shape = StringShape.builder().id("com.foo#Baz").addTrait(trait).build();
3747
TypeScriptWriter writer = new TypeScriptWriter("foo");
38-
Symbol symbol = TypeScriptCodegenPlugin.createSymbolProvider(Model.builder().build()).toSymbol(shape);
48+
Model model = Model.assembler()
49+
.addShape(shape)
50+
.addImport(getClass().getResource("simple-service.smithy"))
51+
.assemble()
52+
.unwrap();
53+
TypeScriptSettings settings = TypeScriptSettings.from(model, Node.objectNodeBuilder()
54+
.withMember("package", Node.from("example"))
55+
.withMember("packageVersion", Node.from("1.0.0"))
56+
.build());
57+
Symbol symbol = TypeScriptCodegenPlugin.createSymbolProvider(model, settings).toSymbol(shape);
3958
new EnumGenerator(shape, symbol, writer).run();
4059

4160
assertThat(writer.toString(), containsString("export type Baz = \"BAR\" | \"FOO\""));

smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/IndexGeneratorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public void writesIndex() {
1919
.withMember("package", Node.from("example"))
2020
.withMember("packageVersion", Node.from("1.0.0"))
2121
.build());
22-
SymbolProvider symbolProvider = TypeScriptCodegenPlugin.createSymbolProvider(model);
22+
SymbolProvider symbolProvider = TypeScriptCodegenPlugin.createSymbolProvider(model, settings);
2323
MockManifest manifest = new MockManifest();
2424

2525
IndexGenerator.writeIndex(settings, model, symbolProvider, manifest, null);

smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/RuntimeConfigGeneratorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
6868
.withMember("package", Node.from("example"))
6969
.withMember("packageVersion", Node.from("1.0.0"))
7070
.build());
71-
SymbolProvider symbolProvider = TypeScriptCodegenPlugin.createSymbolProvider(model);
71+
SymbolProvider symbolProvider = TypeScriptCodegenPlugin.createSymbolProvider(model, settings);
7272
TypeScriptDelegator delegator = new TypeScriptDelegator(
7373
settings, model, manifest, symbolProvider, integrations);
7474
RuntimeConfigGenerator generator = new RuntimeConfigGenerator(

smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/ServiceGeneratorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public void addsCustomIntegrationDependencyFields() {
2727
.withMember("packageVersion", Node.from("1.0.0"))
2828
.build());
2929
TypeScriptWriter writer = new TypeScriptWriter("./foo");
30-
SymbolProvider symbolProvider = TypeScriptCodegenPlugin.createSymbolProvider(model);
30+
SymbolProvider symbolProvider = TypeScriptCodegenPlugin.createSymbolProvider(model, settings);
3131
ApplicationProtocol applicationProtocol = ApplicationProtocol.createDefaultHttpApplicationProtocol();
3232

3333
List<TypeScriptIntegration> integrations = new ArrayList<>();

smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/StructureGeneratorTest.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -487,12 +487,18 @@ private void testErrorStructureCodegen(String file, String expectedType) {
487487
@Test
488488
public void generatesNonErrorStructures() {
489489
StructureShape struct = createNonErrorStructure();
490-
ModelAssembler assembler = Model.assembler().addShape(struct);
490+
ModelAssembler assembler = Model.assembler()
491+
.addShape(struct)
492+
.addImport(getClass().getResource("simple-service.smithy"));
491493
struct.getAllMembers().values().forEach(assembler::addShape);
492494
Model model = assembler.assemble().unwrap();
495+
TypeScriptSettings settings = TypeScriptSettings.from(model, Node.objectNodeBuilder()
496+
.withMember("package", Node.from("example"))
497+
.withMember("packageVersion", Node.from("1.0.0"))
498+
.build());
493499

494500
TypeScriptWriter writer = new TypeScriptWriter("./foo");
495-
new StructureGenerator(model, TypeScriptCodegenPlugin.createSymbolProvider(model), writer, struct).run();
501+
new StructureGenerator(model, TypeScriptCodegenPlugin.createSymbolProvider(model, settings), writer, struct).run();
496502
String output = writer.toString();
497503

498504
assertThat(output, containsString("export interface Bar {"));
@@ -510,14 +516,20 @@ private StructureShape createNonErrorStructure() {
510516
@Test
511517
public void generatesNonErrorStructuresThatExtendOtherInterfaces() {
512518
StructureShape struct = createNonErrorStructure();
513-
ModelAssembler assembler = Model.assembler().addShape(struct);
519+
ModelAssembler assembler = Model.assembler()
520+
.addShape(struct)
521+
.addImport(getClass().getResource("simple-service.smithy"));
514522
struct.getAllMembers().values().forEach(assembler::addShape);
515523
OperationShape operation = OperationShape.builder().id("com.foo#Operation").output(struct).build();
516524
assembler.addShape(operation);
517525
Model model = assembler.assemble().unwrap();
526+
TypeScriptSettings settings = TypeScriptSettings.from(model, Node.objectNodeBuilder()
527+
.withMember("package", Node.from("example"))
528+
.withMember("packageVersion", Node.from("1.0.0"))
529+
.build());
518530

519531
TypeScriptWriter writer = new TypeScriptWriter("./foo");
520-
new StructureGenerator(model, TypeScriptCodegenPlugin.createSymbolProvider(model), writer, struct).run();
532+
new StructureGenerator(model, TypeScriptCodegenPlugin.createSymbolProvider(model, settings), writer, struct).run();
521533
String output = writer.toString();
522534

523535
assertThat(output, containsString("export interface Bar {"));

0 commit comments

Comments
 (0)