Skip to content

Commit 6060ceb

Browse files
adamthom-amznsrchase
authored andcommitted
Update to Smithy 1.12.0 (smithy-lang#448)
Even though smithy-ts technically would move automatically to Smithy 1.12.0, this bumps up the minimum version in order to ensure the new getErrors method on OperationIndex will be available at compile time. Discovery of operation errors globally uses OperationIndex.getErrors(Operation, Service) in order to support service-bound errors, which were introduced in 1.12.0.
1 parent add43e4 commit 6060ceb

File tree

8 files changed

+35
-31
lines changed

8 files changed

+35
-31
lines changed

smithy-typescript-codegen-test/build.gradle.kts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ extra["moduleName"] = "software.amazon.smithy.typescript.codegen.test"
1919
tasks["jar"].enabled = false
2020

2121
plugins {
22-
id("software.amazon.smithy").version("0.5.2")
22+
id("software.amazon.smithy").version("0.5.3")
2323
}
2424

2525
repositories {
@@ -29,6 +29,6 @@ repositories {
2929

3030
dependencies {
3131
implementation(project(":smithy-typescript-codegen"))
32-
implementation("software.amazon.smithy:smithy-waiters:[1.5.0, 2.0[")
33-
implementation("software.amazon.smithy:smithy-protocol-test-traits:[1.5.0, 2.0[")
32+
implementation("software.amazon.smithy:smithy-waiters:[1.12.0, 2.0[")
33+
implementation("software.amazon.smithy:smithy-protocol-test-traits:[1.12.0, 2.0[")
3434
}

smithy-typescript-codegen/build.gradle.kts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ extra["displayName"] = "Smithy :: Typescript :: Codegen"
1818
extra["moduleName"] = "software.amazon.smithy.typescript.codegen"
1919

2020
dependencies {
21-
api("software.amazon.smithy:smithy-codegen-core:[1.5.0, 2.0[")
22-
api("software.amazon.smithy:smithy-waiters:[1.5.0, 2.0[")
23-
implementation("software.amazon.smithy:smithy-protocol-test-traits:[1.5.0, 2.0[")
21+
api("software.amazon.smithy:smithy-codegen-core:[1.12.0, 2.0[")
22+
api("software.amazon.smithy:smithy-waiters:[1.12.0, 2.0[")
23+
implementation("software.amazon.smithy:smithy-protocol-test-traits:[1.12.0, 2.0[")
2424
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ private void checkValidationSettings() {
262262
List<String> unvalidatedOperations = TopDownIndex.of(model)
263263
.getContainedOperations(service)
264264
.stream()
265-
.filter(o -> operationIndex.getErrors(o).stream()
265+
.filter(o -> operationIndex.getErrors(o, service).stream()
266266
.noneMatch(e -> e.getId().equals(VALIDATION_EXCEPTION_SHAPE)))
267267
.map(s -> s.getId().toString())
268268
.sorted()
@@ -467,12 +467,13 @@ private void generateServiceInterface(ServiceShape shape) {
467467
}
468468

469469
private void generateServerErrors(ServiceShape service) {
470+
final OperationIndex operationIndex = OperationIndex.of(model);
471+
470472
TopDownIndex.of(model)
471473
.getContainedOperations(service)
472474
.stream()
473-
.flatMap(o -> o.getErrors().stream())
475+
.flatMap(o -> operationIndex.getErrors(o, service).stream())
474476
.distinct()
475-
.map(id -> model.expectShape(id).asStructureShape().orElseThrow(IllegalArgumentException::new))
476477
.sorted()
477478
.forEachOrdered(error -> writers.useShapeWriter(service, symbolProvider, writer -> {
478479
new ServerErrorGenerator(settings, model, error, symbolProvider, writer).run();

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ private void generateClientOperationTests(OperationShape operation, OperationInd
174174
}
175175
});
176176
// 3. Generate test cases for each error on each operation.
177-
for (StructureShape error : operationIndex.getErrors(operation)) {
177+
for (StructureShape error : operationIndex.getErrors(operation, service)) {
178178
if (!error.hasTag("server-only")) {
179179
error.getTrait(HttpResponseTestsTrait.class).ifPresent(trait -> {
180180
for (HttpResponseTestCase testCase : trait.getTestCasesFor(AppliesTo.CLIENT)) {
@@ -208,7 +208,7 @@ private void generateServerOperationTests(OperationShape operation, OperationInd
208208
}
209209
});
210210
// 3. Generate test cases for each error on each operation.
211-
for (StructureShape error : operationIndex.getErrors(operation)) {
211+
for (StructureShape error : operationIndex.getErrors(operation, service)) {
212212
if (!error.hasTag("client-only")) {
213213
error.getTrait(HttpResponseTestsTrait.class).ifPresent(trait -> {
214214
for (HttpResponseTestCase testCase : trait.getTestCasesFor(AppliesTo.SERVER)) {

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

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import static software.amazon.smithy.typescript.codegen.CodegenUtils.getBlobStreamingMembers;
1919
import static software.amazon.smithy.typescript.codegen.CodegenUtils.writeStreamingMemberType;
2020

21+
import java.util.Collections;
2122
import java.util.Iterator;
2223
import java.util.List;
2324
import java.util.Optional;
@@ -27,7 +28,6 @@
2728
import software.amazon.smithy.model.knowledge.OperationIndex;
2829
import software.amazon.smithy.model.shapes.MemberShape;
2930
import software.amazon.smithy.model.shapes.OperationShape;
30-
import software.amazon.smithy.model.shapes.ShapeId;
3131
import software.amazon.smithy.model.shapes.StructureShape;
3232
import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator;
3333
import software.amazon.smithy.utils.SmithyInternalApi;
@@ -49,6 +49,7 @@ final class ServerCommandGenerator implements Runnable {
4949
private final Symbol errorsType;
5050
private final ProtocolGenerator protocolGenerator;
5151
private final ApplicationProtocol applicationProtocol;
52+
private final List<StructureShape> errors;
5253

5354
ServerCommandGenerator(
5455
TypeScriptSettings settings,
@@ -72,6 +73,7 @@ final class ServerCommandGenerator implements Runnable {
7273
inputType = operationSymbol.expectProperty("inputType", Symbol.class);
7374
outputType = operationSymbol.expectProperty("outputType", Symbol.class);
7475
errorsType = operationSymbol.expectProperty("errorsType", Symbol.class);
76+
errors = Collections.unmodifiableList(operationIndex.getErrors(operation, settings.getService()));
7577
}
7678

7779
@Override
@@ -135,12 +137,12 @@ private void writeOutputType(String typeName, Optional<StructureShape> outputSha
135137
}
136138

137139
private void writeErrorType() {
138-
if (operation.getErrors().isEmpty()) {
140+
if (errors.isEmpty()) {
139141
writer.write("export type $L = never;", errorsType.getName());
140142
} else {
141143
writer.writeInline("export type $L = ", errorsType.getName());
142-
for (Iterator<ShapeId> iter = operation.getErrors().iterator(); iter.hasNext();) {
143-
writer.writeInline("$T", symbolProvider.toSymbol(model.expectShape(iter.next())));
144+
for (Iterator<StructureShape> iter = errors.iterator(); iter.hasNext();) {
145+
writer.writeInline("$T", symbolProvider.toSymbol(iter.next()));
144146
if (iter.hasNext()) {
145147
writer.writeInline(" | ");
146148
}
@@ -185,12 +187,12 @@ private void writeOperationSerializer() {
185187

186188
private void writeErrorChecker() {
187189
writer.openBlock("isOperationError(error: any): error is $T {", "};", errorsType, () -> {
188-
if (operation.getErrors().isEmpty()) {
190+
if (errors.isEmpty()) {
189191
writer.write("return false;");
190192
} else {
191193
writer.writeInline("const names: $T['name'][] = [", errorsType);
192-
for (Iterator<ShapeId> iter = operation.getErrors().iterator(); iter.hasNext();) {
193-
writer.writeInline("$S", iter.next().getName());
194+
for (Iterator<StructureShape> iter = errors.iterator(); iter.hasNext();) {
195+
writer.writeInline("$S", iter.next().getId().getName());
194196
if (iter.hasNext()) {
195197
writer.writeInline(", ");
196198
}
@@ -206,12 +208,12 @@ private void writeErrorHandler() {
206208
writer.addImport("ServerSerdeContext", null, "@aws-smithy/server-common");
207209
writer.openBlock("serializeError(error: $T, ctx: ServerSerdeContext): Promise<$T> {", "}",
208210
errorsType, applicationProtocol.getResponseType(), () -> {
209-
if (operation.getErrors().isEmpty()) {
211+
if (errors.isEmpty()) {
210212
writer.write("throw error;");
211213
} else {
212214
writer.openBlock("switch (error.name) {", "}", () -> {
213-
for (ShapeId errorId : operation.getErrors()) {
214-
writeErrorHandlerCase(errorId);
215+
for (StructureShape error : errors) {
216+
writeErrorHandlerCase(error);
215217
}
216218
writer.openBlock("default: {", "}", () -> writer.write("throw error;"));
217219
});
@@ -220,13 +222,13 @@ private void writeErrorHandler() {
220222
writer.write("");
221223
}
222224

223-
private void writeErrorHandlerCase(ShapeId errorId) {
224-
Symbol errorSymbol = symbolProvider.toSymbol(model.expectShape(errorId));
225+
private void writeErrorHandlerCase(StructureShape error) {
226+
Symbol errorSymbol = symbolProvider.toSymbol(error);
225227
String serializerFunction = ProtocolGenerator.getGenericSerFunctionName(errorSymbol) + "Error";
226228
writer.addImport(serializerFunction, null,
227229
"./" + CodegenUtils.SOURCE_FOLDER + "/protocols/"
228230
+ ProtocolGenerator.getSanitizedName(protocolGenerator.getName()));
229-
writer.openBlock("case $S: {", "}", errorId.getName(), () -> {
231+
writer.openBlock("case $S: {", "}", error.getId().getName(), () -> {
230232
writer.write("return $L(error, ctx);", serializerFunction);
231233
});
232234
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ final class SymbolVisitor implements SymbolProvider, ShapeVisitor<Symbol> {
111111
// Get each structure that's used an error.
112112
OperationIndex operationIndex = OperationIndex.of(model);
113113
model.shapes(OperationShape.class).forEach(operationShape -> {
114-
errorShapes.addAll(operationIndex.getErrors(operationShape));
114+
errorShapes.addAll(operationIndex.getErrors(operationShape, settings.getService()));
115115
});
116116

117117
moduleNameDelegator = new ModuleNameDelegator(shapeChunkSize);

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/HttpBindingProtocolGenerator.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import software.amazon.smithy.model.Model;
3838
import software.amazon.smithy.model.knowledge.HttpBinding;
3939
import software.amazon.smithy.model.knowledge.HttpBindingIndex;
40+
import software.amazon.smithy.model.knowledge.OperationIndex;
4041
import software.amazon.smithy.model.knowledge.TopDownIndex;
4142
import software.amazon.smithy.model.pattern.SmithyPattern.Segment;
4243
import software.amazon.smithy.model.shapes.BlobShape;
@@ -50,7 +51,6 @@
5051
import software.amazon.smithy.model.shapes.NumberShape;
5152
import software.amazon.smithy.model.shapes.OperationShape;
5253
import software.amazon.smithy.model.shapes.Shape;
53-
import software.amazon.smithy.model.shapes.ShapeId;
5454
import software.amazon.smithy.model.shapes.StringShape;
5555
import software.amazon.smithy.model.shapes.StructureShape;
5656
import software.amazon.smithy.model.shapes.TimestampShape;
@@ -519,9 +519,7 @@ private void generateOperationResponseSerializer(
519519
});
520520
writer.write("");
521521

522-
for (ShapeId errorShapeId : operation.getErrors()) {
523-
serializingErrorShapes.add(context.getModel().expectShape(errorShapeId).asStructureShape().get());
524-
}
522+
serializingErrorShapes.addAll(OperationIndex.of(context.getModel()).getErrors(operation, context.getService()));
525523
}
526524

527525
private void calculateContentLength(GenerationContext context) {

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/HttpProtocolGeneratorUtils.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,12 @@
2727
import software.amazon.smithy.codegen.core.SymbolProvider;
2828
import software.amazon.smithy.codegen.core.SymbolReference;
2929
import software.amazon.smithy.model.knowledge.HttpBinding.Location;
30+
import software.amazon.smithy.model.knowledge.OperationIndex;
3031
import software.amazon.smithy.model.pattern.SmithyPattern;
3132
import software.amazon.smithy.model.shapes.MemberShape;
3233
import software.amazon.smithy.model.shapes.OperationShape;
3334
import software.amazon.smithy.model.shapes.Shape;
35+
import software.amazon.smithy.model.shapes.ShapeId;
3436
import software.amazon.smithy.model.shapes.StructureShape;
3537
import software.amazon.smithy.model.traits.EndpointTrait;
3638
import software.amazon.smithy.model.traits.MediaTypeTrait;
@@ -321,6 +323,7 @@ static Set<StructureShape> generateErrorDispatcher(
321323
) {
322324
TypeScriptWriter writer = context.getWriter();
323325
SymbolProvider symbolProvider = context.getSymbolProvider();
326+
OperationIndex operationIndex = OperationIndex.of(context.getModel());
324327
Set<StructureShape> errorShapes = new TreeSet<>();
325328

326329
Symbol symbol = symbolProvider.toSymbol(operation);
@@ -352,8 +355,8 @@ static Set<StructureShape> generateErrorDispatcher(
352355
errorCodeGenerator.accept(context);
353356
writer.openBlock("switch (errorCode) {", "}", () -> {
354357
// Generate the case statement for each error, invoking the specific deserializer.
355-
new TreeSet<>(operation.getErrors()).forEach(errorId -> {
356-
StructureShape error = context.getModel().expectShape(errorId).asStructureShape().get();
358+
new TreeSet<>(operationIndex.getErrors(operation, context.getService())).forEach(error -> {
359+
final ShapeId errorId = error.getId();
357360
// Track errors bound to the operation so their deserializers may be generated.
358361
errorShapes.add(error);
359362
Symbol errorSymbol = symbolProvider.toSymbol(error);

0 commit comments

Comments
 (0)