Skip to content

Commit abdf7d2

Browse files
committed
Don't regenerate Schemas of external types
1 parent 38afeb7 commit abdf7d2

File tree

8 files changed

+67
-19
lines changed

8 files changed

+67
-19
lines changed

codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/SchemaFieldOrder.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import software.amazon.smithy.codegen.core.TopologicalIndex;
2323
import software.amazon.smithy.codegen.core.directed.Directive;
2424
import software.amazon.smithy.java.codegen.CodegenUtils;
25+
import software.amazon.smithy.java.codegen.SymbolProperties;
2526
import software.amazon.smithy.java.codegen.writer.JavaWriter;
2627
import software.amazon.smithy.java.core.schema.PreludeSchemas;
2728
import software.amazon.smithy.model.loader.Prelude;
@@ -77,7 +78,9 @@ public SchemaFieldOrder(Directive<?> directive, long partitionThreshold, SymbolP
7778
shapeFieldName = toFullQualifiedSchemaName(shape);
7879
}
7980
boolean isShapeRecursive = CodegenUtils.recursiveShape(directive.model(), shape);
80-
var shapeField = new SchemaField(shape, shapeFieldName, curClassName, isShapeRecursive);
81+
boolean isExternal =
82+
symbolProvider.toSymbol(shape).getProperty(SymbolProperties.EXTERNAL_TYPE).orElse(false);
83+
var shapeField = new SchemaField(shape, shapeFieldName, curClassName, isShapeRecursive, isExternal);
8184
curParition.add(shapeField);
8285
curFieldNames.add(shapeFieldName);
8386
if (isShapeRecursive) {
@@ -109,6 +112,8 @@ public String getSchemaFieldName(Shape shape, JavaWriter writer) {
109112
SchemaField schemaField = this.getSchemaField(shape.getId());
110113
if (schemaField == null) {
111114
return getSchemaType(writer, symbolProvider, shape);
115+
} else if (schemaField.isExternal()) {
116+
return writer.format("$L.$$SCHEMA", symbolProvider.toSymbol(shape));
112117
}
113118
return writer.format("$L.$L", schemaField.className(), schemaField.fieldName());
114119
}
@@ -140,5 +145,5 @@ private static String toFullQualifiedSchemaName(Shape shape) {
140145
.toUpperCase(Locale.ENGLISH);
141146
}
142147

143-
record SchemaField(Shape shape, String fieldName, String className, boolean isRecursive) {}
148+
record SchemaField(Shape shape, String fieldName, String className, boolean isRecursive, boolean isExternal) {}
144149
}

codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/generators/SchemasGenerator.java

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,16 @@
55

66
package software.amazon.smithy.java.codegen.generators;
77

