Skip to content

Commit 0f4b3ae

Browse files
committed
Codegen metadata
1 parent 40ddec0 commit 0f4b3ae

File tree

11 files changed

+296
-98
lines changed

11 files changed

+296
-98
lines changed

common/src/main/java/dev/cel/common/internal/DefaultLiteDescriptorPool.java

+27-27
Original file line numberDiff line numberDiff line change
@@ -156,9 +156,9 @@ private static MessageLiteDescriptor newMessageInfo(WellKnownProto wellKnownProt
156156
new FieldLiteDescriptor(
157157
/* fieldNumber= */ 1,
158158
/* fieldName= */ "fields",
159-
/* javaType= */ JavaType.MESSAGE.toString(),
160-
/* celFieldValueType= */ CelFieldValueType.MAP.toString(),
161-
/* protoFieldType= */ Type.MESSAGE.toString(),
159+
/* javaType= */ JavaType.MESSAGE,
160+
/* celFieldValueType= */ CelFieldValueType.MAP,
161+
/* protoFieldType= */ Type.MESSAGE,
162162
/* hasHasser= */ false,
163163
/* isPacked= */ false,
164164
/* fieldProtoTypeName= */ "google.protobuf.Struct.FieldsEntry"));
@@ -169,9 +169,9 @@ private static MessageLiteDescriptor newMessageInfo(WellKnownProto wellKnownProt
169169
new FieldLiteDescriptor(
170170
/* fieldNumber= */ 1,
171171
/* fieldName= */ "null_value",
172-
/* javaType= */ JavaType.ENUM.toString(),
173-
/* celFieldValueType= */ CelFieldValueType.SCALAR.toString(),
174-
/* protoFieldType= */ Type.ENUM.toString(),
172+
/* javaType= */ JavaType.ENUM,
173+
/* celFieldValueType= */ CelFieldValueType.SCALAR,
174+
/* protoFieldType= */ Type.ENUM,
175175
/* hasHasser= */ true,
176176
/* isPacked= */ false,
177177
/* fieldProtoTypeName= */ "google.protobuf.NullValue")
@@ -180,49 +180,49 @@ private static MessageLiteDescriptor newMessageInfo(WellKnownProto wellKnownProt
180180
new FieldLiteDescriptor(
181181
/* fieldNumber= */ 2,
182182
/* fieldName= */ "number_value",
183-
/* javaType= */ JavaType.DOUBLE.toString(),
184-
/* celFieldValueType= */ CelFieldValueType.SCALAR.toString(),
185-
/* protoFieldType= */ Type.DOUBLE.toString(),
183+
/* javaType= */ JavaType.DOUBLE,
184+
/* celFieldValueType= */ CelFieldValueType.SCALAR,
185+
/* protoFieldType= */ Type.DOUBLE,
186186
/* hasHasser= */ true,
187187
/* isPacked= */ false,
188188
/* fieldProtoTypeName= */ ""));
189189
fieldDescriptors.add(
190190
new FieldLiteDescriptor(
191191
/* fieldNumber= */ 3,
192192
/* fieldName= */ "string_value",
193-
/* javaType= */ JavaType.STRING.toString(),
194-
/* celFieldValueType= */ CelFieldValueType.SCALAR.toString(),
195-
/* protoFieldType= */ Type.STRING.toString(),
193+
/* javaType= */ JavaType.STRING,
194+
/* celFieldValueType= */ CelFieldValueType.SCALAR,
195+
/* protoFieldType= */ Type.STRING,
196196
/* hasHasser= */ true,
197197
/* isPacked= */ false,
198198
/* fieldProtoTypeName= */ ""));
199199
fieldDescriptors.add(
200200
new FieldLiteDescriptor(
201201
/* fieldNumber= */ 4,
202202
/* fieldName= */ "bool_value",
203-
/* javaType= */ JavaType.BOOLEAN.toString(),
204-
/* celFieldValueType= */ CelFieldValueType.SCALAR.toString(),
205-
/* protoFieldType= */ Type.BOOL.toString(),
203+
/* javaType= */ JavaType.BOOLEAN,
204+
/* celFieldValueType= */ CelFieldValueType.SCALAR,
205+
/* protoFieldType= */ Type.BOOL,
206206
/* hasHasser= */ true,
207207
/* isPacked= */ false,
208208
/* fieldProtoTypeName= */ ""));
209209
fieldDescriptors.add(
210210
new FieldLiteDescriptor(
211211
/* fieldNumber= */ 5,
212212
/* fieldName= */ "struct_value",
213-
/* javaType= */ JavaType.MESSAGE.toString(),
214-
/* celFieldValueType= */ CelFieldValueType.SCALAR.toString(),
215-
/* protoFieldType= */ Type.MESSAGE.toString(),
213+
/* javaType= */ JavaType.MESSAGE,
214+
/* celFieldValueType= */ CelFieldValueType.SCALAR,
215+
/* protoFieldType= */ Type.MESSAGE,
216216
/* hasHasser= */ true,
217217
/* isPacked= */ false,
218218
/* fieldProtoTypeName= */ "google.protobuf.Struct"));
219219
fieldDescriptors.add(
220220
new FieldLiteDescriptor(
221221
/* fieldNumber= */ 6,
222222
/* fieldName= */ "list_value",
223-
/* javaType= */ JavaType.MESSAGE.toString(),
224-
/* celFieldValueType= */ CelFieldValueType.SCALAR.toString(),
225-
/* protoFieldType= */ Type.MESSAGE.toString(),
223+
/* javaType= */ JavaType.MESSAGE,
224+
/* celFieldValueType= */ CelFieldValueType.SCALAR,
225+
/* protoFieldType= */ Type.MESSAGE,
226226
/* hasHasser= */ true,
227227
/* isPacked= */ false,
228228
/* fieldProtoTypeName= */ "google.protobuf.ListValue"));
@@ -233,9 +233,9 @@ private static MessageLiteDescriptor newMessageInfo(WellKnownProto wellKnownProt
233233
new FieldLiteDescriptor(
234234
/* fieldNumber= */ 1,
235235
/* fieldName= */ "values",
236-
/* javaTypeName= */ JavaType.MESSAGE.toString(),
237-
/* celFieldValueType= */ CelFieldValueType.LIST.toString(),
238-
/* protoFieldType= */ Type.MESSAGE.toString(),
236+
/* javaTypeName= */ JavaType.MESSAGE,
237+
/* celFieldValueType= */ CelFieldValueType.LIST,
238+
/* protoFieldType= */ Type.MESSAGE,
239239
/* hasHasser= */ false,
240240
/* isPacked= */ false,
241241
/* fieldProtoTypeName= */ "google.protobuf.Value")
@@ -290,9 +290,9 @@ private static FieldLiteDescriptor newPrimitiveFieldDescriptor(
290290
return new FieldLiteDescriptor(
291291
/* fieldNumber= */ fieldNumber,
292292
/* fieldName= */ fieldName,
293-
/* javaType= */ javaType.toString(),
294-
/* celFieldValueType= */ CelFieldValueType.SCALAR.toString(),
295-
/* protoFieldType= */ protoFieldType.toString(),
293+
/* javaType= */ javaType,
294+
/* celFieldValueType= */ CelFieldValueType.SCALAR,
295+
/* protoFieldType= */ protoFieldType,
296296
/* hasHasser= */ false,
297297
/* isPacked= */ false,
298298
/* fieldProtoTypeName= */ "");

common/src/main/java/dev/cel/common/internal/ProtoJavaQualifiedNames.java

-4
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,6 @@ public static String getFullyQualifiedJavaClassName(Descriptor descriptor) {
5151
return getFullyQualifiedJavaClassNameImpl(descriptor);
5252
}
5353

54-
public static String getFullyQualifiedJavaClassName(EnumDescriptor descriptor) {
55-
return getFullyQualifiedJavaClassNameImpl(descriptor);
56-
}
57-
5854
private static String getFullyQualifiedJavaClassNameImpl(GenericDescriptor descriptor) {
5955
StringBuilder fullClassName = new StringBuilder();
6056

protobuf/src/main/java/dev/cel/protobuf/BUILD.bazel

+18
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ java_library(
3838
deps = [
3939
":cel_lite_descriptor",
4040
":debug_printer",
41+
":lite_descriptor_codegen_metadata",
4142
"//common:cel_descriptors",
4243
"//common/internal:proto_java_qualified_names",
4344
"//common/internal:well_known_proto",
@@ -54,6 +55,7 @@ java_library(
5455
],
5556
deps = [
5657
":cel_lite_descriptor",
58+
":lite_descriptor_codegen_metadata",
5759
"//:auto_value",
5860
"@maven//:com_google_guava_guava",
5961
"@maven//:org_freemarker_freemarker",
@@ -80,3 +82,19 @@ java_library(
8082
"@maven_android//:com_google_protobuf_protobuf_javalite",
8183
],
8284
)
85+
86+
java_library(
87+
name = "lite_descriptor_codegen_metadata",
88+
srcs = ["LiteDescriptorCodegenMetadata.java"],
89+
tags = [
90+
],
91+
deps = [
92+
":cel_lite_descriptor",
93+
"//:auto_value",
94+
"//common/annotations",
95+
"@maven//:com_google_errorprone_error_prone_annotations",
96+
"@maven//:com_google_guava_guava",
97+
"@maven//:org_jspecify_jspecify",
98+
"@maven_android//:com_google_protobuf_protobuf_javalite",
99+
],
100+
)

protobuf/src/main/java/dev/cel/protobuf/CelLiteDescriptor.java

+6-7
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,6 @@ public MessageLite.Builder newMessageBuilder() {
103103
return messageBuilderSupplier.get();
104104
}
105105

106-
@Internal
107106
MessageLiteDescriptor(
108107
String fullyQualifiedProtoTypeName,
109108
List<FieldLiteDescriptor> fieldLiteDescriptors,
@@ -313,17 +312,17 @@ public String getFieldProtoTypeName() {
313312
public FieldLiteDescriptor(
314313
int fieldNumber,
315314
String fieldName,
316-
String javaType,
317-
String celFieldValueType, // LIST, MAP, SCALAR
318-
String protoFieldType, // INT32, SINT32, GROUP, MESSAGE... (See Descriptors#Type)
315+
JavaType javaType,
316+
CelFieldValueType celFieldValueType, // LIST, MAP, SCALAR
317+
Type protoFieldType, // INT32, SINT32, GROUP, MESSAGE... (See Descriptors#Type)
319318
boolean hasHasser,
320319
boolean isPacked,
321320
String fieldProtoTypeName) {
322321
this.fieldNumber = fieldNumber;
323322
this.fieldName = checkNotNull(fieldName);
324-
this.javaType = JavaType.valueOf(javaType);
325-
this.celFieldValueType = CelFieldValueType.valueOf(checkNotNull(celFieldValueType));
326-
this.protoFieldType = Type.valueOf(protoFieldType);
323+
this.javaType = javaType;
324+
this.celFieldValueType = celFieldValueType;
325+
this.protoFieldType = protoFieldType;
327326
this.hasHasser = hasHasser;
328327
this.isPacked = isPacked;
329328
this.fieldProtoTypeName = checkNotNull(fieldProtoTypeName);

protobuf/src/main/java/dev/cel/protobuf/CelLiteDescriptorGenerator.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ private void codegenCelLiteDescriptor(FileDescriptor targetFileDescriptor) throw
110110
.setVersion(version)
111111
.setDescriptorClassName(descriptorClassName)
112112
.setPackageName(javaPackageName)
113-
.setMessageInfoList(descriptorCollector.collectMessageInfo(targetFileDescriptor))
113+
.setDescriptorMetadataList(descriptorCollector.collectCodegenMetadata(targetFileDescriptor))
114114
.build());
115115
}
116116

protobuf/src/main/java/dev/cel/protobuf/JavaFileGenerator.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import com.google.common.collect.ImmutableMap;
2222
import com.google.common.io.Files;
2323
// CEL-Internal-5
24-
import dev.cel.protobuf.CelLiteDescriptor.MessageLiteDescriptor;
2524
import freemarker.template.Configuration;
2625
import freemarker.template.DefaultObjectWrapperBuilder;
2726
import freemarker.template.Template;
@@ -64,14 +63,14 @@ abstract static class JavaFileGeneratorOption {
6463

6564
abstract String version();
6665

67-
abstract ImmutableList<MessageLiteDescriptor> messageInfoList();
66+
abstract ImmutableList<LiteDescriptorCodegenMetadata> descriptorMetadataList();
6867

6968
ImmutableMap<String, Object> getTemplateMap() {
7069
return ImmutableMap.of(
7170
"package_name", packageName(),
7271
"descriptor_class_name", descriptorClassName(),
7372
"version", version(),
74-
"message_info_list", messageInfoList());
73+
"descriptor_metadata_list", descriptorMetadataList());
7574
}
7675

7776
@AutoValue.Builder
@@ -82,7 +81,7 @@ abstract static class Builder {
8281

8382
abstract Builder setVersion(String version);
8483

85-
abstract Builder setMessageInfoList(ImmutableList<MessageLiteDescriptor> messageInfo);
84+
abstract Builder setDescriptorMetadataList(ImmutableList<LiteDescriptorCodegenMetadata> messageInfo);
8685

8786
abstract JavaFileGeneratorOption build();
8887
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package dev.cel.protobuf;
2+
3+
import com.google.auto.value.AutoValue;
4+
import com.google.common.collect.ImmutableList;
5+
import com.google.errorprone.annotations.CanIgnoreReturnValue;
6+
import dev.cel.common.annotations.Internal;
7+
import dev.cel.protobuf.CelLiteDescriptor.FieldLiteDescriptor;
8+
import dev.cel.protobuf.CelLiteDescriptor.FieldLiteDescriptor.CelFieldValueType;
9+
import org.jspecify.annotations.Nullable;
10+
/**
11+
* LiteDescriptorCodegenMetadata holds metadata collected from a full protobuf descriptor pertinent for generating a {@link CelLiteDescriptor}.
12+
*
13+
* <p>The class properties here are almost identical to CelLiteDescriptor, except it contains extraneous information such as the fully qualified class names to
14+
* support codegen, which do not need to be present on a CelLiteDescriptor instance.
15+
*
16+
* <p>Note: Properties must be of simple primitive types.
17+
*
18+
* <p>Note: JavaBeans prefix (e.g: getFoo) is required for compatibility with freemarker.
19+
*
20+
* <p>CEL Library Internals. Do Not Use.
21+
*/
22+
@AutoValue
23+
@Internal
24+
public abstract class LiteDescriptorCodegenMetadata {
25+
26+
public abstract String getProtoTypeName();
27+
28+
public abstract ImmutableList<FieldLiteDescriptorMetadata> getFieldDescriptors();
29+
30+
public abstract @Nullable String getJavaClassName(); // A java class name is not populated for maps, even though it behaves like a message.
31+
32+
@AutoValue.Builder
33+
abstract static class Builder {
34+
35+
abstract Builder setProtoTypeName(String protoTypeName);
36+
abstract Builder setJavaClassName(String javaClassName);
37+
38+
abstract ImmutableList.Builder<FieldLiteDescriptorMetadata> fieldDescriptorsBuilder();
39+
40+
@CanIgnoreReturnValue
41+
Builder addFieldDescriptor(FieldLiteDescriptorMetadata fieldDescriptor) {
42+
this.fieldDescriptorsBuilder().add(fieldDescriptor);
43+
return this;
44+
}
45+
46+
abstract LiteDescriptorCodegenMetadata build();
47+
}
48+
49+
static Builder newBuilder() {
50+
return new AutoValue_LiteDescriptorCodegenMetadata.Builder();
51+
}
52+
53+
@AutoValue
54+
public abstract static class FieldLiteDescriptorMetadata {
55+
56+
public abstract int getFieldNumber();
57+
58+
public abstract String getFieldName();
59+
60+
// Fully-qualified name to the Java Type enumeration (ex: dev.cel.protobuf.CelLiteDescriptor.FieldLiteDescriptor.INT)
61+
public String getJavaTypeEnumName() {
62+
return getFullyQualifiedEnumName(getJavaType());
63+
}
64+
65+
// Fully-qualified name to the CelFieldValueType enumeration (ex: dev.cel.protobuf.CelLiteDescriptor.FieldLiteDescriptor.SCALAR)
66+
public String getCelFieldValueTypeEnumName() {
67+
return getFullyQualifiedEnumName(getCelFieldValueType());
68+
}
69+
70+
// Fully-qualified name to the Proto Type enumeration (ex: dev.cel.protobuf.CelLiteDescriptor.FieldLiteDescriptor.INT)
71+
public String getProtoFieldTypeEnumName() {
72+
return getFullyQualifiedEnumName(getProtoFieldType());
73+
}
74+
75+
public abstract boolean getHasPresence();
76+
77+
public abstract boolean getIsPacked();
78+
79+
public abstract String getFieldProtoTypeName();
80+
81+
abstract FieldLiteDescriptor.JavaType getJavaType();
82+
83+
abstract FieldLiteDescriptor.Type getProtoFieldType();
84+
85+
abstract FieldLiteDescriptor.CelFieldValueType getCelFieldValueType();
86+
87+
private static String getFullyQualifiedEnumName(Object enumValue) {
88+
String enumClassName = enumValue.getClass().getName();
89+
return (enumClassName + "." + enumValue).replaceAll("\\$", ".");
90+
}
91+
92+
@AutoValue.Builder
93+
abstract static class Builder {
94+
95+
abstract Builder setFieldNumber(int fieldNumber);
96+
abstract Builder setFieldName(String fieldName);
97+
abstract Builder setJavaType(FieldLiteDescriptor.JavaType javaTypeEnum);
98+
abstract Builder setCelFieldValueType(FieldLiteDescriptor.CelFieldValueType celFieldValueTypeEnum);
99+
abstract Builder setProtoFieldType(FieldLiteDescriptor.Type protoFieldTypeEnum);
100+
abstract Builder setHasPresence(boolean hasHasser);
101+
abstract Builder setIsPacked(boolean isPacked);
102+
abstract Builder setFieldProtoTypeName(String fieldProtoTypeName);
103+
104+
abstract FieldLiteDescriptorMetadata build();
105+
}
106+
107+
static FieldLiteDescriptorMetadata.Builder newBuilder() {
108+
return new AutoValue_LiteDescriptorCodegenMetadata_FieldLiteDescriptorMetadata.Builder()
109+
.setFieldProtoTypeName("");
110+
}
111+
}
112+
}

0 commit comments

Comments
 (0)