Skip to content

Commit 939599c

Browse files
author
Ethan Trepka
committed
Add TraceFile creation
1 parent cfe6e60 commit 939599c

File tree

8 files changed

+984
-13
lines changed

8 files changed

+984
-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: 60 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +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;
31+
32+
import software.amazon.smithy.aws.traits.ServiceTrait;
3033
import software.amazon.smithy.build.FileManifest;
3134
import software.amazon.smithy.build.PluginContext;
3235
import software.amazon.smithy.codegen.core.CodegenException;
3336
import software.amazon.smithy.codegen.core.Symbol;
3437
import software.amazon.smithy.codegen.core.SymbolDependency;
3538
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;
3642
import software.amazon.smithy.model.Model;
3743
import software.amazon.smithy.model.knowledge.TopDownIndex;
3844
import software.amazon.smithy.model.neighbor.Walker;
45+
import software.amazon.smithy.model.node.Node;
3946
import software.amazon.smithy.model.shapes.MemberShape;
4047
import software.amazon.smithy.model.shapes.OperationShape;
4148
import software.amazon.smithy.model.shapes.ServiceShape;
@@ -96,21 +103,59 @@ class CodegenVisitor extends ShapeVisitor.Default<Void> {
96103
runtimePlugins.add(runtimePlugin);
97104
});
98105
});
106+
99107
// Sort the integrations in specified order.
100108
integrations.sort(Comparator.comparingInt(TypeScriptIntegration::getOrder));
101109

110+
// Resolve the nullable protocol generator and application protocol.
111+
protocolGenerator = resolveProtocolGenerator(integrations, service, settings);
112+
applicationProtocol = protocolGenerator == null
113+
? ApplicationProtocol.createDefaultHttpApplicationProtocol()
114+
: protocolGenerator.getApplicationProtocol();
115+
102116
// Decorate the symbol provider using integrations.
103117
SymbolProvider resolvedProvider = TypeScriptCodegenPlugin.createSymbolProvider(model);
104118
for (TypeScriptIntegration integration : integrations) {
105119
resolvedProvider = integration.decorateSymbolProvider(settings, model, resolvedProvider);
106120
}
107-
symbolProvider = SymbolProvider.cache(resolvedProvider);
108121

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

115160
writers = new TypeScriptDelegator(settings, model, fileManifest, symbolProvider, integrations);
116161
}
@@ -183,6 +228,13 @@ void execute() {
183228
new HttpProtocolTestGenerator(settings, model, protocol, symbolProvider, writers).run();
184229
}
185230

231+
// Write the TraceFile.
232+
TracingSymbolProvider traceProvider = (TracingSymbolProvider) symbolProvider;
233+
String traceName = symbolProvider.toSymbol(service).getName().replace("Client", "")
234+
.toLowerCase() + ".trace.json";
235+
fileManifest.writeFile(traceName,
236+
Node.prettyPrintJson(traceProvider.buildTraceFile().toNode()));
237+
186238
// Write each pending writer.
187239
LOGGER.fine("Flushing TypeScript writers");
188240
List<SymbolDependency> dependencies = writers.getDependencies();
@@ -278,8 +330,9 @@ public Void serviceShape(ServiceShape shape) {
278330
TopDownIndex topDownIndex = model.getKnowledge(TopDownIndex.class);
279331
Set<OperationShape> containedOperations = new TreeSet<>(topDownIndex.getContainedOperations(service));
280332
for (OperationShape operation : containedOperations) {
333+
OperationShape finalOperation = operation;
281334
writers.useShapeWriter(operation, commandWriter -> new CommandGenerator(
282-
settings, model, operation, symbolProvider, commandWriter,
335+
settings, model, finalOperation, symbolProvider, commandWriter,
283336
runtimePlugins, protocolGenerator, applicationProtocol).run());
284337
}
285338

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)