8+
import static java.util.function.Predicate.not;
9+
810
import java.util.List;
911
import java.util.function.Consumer;
1012
import software.amazon.smithy.codegen.core.directed.ContextualDirective;
1113
import software.amazon.smithy.codegen.core.directed.CustomizeDirective;
1214
import software.amazon.smithy.java.codegen.CodeGenerationContext;
1315
import software.amazon.smithy.java.codegen.CodegenUtils;
1416
import software.amazon.smithy.java.codegen.JavaCodegenSettings;
17+
import software.amazon.smithy.java.codegen.generators.SchemaFieldOrder.SchemaField;
1518
import software.amazon.smithy.java.codegen.writer.JavaWriter;
1619
import software.amazon.smithy.java.core.schema.Schema;
1720
import software.amazon.smithy.java.core.schema.SchemaBuilder;
@@ -70,7 +73,10 @@ final class ${className:L} {
7073
}
7174
""";
7275
var recursiveShapes =
73-
shapeOrder.stream().filter(SchemaFieldOrder.SchemaField::isRecursive).toList();
76+
shapeOrder.stream()
77+
.filter(SchemaField::isRecursive)
78+
.filter(not(SchemaField::isExternal))
79+
.toList();
7480
var builders = recursiveShapes.stream()
7581
.map(s -> new SchemaBuilderGenerator(writer,
7682
s,
@@ -95,14 +101,14 @@ final class ${className:L} {
95101

96102
private static final class StaticSchemaFieldsGenerator implements Runnable {
97103
private final JavaWriter writer;
98-
private final List<SchemaFieldOrder.SchemaField> schemaFields;
104+
private final List<SchemaField> schemaFields;
99105
private final CodeGenerationContext context;
100106
private final ContextualDirective<CodeGenerationContext, ?> directive;
101107
private boolean insideStaticBlock;
102108

103109
private StaticSchemaFieldsGenerator(
104110
ContextualDirective<CodeGenerationContext, ?> directive,
105-
List<SchemaFieldOrder.SchemaField> schemaFields,
111+
List<SchemaField> schemaFields,
106112
JavaWriter writer
107113
) {
108114
this.directive = directive;
@@ -115,7 +121,10 @@ private StaticSchemaFieldsGenerator(
115121
@Override
116122
public void run() {
117123
writer.pushState();
118-
for (SchemaFieldOrder.SchemaField schemaField : schemaFields) {
124+
for (SchemaField schemaField : schemaFields) {
125+
if (schemaField.isExternal()) {
126+
continue;
127+
}
119128
if (schemaField.isRecursive() && !insideStaticBlock) {
120129
insideStaticBlock = true;
121130
writer.openBlock("\nstatic {");
@@ -142,14 +151,14 @@ public void run() {
142151
private static final class StaticSchemaFieldGenerator extends ShapeVisitor.Default<Void> {
143152

144153
private final JavaWriter writer;
145-
private final SchemaFieldOrder.SchemaField schemaField;
154+
private final SchemaField schemaField;
146155
private final ContextualDirective<CodeGenerationContext, ?> directive;
147156
private final Model model;
148157
private final CodeGenerationContext context;
149158

150159
private StaticSchemaFieldGenerator(
151160
JavaWriter writer,
152-
SchemaFieldOrder.SchemaField schemaField,
161+
SchemaField schemaField,
153162
ContextualDirective<CodeGenerationContext, ?> directive
154163
) {
155164
this.writer = writer;
@@ -362,11 +371,11 @@ private static final class SchemaBuilderGenerator extends ShapeVisitor.Default<V
362371
private final Shape shape;
363372
private final Model model;
364373
private final CodeGenerationContext context;
365-
private final SchemaFieldOrder.SchemaField schemaField;
374+
private final SchemaField schemaField;
366375

367376
SchemaBuilderGenerator(
368377
JavaWriter writer,
369-
SchemaFieldOrder.SchemaField schemaField,
378+
SchemaField schemaField,
370379
Model model,
371380
CodeGenerationContext context
372381
) {
@@ -424,7 +433,7 @@ public Void unionShape(UnionShape shape) {
424433
}
425434
}
426435

427-
private record ResolverGenerator(JavaWriter writer, SchemaFieldOrder.SchemaField schemaField) implements Runnable {
436+
private record ResolverGenerator(JavaWriter writer, SchemaField schemaField) implements Runnable {
428437

429438
@Override
430439
public void run() {

codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/integrations/externaltypes/ExternalTypesIntegration.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@
3131
@SmithyInternalApi
3232
public final class ExternalTypesIntegration implements JavaCodegenIntegration {
3333
private static final String PROPERTY_FILE = "META-INF/smithy-java/type-mappings.properties";
34-
private static final Map<ShapeId, Symbol> TYPE_MAPPINGS = getErrorMappings();
34+
private static final Map<ShapeId, Symbol> TYPE_MAPPINGS = getTypeMappings();
3535

36-
private static Map<ShapeId, Symbol> getErrorMappings() {
36+
private static Map<ShapeId, Symbol> getTypeMappings() {
3737
try {
3838
Map<ShapeId, Symbol> result = new HashMap<>();
3939
var classLoader = ExternalTypesIntegration.class.getClassLoader();
@@ -49,7 +49,7 @@ private static Map<ShapeId, Symbol> getErrorMappings() {
4949
var symbol = CodegenUtils.fromClass(shapeClass)
5050
.toBuilder()
5151
.putProperty(SymbolProperties.EXTERNAL_TYPE, true)
52-
.build();;
52+
.build();
5353
var existing = result.put(shapeId, symbol);
5454
if (existing != null) {
5555
throw new CodegenException(

examples/standalone-types/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ dependencies {
99

1010
smithyBuild("software.amazon.smithy.java:plugins:$smithyJavaVersion")
1111
api("software.amazon.smithy.java:core:$smithyJavaVersion")
12+
api("software.amazon.smithy.java:framework-errors:$smithyJavaVersion")
1213

1314
testImplementation("org.hamcrest:hamcrest:3.0")
1415
testImplementation("org.junit.jupiter:junit-jupiter:5.12.2")

examples/standalone-types/model/person.smithy

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ $version: "2"
22

33
namespace smithy.example
44

5+
use smithy.framework#ValidationException
6+
57
structure Human {
68
children: HumanList
79

@@ -29,3 +31,7 @@ structure Parents {
2931
structure Address {
3032
city: String
3133
}
34+
35+
structure HumanValidationException {
36+
cause: ValidationException
37+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package software.amazon.smithy.java.example;
2+
3+
import org.junit.jupiter.api.Test;
4+
import software.amazon.smithy.java.core.schema.Schema;
5+
import software.amazon.smithy.java.core.schema.SerializableStruct;
6+
import software.amazon.smithy.java.core.serde.SpecificShapeSerializer;
7+
import software.amazon.smithy.java.example.standalone.model.HumanValidationException;
8+
import software.amazon.smithy.java.framework.model.ValidationException;
9+
10+
class ExternalTypesTest {
11+
12+
@Test
13+
void verifySchemasAreNotRegenerated() {
14+
HumanValidationException.builder().cause(ValidationException.builder().message("Test").build()).build().serializeMembers(new SpecificShapeSerializer() {
15+
16+
@Override
17+
public void writeStruct(Schema schema, SerializableStruct struct) {
18+
schema.assertMemberTargetIs(ValidationException.$SCHEMA);
19+
}
20+
});
21+
}
22+
}

jmespath/src/main/java/software/amazon/smithy/java/jmespath/JMESPathFunction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ protected Document applyImpl(List<Document> arguments, ExpressionTypeExpression
429429
}
430430
}
431431
case SHORT, BYTE, INTEGER, INT_ENUM, LONG, FLOAT, DOUBLE, BIG_DECIMAL, BIG_INTEGER ->
432-
Document.ofNumber(argument.asNumber());
432+
Document.ofNumber(argument.asNumber());
433433
default -> null;
434434
};
435435
}

jmespath/src/test/java/software/amazon/smithy/java/jmespath/ComplianceTestRunner.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -168,16 +168,21 @@ private static boolean isEqual(Document expected, Document actual) {
168168
} else if (isNumeric(expected) && isNumeric(actual)) {
169169
// Normalize all numbers to BigDecimal to make comparisons work.
170170
return new BigDecimal(expected.asNumber().toString())
171-
.compareTo(new BigDecimal(actual.asNumber().toString())) == 0;
171+
.compareTo(new BigDecimal(actual.asNumber().toString())) == 0;
172172
}
173173
return Objects.equals(expected, actual);
174174
}
175175

176176
private static boolean isNumeric(Document doc) {
177177
var type = doc.type();
178-
return type == ShapeType.BYTE || type == ShapeType.SHORT || type == ShapeType.INTEGER
179-
|| type == ShapeType.LONG || type == ShapeType.BIG_INTEGER || type == ShapeType.BIG_DECIMAL
180-
|| type == ShapeType.FLOAT || type == ShapeType.DOUBLE || type == ShapeType.INT_ENUM;
178+
return type == ShapeType.BYTE || type == ShapeType.SHORT
179+
|| type == ShapeType.INTEGER
180+
|| type == ShapeType.LONG
181+
|| type == ShapeType.BIG_INTEGER
182+
|| type == ShapeType.BIG_DECIMAL
183+
|| type == ShapeType.FLOAT
184+
|| type == ShapeType.DOUBLE
185+
|| type == ShapeType.INT_ENUM;
181186
}
182187

183188
private static final class NodeToDocumentConverter implements NodeVisitor<Document> {

0 commit comments

Comments
 (0)