Skip to content

Commit 9fd4abd

Browse files
l46kokcopybara-github
authored andcommitted
Implement codegen for CelLiteDescriptor
PiperOrigin-RevId: 736863075
1 parent f1efc00 commit 9fd4abd

15 files changed

+1453
-5
lines changed

WORKSPACE

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,11 +242,11 @@ http_archive(
242242
)
243243

244244
# cel-spec api/expr canonical protos
245-
CEL_SPEC_VERSION = "0.20.0"
245+
CEL_SPEC_VERSION = "0.22.1"
246246

247247
http_archive(
248248
name = "cel_spec",
249-
sha256 = "9f4acb83116f68af8a6b6acf700561a22a1bd8a9ad2f49bf642b7f9b8f285043",
249+
sha256 = "1f1ad32bce5d31cf82e9c8f40685b1902de3ab07c78403601e7a43c3fb4de9a6",
250250
strip_prefix = "cel-spec-" + CEL_SPEC_VERSION,
251251
urls = [
252252
"https://github.com/google/cel-spec/archive/" +

common/internal/BUILD.bazel

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,10 @@ java_library(
9595

9696
cel_android_library(
9797
name = "internal_android",
98-
visibility = ["//:android_allow_list"],
9998
exports = ["//common/src/main/java/dev/cel/common/internal:internal_android"],
10099
)
100+
101+
java_library(
102+
name = "proto_java_qualified_names",
103+
exports = ["//common/src/main/java/dev/cel/common/internal:proto_java_qualified_names"],
104+
)

common/src/main/java/dev/cel/common/internal/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,7 @@ java_library(
309309
tags = [
310310
],
311311
deps = [
312+
"//common/annotations",
312313
"@maven//:com_google_guava_guava",
313314
"@maven//:com_google_protobuf_protobuf_java",
314315
],

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,16 @@
2424
import com.google.protobuf.Descriptors.FileDescriptor;
2525
import com.google.protobuf.Descriptors.GenericDescriptor;
2626
import com.google.protobuf.Descriptors.ServiceDescriptor;
27+
import dev.cel.common.annotations.Internal;
2728
import java.util.ArrayDeque;
2829

29-
/** Helper class for constructing a fully qualified Java class name from a protobuf descriptor. */
30-
final class ProtoJavaQualifiedNames {
30+
/**
31+
* Helper class for constructing a fully qualified Java class name from a protobuf descriptor. * *
32+
*
33+
* <p>CEL Library Internals. Do Not Use.
34+
*/
35+
@Internal
36+
public final class ProtoJavaQualifiedNames {
3137
// Controls how many times we should recursively inspect a nested message for building fully
3238
// qualified java class name before aborting.
3339
private static final int SAFE_RECURSE_LIMIT = 50;
@@ -45,6 +51,10 @@ public static String getFullyQualifiedJavaClassName(Descriptor descriptor) {
4551
return getFullyQualifiedJavaClassNameImpl(descriptor);
4652
}
4753

54+
public static String getFullyQualifiedJavaClassName(EnumDescriptor descriptor) {
55+
return getFullyQualifiedJavaClassNameImpl(descriptor);
56+
}
57+
4858
private static String getFullyQualifiedJavaClassNameImpl(GenericDescriptor descriptor) {
4959
StringBuilder fullClassName = new StringBuilder();
5060

java_lite_proto_cel_library.bzl

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
# Copyright 2025 Google LLC
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# https://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
15+
"""Starlark rule for generating descriptors that is compatible with Protolite Messages."""
16+
17+
load("@rules_java//java:defs.bzl", "java_library")
18+
load("@rules_proto//proto:defs.bzl", "proto_descriptor_set")
19+
load("//publish:cel_version.bzl", "CEL_VERSION")
20+
21+
def java_lite_proto_cel_library(
22+
name,
23+
java_descriptor_class_prefix,
24+
deps,
25+
debug = False):
26+
"""Generates a CelLiteDescriptor
27+
28+
Args:
29+
name: name of this target.
30+
java_descriptor_class_prefix: Prefix name for the generated descriptor java class (ex: 'TestAllTypes' generates 'TestAllTypesCelLiteDescriptor.java').
31+
deps: Name of the proto_library target. Only a single proto_library is supported at this time.
32+
debug: (optional) If true, prints additional information during codegen for debugging purposes.
33+
"""
34+
if not name:
35+
fail("You must provide a name.")
36+
37+
if not java_descriptor_class_prefix:
38+
fail("You must provide a descriptor_class_prefix.")
39+
40+
if not deps:
41+
fail("You must provide a proto_library dependency.")
42+
43+
if len(deps) > 1:
44+
fail("You must provide only one proto_library dependency.")
45+
46+
_generate_cel_lite_descriptor_class(
47+
name,
48+
java_descriptor_class_prefix + "CelLiteDescriptor",
49+
deps[0],
50+
debug,
51+
)
52+
53+
descriptor_codegen_deps = [
54+
"//protobuf:cel_lite_descriptor",
55+
]
56+
57+
java_library(
58+
name = name,
59+
srcs = [":" + name + "_cel_lite_descriptor"],
60+
deps = deps + descriptor_codegen_deps,
61+
)
62+
63+
def _generate_cel_lite_descriptor_class(
64+
name,
65+
descriptor_class_name,
66+
proto_src,
67+
debug):
68+
outfile = "%s.java" % descriptor_class_name
69+
70+
transitive_descriptor_set_name = "%s_transitive_descriptor_set" % name
71+
proto_descriptor_set(
72+
name = transitive_descriptor_set_name,
73+
deps = [proto_src],
74+
)
75+
76+
direct_descriptor_set_name = proto_src
77+
78+
debug_flag = "--debug" if debug else ""
79+
80+
cmd = (
81+
"$(location //protobuf:cel_lite_descriptor_generator) " +
82+
"--descriptor $(location %s) " % direct_descriptor_set_name +
83+
"--transitive_descriptor_set $(location %s) " % transitive_descriptor_set_name +
84+
"--descriptor_class_name %s " % descriptor_class_name +
85+
"--out $(location %s) " % outfile +
86+
"--version %s " % CEL_VERSION +
87+
debug_flag
88+
)
89+
90+
native.genrule(
91+
name = name + "_cel_lite_descriptor",
92+
srcs = [
93+
transitive_descriptor_set_name,
94+
direct_descriptor_set_name,
95+
],
96+
cmd = cmd,
97+
outs = [outfile],
98+
tools = ["//protobuf:cel_lite_descriptor_generator"],
99+
)

protobuf/BUILD.bazel

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
load("@rules_java//java:defs.bzl", "java_library")
2+
3+
package(
4+
default_applicable_licenses = ["//:license"],
5+
default_visibility = ["//:internal"], # TODO: Expose when ready
6+
)
7+
8+
java_library(
9+
name = "cel_lite_descriptor",
10+
exports = ["//protobuf/src/main/java/dev/cel/protobuf:cel_lite_descriptor"],
11+
)
12+
13+
alias(
14+
name = "cel_lite_descriptor_generator",
15+
actual = "//protobuf/src/main/java/dev/cel/protobuf:cel_lite_descriptor_generator",
16+
visibility = ["//:internal"],
17+
)
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
load("@rules_java//java:defs.bzl", "java_binary", "java_library")
2+
3+
package(
4+
default_applicable_licenses = ["//:license"],
5+
default_visibility = ["//protobuf:__pkg__"],
6+
)
7+
8+
filegroup(
9+
name = "cel_lite_descriptor_template_file",
10+
srcs = ["templates/cel_lite_descriptor_template.txt"],
11+
visibility = ["//visibility:private"],
12+
)
13+
14+
java_binary(
15+
name = "cel_lite_descriptor_generator",
16+
srcs = ["CelLiteDescriptorGenerator.java"],
17+
main_class = "dev.cel.protobuf.CelLiteDescriptorGenerator",
18+
deps = [
19+
":debug_printer",
20+
":java_file_generator",
21+
":proto_descriptor_collector",
22+
"//common:cel_descriptors",
23+
"//common/internal:proto_java_qualified_names",
24+
"@maven//:com_google_guava_guava",
25+
"@maven//:com_google_protobuf_protobuf_java",
26+
"@maven//:info_picocli_picocli",
27+
],
28+
)
29+
30+
java_library(
31+
name = "proto_descriptor_collector",
32+
srcs = ["ProtoDescriptorCollector.java"],
33+
deps = [
34+
":cel_lite_descriptor",
35+
":debug_printer",
36+
"//common:cel_descriptors",
37+
"//common/internal:proto_java_qualified_names",
38+
"//common/internal:well_known_proto",
39+
"@maven//:com_google_guava_guava",
40+
"@maven//:com_google_protobuf_protobuf_java",
41+
],
42+
)
43+
44+
java_library(
45+
name = "java_file_generator",
46+
srcs = ["JavaFileGenerator.java"],
47+
resources = [
48+
":cel_lite_descriptor_template_file",
49+
],
50+
deps = [
51+
":cel_lite_descriptor",
52+
"//:auto_value",
53+
"@maven//:com_google_guava_guava",
54+
"@maven//:org_freemarker_freemarker",
55+
],
56+
)
57+
58+
java_library(
59+
name = "debug_printer",
60+
srcs = ["DebugPrinter.java"],
61+
deps = [
62+
"@maven//:info_picocli_picocli",
63+
],
64+
)
65+
66+
java_library(
67+
name = "cel_lite_descriptor",
68+
srcs = ["CelLiteDescriptor.java"],
69+
tags = [
70+
],
71+
deps = [
72+
"//common/annotations",
73+
"@maven//:com_google_errorprone_error_prone_annotations",
74+
"@maven//:com_google_guava_guava",
75+
"@maven//:com_google_protobuf_protobuf_java",
76+
],
77+
)

0 commit comments

Comments
 (0)