diff --git a/common/src/main/java/dev/cel/common/CelOverloadDecl.java b/common/src/main/java/dev/cel/common/CelOverloadDecl.java
index c6a7ab1c3..f17dd87b1 100644
--- a/common/src/main/java/dev/cel/common/CelOverloadDecl.java
+++ b/common/src/main/java/dev/cel/common/CelOverloadDecl.java
@@ -36,6 +36,8 @@
*
An overload is declared in either a global function `Ex: f(x, ...)` or a method call style
* `Ex: x.f(...)`.
*/
+// TODO: Port https://github.com/cel-expr/cel-go/pull/1483 to support first-class
+// properties on declarations and bindings for late-bound and asynchronous functions.
@AutoValue
@Immutable
public abstract class CelOverloadDecl {
diff --git a/runtime/planner/BUILD.bazel b/runtime/planner/BUILD.bazel
index 4c482337d..78d73885a 100644
--- a/runtime/planner/BUILD.bazel
+++ b/runtime/planner/BUILD.bazel
@@ -22,6 +22,12 @@ java_library(
exports = ["//runtime/src/main/java/dev/cel/runtime/planner:planned_program"],
)
+cel_android_library(
+ name = "planned_program_android",
+ visibility = ["//:internal"],
+ exports = ["//runtime/src/main/java/dev/cel/runtime/planner:planned_program_android"],
+)
+
java_library(
name = "async_gate",
testonly = 1,
@@ -29,6 +35,13 @@ java_library(
exports = ["//runtime/src/main/java/dev/cel/runtime/planner:async_gate"],
)
+cel_android_library(
+ name = "async_gate_android",
+ testonly = 1,
+ visibility = ["//:internal"],
+ exports = ["//runtime/src/main/java/dev/cel/runtime/planner:async_gate_android"],
+)
+
java_library(
name = "async_completion_coordinator",
testonly = 1,
@@ -36,8 +49,21 @@ java_library(
exports = ["//runtime/src/main/java/dev/cel/runtime/planner:async_completion_coordinator"],
)
+cel_android_library(
+ name = "async_completion_coordinator_android",
+ testonly = 1,
+ visibility = ["//:internal"],
+ exports = ["//runtime/src/main/java/dev/cel/runtime/planner:async_completion_coordinator_android"],
+)
+
java_library(
name = "async_call_state_tracker",
visibility = ["//:internal"],
exports = ["//runtime/src/main/java/dev/cel/runtime/planner:async_call_state_tracker"],
)
+
+cel_android_library(
+ name = "async_call_state_tracker_android",
+ visibility = ["//:internal"],
+ exports = ["//runtime/src/main/java/dev/cel/runtime/planner:async_call_state_tracker_android"],
+)
diff --git a/runtime/src/main/java/dev/cel/runtime/BUILD.bazel b/runtime/src/main/java/dev/cel/runtime/BUILD.bazel
index 9518e1601..158c932c7 100644
--- a/runtime/src/main/java/dev/cel/runtime/BUILD.bazel
+++ b/runtime/src/main/java/dev/cel/runtime/BUILD.bazel
@@ -829,7 +829,6 @@ java_library(
":function_binding",
":function_resolver",
":partial_vars",
- ":program",
":proto_message_runtime_equality",
":runtime",
":runtime_equality",
@@ -855,7 +854,6 @@ java_library(
"//runtime:activation",
"//runtime:interpretable",
"//runtime:proto_message_activation_factory",
- "//runtime:resolved_overload",
"//runtime/planner:planned_program",
"//runtime/planner:program_planner",
"//runtime/standard:type",
@@ -997,6 +995,7 @@ java_library(
"//common/types:type_providers",
"//common/values",
"//common/values:cel_value_provider",
+ "//runtime:async_options",
"//runtime:evaluation_exception",
"//runtime/planner:program_planner",
"//runtime/standard:standard_function",
@@ -1025,6 +1024,7 @@ cel_android_library(
"//common/types:type_providers_android",
"//common/values:cel_value_provider_android",
"//common/values:values_android",
+ "//runtime:async_options_android",
"//runtime:evaluation_exception",
"//runtime/planner:program_planner_android",
"//runtime/standard:standard_function_android",
diff --git a/runtime/src/main/java/dev/cel/runtime/CelFunctionBinding.java b/runtime/src/main/java/dev/cel/runtime/CelFunctionBinding.java
index 3b0084394..4597622f3 100644
--- a/runtime/src/main/java/dev/cel/runtime/CelFunctionBinding.java
+++ b/runtime/src/main/java/dev/cel/runtime/CelFunctionBinding.java
@@ -188,9 +188,7 @@ static ImmutableSet fromOverloads(
String functionName, Collection overloadBindings) {
checkArgument(!Strings.isNullOrEmpty(functionName), "Function name cannot be null or empty");
checkArgument(!overloadBindings.isEmpty(), "You must provide at least one binding.");
- // TODO: Dynamic dispatch grouping does not currently support asynchronous
- // function overloads. In parsed-only mode, overloaded async functions must be resolved
- // at runtime via CelFunctionResolver.
+ // TODO: Support dynamic overload resolution for asynchronous function overloads.
for (CelFunctionBinding binding : overloadBindings) {
checkArgument(
!(binding.getDefinition() instanceof CelAsyncFunctionOverload),
diff --git a/runtime/src/main/java/dev/cel/runtime/CelRuntimeImpl.java b/runtime/src/main/java/dev/cel/runtime/CelRuntimeImpl.java
index 857434ba2..c3bff8dfd 100644
--- a/runtime/src/main/java/dev/cel/runtime/CelRuntimeImpl.java
+++ b/runtime/src/main/java/dev/cel/runtime/CelRuntimeImpl.java
@@ -112,22 +112,7 @@ public Program createProgram(CelAbstractSyntaxTree ast) throws CelEvaluationExce
return toRuntimeProgram(planner().plan(ast));
}
- private static final CelFunctionResolver EMPTY_FUNCTION_RESOLVER =
- new CelFunctionResolver() {
- @Override
- public Optional findOverloadMatchingArgs(
- String functionName, Collection overloadIds, Object[] args) {
- return Optional.empty();
- }
-
- @Override
- public Optional findOverloadMatchingArgs(
- String functionName, Object[] args) {
- return Optional.empty();
- }
- };
-
- public Program toRuntimeProgram(dev.cel.runtime.Program program) {
+ private Program toRuntimeProgram(PlannedProgram program) {
return new Program() {
@Override
@@ -148,11 +133,9 @@ public Object eval(Map mapValue, CelFunctionResolver lateBoundFunctio
@Override
public Object eval(Message message) throws CelEvaluationException {
- PlannedProgram plannedProgram = (PlannedProgram) program;
- return plannedProgram.evalOrThrow(
- plannedProgram.interpretable(),
- ProtoMessageActivationFactory.fromProto(message, plannedProgram.options()),
- EMPTY_FUNCTION_RESOLVER,
+ return program.evalOrThrow(
+ ProtoMessageActivationFactory.fromProto(message, program.options()),
+ CelFunctionResolver.EMPTY,
/* partialVars= */ null,
/* listener= */ null);
}
@@ -190,12 +173,6 @@ public ListenableFuture