Skip to content

Commit 9f8883f

Browse files
author
Chase Coalwell
committed
Add TraceFile creation
1 parent 2b8c66a commit 9f8883f

File tree

8 files changed

+984
-11
lines changed

8 files changed

+984
-11
lines changed

smithy-typescript-codegen/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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-aws-traits:[1.7.2, 2.0[")
2122
api("software.amazon.smithy:smithy-codegen-core:[1.5.0, 2.0[")
2223
api("software.amazon.smithy:smithy-waiters:[1.5.0, 2.0[")
2324
implementation("software.amazon.smithy:smithy-protocol-test-traits:[1.5.0, 2.0[")

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

Lines changed: 61 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,22 @@
2525
import java.util.ServiceLoader;
2626
import java.util.Set;
2727
import java.util.TreeSet;
28+
import java.util.UUID;
2829
import java.util.logging.Logger;
30+
import software.amazon.smithy.aws.traits.ServiceTrait;
2931
import software.amazon.smithy.build.FileManifest;
3032
import software.amazon.smithy.build.PluginContext;
3133
import software.amazon.smithy.codegen.core.Symbol;
3234
import software.amazon.smithy.codegen.core.SymbolDependency;
3335
import software.amazon.smithy.codegen.core.SymbolProvider;
3436
import software.amazon.smithy.codegen.core.TopologicalIndex;
37+
import software.amazon.smithy.codegen.core.trace.ArtifactDefinitions;
38+
import software.amazon.smithy.codegen.core.trace.TraceMetadata;
39+
import software.amazon.smithy.codegen.core.trace.TracingSymbolProvider;
3540
import software.amazon.smithy.model.Model;
3641
import software.amazon.smithy.model.knowledge.TopDownIndex;
3742
import software.amazon.smithy.model.neighbor.Walker;
43+
import software.amazon.smithy.model.node.Node;
3844
import software.amazon.smithy.model.shapes.OperationShape;
3945
import software.amazon.smithy.model.shapes.ServiceShape;
4046
import software.amazon.smithy.model.shapes.Shape;
@@ -93,6 +99,7 @@ class CodegenVisitor extends ShapeVisitor.Default<Void> {
9399
runtimePlugins.add(runtimePlugin);
94100
});
95101
});
102+
96103
// Sort the integrations in specified order.
97104
integrations.sort(Comparator.comparingInt(TypeScriptIntegration::getOrder));
98105

@@ -113,19 +120,55 @@ class CodegenVisitor extends ShapeVisitor.Default<Void> {
113120
fileManifest = context.getFileManifest();
114121
LOGGER.info(() -> String.format("Generating TypeScript %s for service %s",
115122
settings.generateClient() ? "client" : "server", service.getId()));
123+
// Resolve the nullable protocol generator and application protocol.
124+
protocolGenerator = resolveProtocolGenerator(integrations, service, settings);
125+
applicationProtocol = protocolGenerator == null
126+
? ApplicationProtocol.createDefaultHttpApplicationProtocol()
127+
: protocolGenerator.getApplicationProtocol();
116128

117129
// Decorate the symbol provider using integrations.
118130
SymbolProvider resolvedProvider = artifactType.createSymbolProvider(model, settings);
119131
for (TypeScriptIntegration integration : integrations) {
120132
resolvedProvider = integration.decorateSymbolProvider(settings, model, resolvedProvider);
121133
}
122-
symbolProvider = SymbolProvider.cache(resolvedProvider);
123134

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

130173
writers = new TypeScriptDelegator(settings, model, fileManifest, symbolProvider, integrations);
131174
}
@@ -212,6 +255,13 @@ void execute() {
212255
settings, model, protocol, symbolProvider, writers, protocolGenerator).run();
213256
}
214257

