Skip to content

Commit a719663

Browse files
author
Ethan Trepka
committed
Add TraceFile creation
1 parent 0dd8c14 commit a719663

File tree

8 files changed

+983
-13
lines changed

8 files changed

+983
-13
lines changed

smithy-typescript-codegen/build.gradle.kts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
* Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License").
55
* You may not use this file except in compliance with the License.
@@ -18,6 +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.0.8, 2.0[")
21+
api("software.amazon.smithy:smithy-codegen-core:[1.0.10, 2.0[")
22+
api("software.amazon.smithy:smithy-aws-traits:[1.0.8, 2.0[")
2223
implementation("software.amazon.smithy:smithy-protocol-test-traits:[1.0.8, 2.0[")
2324
}

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

Lines changed: 59 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,23 @@
2626
import java.util.ServiceLoader;
2727
import java.util.Set;
2828
import java.util.TreeSet;
29+
import java.util.UUID;
2930
import java.util.logging.Logger;
3031

32+
import software.amazon.smithy.aws.traits.ServiceTrait;
3133
import software.amazon.smithy.build.FileManifest;
3234
import software.amazon.smithy.build.PluginContext;
3335
import software.amazon.smithy.codegen.core.CodegenException;
3436
import software.amazon.smithy.codegen.core.Symbol;
3537
import software.amazon.smithy.codegen.core.SymbolDependency;
3638
import software.amazon.smithy.codegen.core.SymbolProvider;
39+
import software.amazon.smithy.codegen.core.trace.ArtifactDefinitions;
40+
import software.amazon.smithy.codegen.core.trace.TraceMetadata;
41+
import software.amazon.smithy.codegen.core.trace.TracingSymbolProvider;
3742
import software.amazon.smithy.model.Model;
3843
import software.amazon.smithy.model.knowledge.TopDownIndex;
3944
import software.amazon.smithy.model.neighbor.Walker;
45+
import software.amazon.smithy.model.node.Node;
4046
import software.amazon.smithy.model.shapes.MemberShape;
4147
import software.amazon.smithy.model.shapes.OperationShape;
4248
import software.amazon.smithy.model.shapes.ServiceShape;
@@ -100,21 +106,59 @@ class CodegenVisitor extends ShapeVisitor.Default<Void> {
100106
runtimePlugins.add(runtimePlugin);
101107
});
102108
});
109+
103110
// Sort the integrations in specified order.
104111
integrations.sort(Comparator.comparingInt(TypeScriptIntegration::getOrder));
105112

113+
// Resolve the nullable protocol generator and application protocol.
114+
protocolGenerator = resolveProtocolGenerator(integrations, service, settings);
115+
applicationProtocol = protocolGenerator == null
116+
? ApplicationProtocol.createDefaultHttpApplicationProtocol()
117+
: protocolGenerator.getApplicationProtocol();
118+
106119
// Decorate the symbol provider using integrations.
107120
SymbolProvider resolvedProvider = TypeScriptCodegenPlugin.createSymbolProvider(model);
108121
for (TypeScriptIntegration integration : integrations) {
109122
resolvedProvider = integration.decorateSymbolProvider(settings, model, resolvedProvider);
110123
}
111-
symbolProvider = SymbolProvider.cache(resolvedProvider);
112124

113-
// Resolve the nullable protocol generator and application protocol.
114-
protocolGenerator = resolveProtocolGenerator(integrations, service, settings);
115-
applicationProtocol = protocolGenerator == null
116-
? ApplicationProtocol.createDefaultHttpApplicationProtocol()
117-
: protocolGenerator.getApplicationProtocol();
125+
//Make the symbol provider a cachingSymbolProvider
126+
SymbolProvider cachedProvider = SymbolProvider.cache(resolvedProvider);
127+
// Defining Definitions for TraceFile Generation
128+
ArtifactDefinitions artifactDefinitions = ArtifactDefinitions.builder()
129+
.addType(TypeScriptShapeLinkProvider.FIELD_TYPE,
130+
"Field declaration (includes enum constants)")
131+
.addType(TypeScriptShapeLinkProvider.METHOD_TYPE, "Method declaration")
132+
.addType(TypeScriptShapeLinkProvider.TYPE_TYPE,
133+
"Class, interface (including annotation type), or enum declaration")
134+
.addTag(TypeScriptShapeLinkProvider.SERVICE_TAG, "Service client")
135+
.addTag(TypeScriptShapeLinkProvider.REQUEST_TAG, "AWS SDK request type")
136+
.addTag(TypeScriptShapeLinkProvider.RESPONSE_TAG, "AWS SDK response type")
137+
.addTag(TypeScriptShapeLinkProvider.SERIALIZER_TAG, "Command serializer")
138+
.addTag(TypeScriptShapeLinkProvider.DESERIALIZER_TAG, "Command deserializer")
139+
.build();
140+
141+
String serviceId;
142+
if (service.hasTrait(ServiceTrait.class)) {
143+
serviceId = service.getTrait(ServiceTrait.class).get().getSdkId();
144+
} else {
145+
serviceId = service.getId().getName();
146+
}
147+
TraceMetadata artifactMetadata = TraceMetadata.builder()
148+
.setTimestampAsNow()
149+
.id(serviceId)
150+
.version(UUID.randomUUID().toString())
151+
.type("TypeScript")
152+
.build();
153+
154+
155+
// Decorate the symbol provider using the trace file generator
156+
symbolProvider = TracingSymbolProvider.builder()
157+
.symbolProvider(cachedProvider)
158+
.metadata(artifactMetadata)
159+
.artifactDefinitions(artifactDefinitions)
160+
.shapeLinkCreator(new TypeScriptShapeLinkProvider())
161+
.build();
118162

