Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 0 additions & 6 deletions runtime/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -227,12 +227,6 @@ cel_android_library(
exports = ["//runtime/src/main/java/dev/cel/runtime:resolved_overload_android"],
)

java_library(
name = "resolved_overload_internal",
visibility = ["//:internal"],
exports = ["//runtime/src/main/java/dev/cel/runtime:resolved_overload_internal"],
)

java_library(
name = "internal_function_binder",
visibility = ["//:internal"],
Expand Down
61 changes: 16 additions & 45 deletions runtime/src/main/java/dev/cel/runtime/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -124,11 +124,10 @@ java_library(
":evaluation_exception",
":evaluation_exception_builder",
":function_overload",
":function_resolver",
":resolved_overload",
":resolved_overload_internal",
"//:auto_value",
"//common:error_codes",
"//runtime:function_resolver",
"@maven//:com_google_code_findbugs_annotations",
"@maven//:com_google_errorprone_error_prone_annotations",
"@maven//:com_google_guava_guava",
Expand All @@ -145,7 +144,6 @@ cel_android_library(
":function_overload_android",
":function_resolver_android",
":resolved_overload_android",
":resolved_overload_internal_android",
"//:auto_value",
"//common:error_codes",
"@maven//:com_google_code_findbugs_annotations",
Expand Down Expand Up @@ -285,10 +283,11 @@ java_library(
":evaluation_exception",
":evaluation_exception_builder",
":evaluation_listener",
":function_resolver",
":interpretable",
":interpreter_util",
":metadata",
":resolved_overload_internal",
":resolved_overload",
":runtime_helpers",
":runtime_type_provider",
":type_resolver",
Expand All @@ -303,7 +302,6 @@ java_library(
"//common/types",
"//common/types:type_providers",
"//common/values:cel_byte_string",
"//runtime:function_resolver",
"@maven//:com_google_code_findbugs_annotations",
"@maven//:com_google_errorprone_error_prone_annotations",
"@maven//:com_google_guava_guava",
Expand All @@ -328,7 +326,7 @@ cel_android_library(
":interpretable_android",
":interpreter_util_android",
":metadata",
":resolved_overload_internal_android",
":resolved_overload_android",
":runtime_helpers_android",
":runtime_type_provider_android",
":type_resolver_android",
Expand Down Expand Up @@ -498,7 +496,6 @@ java_library(
":function_binding",
":function_resolver",
":resolved_overload",
":resolved_overload_internal",
"//:auto_value",
"@maven//:com_google_errorprone_error_prone_annotations",
"@maven//:com_google_guava_guava",
Expand All @@ -516,7 +513,6 @@ cel_android_library(
":function_binding_android",
":function_resolver_android",
":resolved_overload_android",
":resolved_overload_internal_android",
"//:auto_value",
"@maven//:com_google_errorprone_error_prone_annotations",
"@maven_android//:com_google_guava_guava",
Expand Down Expand Up @@ -584,8 +580,8 @@ java_library(
deps = [
":evaluation_exception",
":evaluation_listener",
":function_resolver",
"//common/annotations",
"//runtime:function_resolver",
"@maven//:com_google_errorprone_error_prone_annotations",
"@maven//:org_jspecify_jspecify",
],
Expand Down Expand Up @@ -752,7 +748,7 @@ java_library(
],
deps = [
":evaluation_exception",
":resolved_overload_internal",
":resolved_overload",
"@maven//:com_google_code_findbugs_annotations",
"@maven//:com_google_errorprone_error_prone_annotations",
],
Expand All @@ -763,7 +759,7 @@ cel_android_library(
srcs = ["CelFunctionResolver.java"],
deps = [
":evaluation_exception",
":resolved_overload_internal_android",
":resolved_overload_android",
"@maven//:com_google_code_findbugs_annotations",
"@maven//:com_google_errorprone_error_prone_annotations",
],
Expand Down Expand Up @@ -793,33 +789,6 @@ cel_android_library(
],
)

java_library(
name = "resolved_overload_internal",
srcs = ["ResolvedOverload.java"],
tags = [
],
deps = [
":function_overload",
":unknown_attributes",
"@maven//:com_google_code_findbugs_annotations",
"@maven//:com_google_errorprone_error_prone_annotations",
"@maven//:com_google_protobuf_protobuf_java",
],
)

cel_android_library(
name = "resolved_overload_internal_android",
srcs = ["ResolvedOverload.java"],
visibility = ["//visibility:private"],
deps = [
":function_overload_android",
":unknown_attributes_android",
"@maven//:com_google_code_findbugs_annotations",
"@maven//:com_google_errorprone_error_prone_annotations",
"@maven_android//:com_google_protobuf_protobuf_javalite",
],
)

java_library(
name = "runtime",
srcs = RUNTIME_SOURCES,
Expand All @@ -837,6 +806,7 @@ java_library(
":function_resolver",
":interpretable",
":interpreter",
":program",
":proto_message_activation_factory",
":proto_message_runtime_equality",
":runtime_equality",
Expand All @@ -856,7 +826,6 @@ java_library(
"//common/types:cel_types",
"//common/values:cel_value_provider",
"//common/values:proto_message_value_provider",
"//runtime:program",
"@maven//:com_google_code_findbugs_annotations",
"@maven//:com_google_errorprone_error_prone_annotations",
"@maven//:com_google_guava_guava",
Expand All @@ -873,12 +842,12 @@ java_library(
deps = [
":evaluation_exception",
":function_binding",
":program",
"//:auto_value",
"//common:cel_ast",
"//common:options",
"//common/annotations",
"//common/values:cel_value_provider",
"//runtime:program",
"//runtime/standard:standard_function",
"@maven//:com_google_code_findbugs_annotations",
"@maven//:com_google_errorprone_error_prone_annotations",
Expand All @@ -898,14 +867,14 @@ java_library(
":interpreter",
":lite_program_impl",
":lite_runtime",
":program",
":runtime_equality",
":runtime_helpers",
":type_resolver",
"//:auto_value",
"//common:cel_ast",
"//common:options",
"//common/values:cel_value_provider",
"//runtime:program",
"//runtime/standard:standard_function",
"@maven//:com_google_code_findbugs_annotations",
"@maven//:com_google_guava_guava",
Expand Down Expand Up @@ -1201,10 +1170,11 @@ java_library(
],
deps = [
":function_overload",
":resolved_overload_internal",
":unknown_attributes",
"//:auto_value",
"@maven//:com_google_errorprone_error_prone_annotations",
"@maven//:com_google_guava_guava",
"@maven//:com_google_protobuf_protobuf_java",
],
)

Expand All @@ -1215,10 +1185,11 @@ cel_android_library(
],
deps = [
":function_overload_android",
":resolved_overload_internal_android",
":unknown_attributes_android",
"//:auto_value",
"@maven//:com_google_errorprone_error_prone_annotations",
"@maven_android//:com_google_guava_guava",
"@maven_android//:com_google_protobuf_protobuf_javalite",
],
)

Expand Down Expand Up @@ -1253,9 +1224,9 @@ java_library(
tags = [
],
deps = [
":function_binding",
":function_overload",
"//common/annotations",
"//runtime:function_binding",
"@maven//:com_google_guava_guava",
],
)
Expand All @@ -1266,9 +1237,9 @@ cel_android_library(
tags = [
],
deps = [
":function_binding_android",
":function_overload_android",
"//common/annotations",
"//runtime:function_binding_android",
"@maven_android//:com_google_guava_guava",
],
)
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,6 @@ public interface CelFunctionResolver {
* @return an optional value of the resolved overload.
* @throws CelEvaluationException if the overload resolution is ambiguous,
*/
Optional<ResolvedOverload> findOverloadMatchingArgs(
Optional<CelResolvedOverload> findOverloadMatchingArgs(
String functionName, List<String> overloadIds, Object[] args) throws CelEvaluationException;
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,14 @@
@Immutable
public final class CelLateFunctionBindings implements CelFunctionResolver {

private final ImmutableMap<String, ResolvedOverload> functions;
private final ImmutableMap<String, CelResolvedOverload> functions;

private CelLateFunctionBindings(ImmutableMap<String, ResolvedOverload> functions) {
private CelLateFunctionBindings(ImmutableMap<String, CelResolvedOverload> functions) {
this.functions = functions;
}

@Override
public Optional<ResolvedOverload> findOverloadMatchingArgs(
public Optional<CelResolvedOverload> findOverloadMatchingArgs(
String functionName, List<String> overloadIds, Object[] args) throws CelEvaluationException {
return DefaultDispatcher.findOverloadMatchingArgs(functionName, overloadIds, functions, args);
}
Expand All @@ -54,7 +54,7 @@ public static CelLateFunctionBindings from(List<CelFunctionBinding> functions) {
CelLateFunctionBindings::createResolvedOverload)));
}

private static ResolvedOverload createResolvedOverload(CelFunctionBinding binding) {
private static CelResolvedOverload createResolvedOverload(CelFunctionBinding binding) {
return CelResolvedOverload.of(
binding.getOverloadId(),
(args) -> binding.getDefinition().apply(args),
Expand Down
45 changes: 40 additions & 5 deletions runtime/src/main/java/dev/cel/runtime/CelResolvedOverload.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,22 +17,22 @@
import com.google.auto.value.AutoValue;
import com.google.common.collect.ImmutableList;
import com.google.errorprone.annotations.Immutable;
import com.google.protobuf.MessageLite;
import java.util.List;
import java.util.Map;

/**
* Representation of a function overload which has been resolved to a specific set of argument types
* and a function definition.
*/
@AutoValue
@Immutable
abstract class CelResolvedOverload implements ResolvedOverload {
abstract class CelResolvedOverload {

/** The overload id of the function. */
@Override
public abstract String getOverloadId();

/** The types of the function parameters. */
@Override
public abstract ImmutableList<Class<?>> getParameterTypes();

/* Denotes whether an overload is strict.
Expand All @@ -47,11 +47,9 @@ abstract class CelResolvedOverload implements ResolvedOverload {
*
* <p>In a vast majority of cases, this should be set to true.
*/
@Override
public abstract boolean isStrict();

/** The function definition. */
@Override
public abstract CelFunctionOverload getDefinition();

/**
Expand All @@ -76,4 +74,41 @@ public static CelResolvedOverload of(
return new AutoValue_CelResolvedOverload(
overloadId, ImmutableList.copyOf(parameterTypes), isStrict, definition);
}

/**
* Returns true if the overload's expected argument types match the types of the given arguments.
*/
boolean canHandle(Object[] arguments) {
ImmutableList<Class<?>> parameterTypes = getParameterTypes();
if (parameterTypes.size() != arguments.length) {
return false;
}
for (int i = 0; i < parameterTypes.size(); i++) {
Class<?> paramType = parameterTypes.get(i);
Object arg = arguments[i];
if (arg == null) {
// null can be assigned to messages, maps, and to objects.
// TODO: Remove null special casing
if (paramType != Object.class
&& !MessageLite.class.isAssignableFrom(paramType)
&& !Map.class.isAssignableFrom(paramType)) {
return false;
}
continue;
}

if (arg instanceof Exception || arg instanceof CelUnknownSet) {
// Only non-strict functions can accept errors/unknowns as arguments to a function
if (!isStrict()) {
// Skip assignability check below, but continue to validate remaining args
continue;
}
}

if (!paramType.isAssignableFrom(arg.getClass())) {
return false;
}
}
return true;
}
}
Loading
Loading