258+
// Write the TraceFile.
259+
TracingSymbolProvider traceProvider = (TracingSymbolProvider) symbolProvider;
260+
String traceName = symbolProvider.toSymbol(service).getName().replace("Client", "")
261+
.toLowerCase() + ".trace.json";
262+
fileManifest.writeFile(traceName,
263+
Node.prettyPrintJson(traceProvider.buildTraceFile().toNode()));
264+
215265
// Write each pending writer.
216266
LOGGER.fine("Flushing TypeScript writers");
217267
List<SymbolDependency> dependencies = writers.getDependencies();
@@ -372,6 +422,10 @@ private void generateClient(ServiceShape shape) {
372422
boolean hasPaginatedOperation = false;
373423

374424
for (OperationShape operation : containedOperations) {
425+
OperationShape finalOperation = operation;
426+
writers.useShapeWriter(operation, commandWriter -> new CommandGenerator(
427+
settings, model, finalOperation, symbolProvider, commandWriter,
428+
runtimePlugins, protocolGenerator, applicationProtocol).run());
375429
if (operation.hasTrait(PaginatedTrait.ID)) {
376430
hasPaginatedOperation = true;
377431
String outputFilename = PaginationGenerator.getOutputFilelocation(operation);
@@ -428,7 +482,7 @@ private void generateCommands(ServiceShape shape) {
428482
TopDownIndex topDownIndex = TopDownIndex.of(model);
429483
Set<OperationShape> containedOperations = new TreeSet<>(topDownIndex.getContainedOperations(shape));
430484
for (OperationShape operation : containedOperations) {
431-
// Right now this only generates stubs
485+
// Right now this only generates stubs.
432486
if (settings.generateClient()) {
433487
writers.useShapeWriter(operation, commandWriter -> new CommandGenerator(
434488
settings, model, operation, symbolProvider, commandWriter,

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
@@ -250,6 +250,7 @@ public Symbol operationShape(OperationShape shape) {
250250
// Add input and output type symbols (XCommandInput / XCommandOutput).
251251
builder.putProperty("inputType", intermediate.toBuilder().name(commandName + "Input").build());
252252
builder.putProperty("outputType", intermediate.toBuilder().name(commandName + "Output").build());
253+
253254
return builder.build();
254255
}
255256

@@ -327,14 +328,20 @@ private Symbol.Builder addSmithyUseImport(Symbol.Builder builder, String name, S
327328

328329
@Override
329330
public Symbol unionShape(UnionShape shape) {
330-
return createObjectSymbolBuilder(shape).build();
331+
return createObjectSymbolBuilder(shape)
332+
.putProperty("SymbolProvider", this)
333+
.build();
331334
}
332335

333336
@Override
334337
public Symbol memberShape(MemberShape shape) {
335338
Shape targetShape = model.getShape(shape.getTarget())
336339
.orElseThrow(() -> new CodegenException("Shape not found: " + shape.getTarget()));
337-
Symbol targetSymbol = toSymbol(targetShape);
340+
Symbol targetSymbol = toSymbol(targetShape)
341+
.toBuilder()
342+
.putProperty("model", model)
343+
.putProperty("SymbolProvider", this)
344+
.build();
338345

339346
if (targetSymbol.getProperties().containsKey(EnumTrait.class.getName())) {
340347
return createMemberSymbolWithEnumTarget(targetSymbol);
@@ -383,14 +390,20 @@ private Symbol.Builder createObjectSymbolBuilder(Shape shape) {
383390
}
384391

385392
private Symbol.Builder createSymbolBuilder(Shape shape, String typeName) {
386-
return Symbol.builder().putProperty("shape", shape).name(typeName);
393+
return Symbol.builder()
394+
.putProperty("shape", shape)
395+
.putProperty("traceFileNamespace", moduleNameDelegator.formatModuleName(shape, null))
396+
.putProperty("traceFileNamespaceDelimiter", "/")
397+
.name(typeName);
387398
}
388399

389400
private Symbol.Builder createSymbolBuilder(Shape shape, String typeName, String namespace) {
390401
return Symbol.builder()
391402
.putProperty("shape", shape)
392403
.name(typeName)
393-
.namespace(namespace, "/");
404+
.namespace(namespace, "/")
405+
.putProperty("traceFileNamespace", moduleNameDelegator.formatModuleName(shape, null))
406+
.putProperty("traceFileNamespaceDelimiter", "/");
394407
}
395408

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

0 commit comments

Comments
 (0)