Skip to content

Commit 274ba33

Browse files
committed
Annotation converters as a separate BaseRenderer property
1 parent 08871a2 commit 274ba33

File tree

19 files changed

+82
-83
lines changed

19 files changed

+82
-83
lines changed

pkl-core/src/main/java/org/pkl/core/runtime/Identifier.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public final class Identifier implements Comparable<Identifier> {
6262
public static final Identifier ROOT_ELEMENT_NAME = get("rootElementName");
6363
public static final Identifier ROOT_ELEMENT_ATTRIBUTES = get("rootElementAttributes");
6464
public static final Identifier CONVERTERS = get("converters");
65+
public static final Identifier ANNOTATION_CONVERTERS = get("annotationConverters");
6566
public static final Identifier USE_MAPPING = get("useMapping");
6667

6768
// members of pkl.base#RegexMatch

pkl-core/src/main/java/org/pkl/core/runtime/TestRunner.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
2+
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. 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.
@@ -42,7 +42,7 @@
4242

4343
/** Runs test results examples and facts. */
4444
public final class TestRunner {
45-
private static final PklConverter converter = new PklConverter(VmMapping.empty());
45+
private static final PklConverter converter = PklConverter.NOOP;
4646
private final BufferedLogger logger;
4747
private final StackFrameTransformer stackFrameTransformer;
4848
private final boolean overwrite;

pkl-core/src/main/java/org/pkl/core/runtime/VmPklBinaryEncoder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public VmPklBinaryEncoder(MessageBufferPacker packer, PklConverter converter) {
3838
}
3939

4040
public VmPklBinaryEncoder(MessageBufferPacker packer) {
41-
this(packer, new PklConverter(VmMapping.empty()));
41+
this(packer, PklConverter.NOOP);
4242
}
4343

4444
private void packCode(PklBinaryCode code) throws IOException {

pkl-core/src/main/java/org/pkl/core/stdlib/PklConverter.java

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,13 @@ public final class PklConverter implements VmValueConverter<Object> {
4646
private final @Nullable VmFunction classConverter;
4747
private final @Nullable VmFunction typeAliasConverter;
4848

49-
public PklConverter(VmMapping converters) {
49+
public PklConverter(VmMapping converters, VmMapping annotationConverters) {
5050
// As of 0.18, `converters` is forced by the mapping type check,
5151
// but let's not rely on this implementation detail.
5252
converters.force(false, false);
53+
annotationConverters.force(false, false);
5354
typeConverters = createTypeConverters(converters);
54-
annotationConverters = createAnnotationConverters(converters);
55+
this.annotationConverters = createAnnotationConverters(annotationConverters);
5556
pathConverters = createPathConverters(converters);
5657

5758
stringConverter = typeConverters.get(BaseModule.getStringClass());
@@ -75,6 +76,20 @@ public PklConverter(VmMapping converters) {
7576
typeAliasConverter = typeConverters.get(BaseModule.getTypeAliasClass());
7677
}
7778

79+
public static final PklConverter NOOP = new PklConverter(VmMapping.empty(), VmMapping.empty());
80+
81+
public static PklConverter fromRenderer(VmTyped renderer) {
82+
var converters = (VmMapping) VmUtils.readMember(renderer, Identifier.CONVERTERS);
83+
var annotationConverters =
84+
(VmMapping) VmUtils.readMember(renderer, Identifier.ANNOTATION_CONVERTERS);
85+
return new PklConverter(converters, annotationConverters);
86+
}
87+
88+
public static PklConverter fromParser(VmTyped parser) {
89+
var converters = (VmMapping) VmUtils.readMember(parser, Identifier.CONVERTERS);
90+
return new PklConverter(converters, VmMapping.empty()); // no annotation converters in parsers
91+
}
92+
7893
@Override
7994
public Object convertString(String value, Iterable<Object> path) {
8095
return doConvert(value, path, stringConverter);
@@ -203,33 +218,19 @@ private Map<VmClass, VmFunction> createTypeConverters(VmMapping converters) {
203218
(key, member, value) -> {
204219
assert value != null; // forced in ctor
205220
if (key instanceof VmClass vmClass) {
206-
var vmFunction = (VmFunction) value;
207-
if (vmClass.isSubclassOf(BaseModule.getAnnotationClass())
208-
&& vmFunction.getParameterCount() > 1) {
209-
// when the class is a subclass of Annotation and the function doesn't have 1 param
210-
// this goes in annotationConverters instead
211-
return true;
212-
}
213-
result.put(vmClass, vmFunction);
221+
result.put(vmClass, (VmFunction) value);
214222
}
215223
return true;
216224
});
217225
return result;
218226
}
219227

220-
private Map<VmClass, VmFunction> createAnnotationConverters(VmMapping converters) {
228+
private Map<VmClass, VmFunction> createAnnotationConverters(VmMapping annotationConverters) {
221229
var result = new HashMap<VmClass, VmFunction>();
222-
converters.iterateMemberValues(
230+
annotationConverters.iterateMemberValues(
223231
(key, member, value) -> {
224232
assert value != null; // forced in ctor
225-
if (key instanceof VmClass vmClass
226-
&& vmClass.isSubclassOf(BaseModule.getAnnotationClass())) {
227-
var vmFunction = (VmFunction) value;
228-
if (vmFunction.getParameterCount() != 3) {
229-
return true;
230-
}
231-
result.put(vmClass, vmFunction);
232-
}
233+
result.put((VmClass) key, (VmFunction) value);
233234
return true;
234235
});
235236
return result;

pkl-core/src/main/java/org/pkl/core/stdlib/base/JsonRendererNodes.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,7 @@ protected String eval(VmTyped self, Object value) {
5252
private static JsonRenderer createRenderer(VmTyped self, StringBuilder builder) {
5353
var indent = (String) VmUtils.readMember(self, Identifier.INDENT);
5454
var omitNullProperties = (boolean) VmUtils.readMember(self, Identifier.OMIT_NULL_PROPERTIES);
55-
var converters = (VmMapping) VmUtils.readMember(self, Identifier.CONVERTERS);
56-
var converter = new PklConverter(converters);
57-
return new JsonRenderer(builder, indent, converter, omitNullProperties);
55+
return new JsonRenderer(builder, indent, PklConverter.fromRenderer(self), omitNullProperties);
5856
}
5957

6058
private static final class JsonRenderer extends AbstractStringRenderer {

pkl-core/src/main/java/org/pkl/core/stdlib/base/PListRendererNodes.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,7 @@ protected String eval(VmTyped self, Object value) {
4848

4949
private static PListRenderer createRenderer(VmTyped self, StringBuilder builder) {
5050
var indent = (String) VmUtils.readMember(self, Identifier.INDENT);
51-
var converters = (VmMapping) VmUtils.readMember(self, Identifier.CONVERTERS);
52-
var converter = new PklConverter(converters);
53-
return new PListRenderer(builder, indent, converter);
51+
return new PListRenderer(builder, indent, PklConverter.fromRenderer(self));
5452
}
5553

5654
// keep in sync with org.pkl.core.PListRenderer

pkl-core/src/main/java/org/pkl/core/stdlib/base/PcfRendererNodes.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
2+
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. 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.
@@ -46,12 +46,14 @@ protected String eval(VmTyped self, Object value) {
4646

4747
private static PcfRenderer createRenderer(VmTyped self, StringBuilder builder) {
4848
var indent = (String) VmUtils.readMember(self, Identifier.INDENT);
49-
var converters = (VmMapping) VmUtils.readMember(self, Identifier.CONVERTERS);
5049
var omitNullProperties = (boolean) VmUtils.readMember(self, Identifier.OMIT_NULL_PROPERTIES);
5150
var useCustomStringDelimiters =
5251
(boolean) VmUtils.readMember(self, Identifier.USE_CUSTOM_STRING_DELIMITERS);
53-
var converter = new PklConverter(converters);
5452
return new PcfRenderer(
55-
builder, indent, converter, omitNullProperties, useCustomStringDelimiters);
53+
builder,
54+
indent,
55+
PklConverter.fromRenderer(self),
56+
omitNullProperties,
57+
useCustomStringDelimiters);
5658
}
5759
}

pkl-core/src/main/java/org/pkl/core/stdlib/base/PropertiesRendererNodes.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,8 @@ protected String eval(VmTyped self, Object value) {
6969
private static PropertiesRenderer createRenderer(VmTyped self, StringBuilder builder) {
7070
var omitNullProperties = (boolean) VmUtils.readMember(self, Identifier.OMIT_NULL_PROPERTIES);
7171
var restrictCharset = (boolean) VmUtils.readMember(self, Identifier.RESTRICT_CHARSET);
72-
var converters = (VmMapping) VmUtils.readMember(self, Identifier.CONVERTERS);
73-
var PklConverter = new PklConverter(converters);
74-
return new PropertiesRenderer(builder, omitNullProperties, restrictCharset, PklConverter);
72+
return new PropertiesRenderer(
73+
builder, omitNullProperties, restrictCharset, PklConverter.fromRenderer(self));
7574
}
7675

7776
private static final class PropertiesRenderer extends AbstractStringRenderer {

pkl-core/src/main/java/org/pkl/core/stdlib/base/YamlRendererNodes.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,13 @@ private static YamlRenderer createRenderer(VmTyped self, StringBuilder builder)
6969
var indentWidth = ((Long) VmUtils.readMember(self, Identifier.INDENT_WIDTH)).intValue();
7070
var omitNullProperties = (boolean) VmUtils.readMember(self, Identifier.OMIT_NULL_PROPERTIES);
7171
var isStream = (boolean) VmUtils.readMember(self, Identifier.IS_STREAM);
72-
var converters = (VmMapping) VmUtils.readMember(self, Identifier.CONVERTERS);
73-
var converter = new PklConverter(converters);
7472
return new YamlRenderer(
75-
builder, " ".repeat(indentWidth), converter, omitNullProperties, mode, isStream);
73+
builder,
74+
" ".repeat(indentWidth),
75+
PklConverter.fromRenderer(self),
76+
omitNullProperties,
77+
mode,
78+
isStream);
7679
}
7780

7881
private static final class YamlRenderer extends AbstractStringRenderer {

pkl-core/src/main/java/org/pkl/core/stdlib/json/ParserNodes.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
2+
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. 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.
@@ -51,7 +51,7 @@ protected Object eval(
5151
}
5252

5353
private Object doParse(VmTyped self, String text) {
54-
var converter = createConverter(self);
54+
var converter = PklConverter.fromParser(self);
5555
var useMapping = (boolean) VmUtils.readMember(self, Identifier.USE_MAPPING);
5656
var handler = new Handler(converter, useMapping);
5757
var parser = new JsonParser(handler);
@@ -64,11 +64,6 @@ private Object doParse(VmTyped self, String text) {
6464
}
6565
}
6666

67-
private static PklConverter createConverter(VmTyped self) {
68-
var converters = (VmMapping) VmUtils.readMember(self, Identifier.CONVERTERS);
69-
return new PklConverter(converters);
70-
}
71-
7267
private static class Handler
7368
extends JsonHandler<EconomicMap<Object, ObjectMember>, EconomicMap<Object, ObjectMember>> {
7469
private final PklConverter converter;

0 commit comments

Comments
 (0)