Skip to content

Commit b486ecf

Browse files
authored
Use deferred writes to avoid interpreting dollar sign as format (#1191)
1 parent d27c170 commit b486ecf

4 files changed

Lines changed: 10 additions & 24 deletions

File tree

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ public Class<StringTrait> traitClass() {
1717

1818
@Override
1919
public void accept(JavaWriter writer, StringTrait stringTrait) {
20-
var stringValue = stringTrait.getValue().replace("£", "££");
21-
writer.writeInline("new $T($S)", stringTrait.getClass(), stringValue);
20+
writer.writeInline("new $T($S)", stringTrait.getClass(), stringTrait.getValue());
2221
}
2322
}

codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/writer/DeferredSymbolWriter.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,6 @@ public DeferredSymbolWriter(I importContainer) {
2525
super(importContainer);
2626
}
2727

28-
@Override
29-
public String toString() {
30-
return format(super.toString());
31-
}
32-
3328
/**
3429
* Add symbol to symbol table, so potential type name conflicts can be detected and
3530
* handled.

codegen/codegen-core/src/main/java/software/amazon/smithy/java/codegen/writer/JavaWriter.java

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
*/
3131
@SmithyUnstableApi
3232
public final class JavaWriter extends DeferredSymbolWriter<JavaWriter, JavaImportContainer> {
33-
private static final char PLACEHOLDER_FORMAT_CHAR = '£';
3433
private final String packageNamespace;
3534
private final JavaCodegenSettings settings;
3635
private final String filename;
@@ -81,28 +80,20 @@ public String toString() {
8180
}
8281

8382
putNameContext();
84-
setExpressionStart(PLACEHOLDER_FORMAT_CHAR);
8583
String header = settings.header();
8684
String headerPrefix = (header != null && !header.isEmpty()) ? header + "\n" : "";
87-
return format(
88-
"""
89-
£Lpackage £L;
90-
91-
£L
92-
£L""",
93-
headerPrefix,
94-
packageNamespace,
95-
getImportContainer(),
96-
super.toString());
85+
return headerPrefix
86+
+ "package " + packageNamespace + ";\n\n"
87+
+ getImportContainer() + "\n"
88+
+ super.toString();
9789
}
9890

9991
/**
10092
* @return Returns the formatted writer contents without headers, package declarations, or imports.
10193
*/
10294
public String toContentString() {
10395
putNameContext();
104-
setExpressionStart(PLACEHOLDER_FORMAT_CHAR);
105-
return format("£L", super.toString());
96+
return super.toString();
10697
}
10798

10899
/**
@@ -228,9 +219,10 @@ private String getPlaceholder(Symbol symbol) {
228219
addImport(normalizedSymbol);
229220
addToSymbolTable(normalizedSymbol);
230221

231-
// Return a placeholder value that will be filled when toString is called
222+
// Return a deferred value that resolves the type name at toString() time
232223
// [] is replaced with "Array" to ensure array types don't break formatter.
233-
return format("$L{$L:L}", PLACEHOLDER_FORMAT_CHAR, symbol.getFullName().replace("[]", "Array"));
224+
String fullName = symbol.getFullName().replace("[]", "Array");
225+
return defer(() -> format("${" + fullName + ":L}"));
234226
}
235227
}
236228

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[versions]
22
junit5 = "6.0.3"
33
hamcrest = "3.0"
4-
smithy = "1.70.0"
4+
smithy = "1.71.0"
55
jmh = "0.7.3"
66
test-logger-plugin = "4.0.0"
77
spotbugs = "6.0.22"

0 commit comments

Comments
 (0)