119163
writers = new TypeScriptDelegator(settings, model, fileManifest, symbolProvider, integrations);
120164
}
@@ -187,6 +231,13 @@ void execute() {
187231
new HttpProtocolTestGenerator(settings, model, protocol, symbolProvider, writers).run();
188232
}
189233

234+
// Write the TraceFile.
235+
TracingSymbolProvider traceProvider = (TracingSymbolProvider) symbolProvider;
236+
String traceName = symbolProvider.toSymbol(service).getName().replace("Client", "")
237+
.toLowerCase() + ".trace.json";
238+
fileManifest.writeFile(traceName,
239+
Node.prettyPrintJson(traceProvider.buildTraceFile().toNode()));
240+
190241
// Write each pending writer.
191242
LOGGER.fine("Flushing TypeScript writers");
192243
List<SymbolDependency> dependencies = writers.getDependencies();
@@ -284,8 +335,9 @@ public Void serviceShape(ServiceShape shape) {
284335
boolean hasPaginatedOperation = false;
285336

286337
for (OperationShape operation : containedOperations) {
338+
OperationShape finalOperation = operation;
287339
writers.useShapeWriter(operation, commandWriter -> new CommandGenerator(
288-
settings, model, operation, symbolProvider, commandWriter,
340+
settings, model, finalOperation, symbolProvider, commandWriter,
289341
runtimePlugins, protocolGenerator, applicationProtocol).run());
290342
if (operation.hasTrait(PaginatedTrait.ID)) {
291343
hasPaginatedOperation = true;

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

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ public Symbol operationShape(OperationShape shape) {
231231
// Add input and output type symbols (XCommandInput / XCommandOutput).
232232
builder.putProperty("inputType", intermediate.toBuilder().name(commandName + "Input").build());
233233
builder.putProperty("outputType", intermediate.toBuilder().name(commandName + "Output").build());
234+
234235
return builder.build();
235236
}
236237

@@ -308,14 +309,20 @@ private Symbol.Builder addSmithyUseImport(Symbol.Builder builder, String name, S
308309

309310
@Override
310311
public Symbol unionShape(UnionShape shape) {
311-
return createObjectSymbolBuilder(shape).build();
312+
return createObjectSymbolBuilder(shape)
313+
.putProperty("SymbolProvider", this)
314+
.build();
312315
}
313316

314317
@Override
315318
public Symbol memberShape(MemberShape shape) {
316319
Shape targetShape = model.getShape(shape.getTarget())
317320
.orElseThrow(() -> new CodegenException("Shape not found: " + shape.getTarget()));
318-
Symbol targetSymbol = toSymbol(targetShape);
321+
Symbol targetSymbol = toSymbol(targetShape)
322+
.toBuilder()
323+
.putProperty("model", model)
324+
.putProperty("SymbolProvider", this)
325+
.build();
319326

320327
if (targetSymbol.getProperties().containsKey(EnumTrait.class.getName())) {
321328
return createMemberSymbolWithEnumTarget(targetSymbol);
@@ -363,14 +370,20 @@ private Symbol.Builder createObjectSymbolBuilder(Shape shape) {
363370
}
364371

365372
private Symbol.Builder createSymbolBuilder(Shape shape, String typeName) {
366-
return Symbol.builder().putProperty("shape", shape).name(typeName);
373+
return Symbol.builder()
374+
.putProperty("shape", shape)
375+
.putProperty("traceFileNamespace", formatModuleName(shape.getType(), null))
376+
.putProperty("traceFileNamespaceDelimiter", "/")
377+
.name(typeName);
367378
}
368379

369380
private Symbol.Builder createSymbolBuilder(Shape shape, String typeName, String namespace) {
370381
return Symbol.builder()
371382
.putProperty("shape", shape)
372383
.name(typeName)
373-
.namespace(namespace, "/");
384+
.namespace(namespace, "/")
385+
.putProperty("traceFileNamespace", formatModuleName(shape.getType(), null))
386+
.putProperty("traceFileNamespaceDelimiter", "/");
374387
}
375388

376389
private Symbol.Builder createGeneratedSymbolBuilder(Shape shape, String typeName, String namespace) {

0 commit comments

Comments
 (0)