Skip to content

Commit 6afc839

Browse files
jckingcopybara-github
authored andcommitted
Add overload_id to FunctionDescriptor
PiperOrigin-RevId: 1001443291
1 parent 8efc706 commit 6afc839

3 files changed

Lines changed: 135 additions & 4 deletions

File tree

‎common/BUILD‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,8 +1035,10 @@ cc_library(
10351035
"function_descriptor.h",
10361036
],
10371037
deps = [
1038+
":ast",
10381039
":kind",
10391040
"@com_google_absl//absl/base:core_headers",
1041+
"@com_google_absl//absl/functional:overload",
10401042
"@com_google_absl//absl/strings",
10411043
"@com_google_absl//absl/types:span",
10421044
],

‎common/function_descriptor.cc‎

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,14 @@
1616

1717
#include <algorithm>
1818
#include <cstddef>
19+
#include <memory>
20+
#include <variant>
21+
#include <vector>
1922

2023
#include "absl/base/macros.h"
24+
#include "absl/functional/overload.h"
2125
#include "absl/types/span.h"
26+
#include "common/ast.h"
2227
#include "common/kind.h"
2328

2429
namespace cel {
@@ -90,4 +95,86 @@ bool FunctionDescriptor::operator<(const FunctionDescriptor& other) const {
9095
return false;
9196
}
9297

98+
namespace {
99+
100+
[[nodiscard]]
101+
Kind TypeSpecToKind(const TypeSpec& spec) {
102+
return std::visit(
103+
absl::Overload(
104+
[](UnsetTypeSpec) -> Kind { return Kind::kError; },
105+
[](const DynTypeSpec& spec) -> Kind { return Kind::kDyn; },
106+
[](const NullTypeSpec& spec) -> Kind { return Kind::kNull; },
107+
[](const PrimitiveType& spec) -> Kind {
108+
switch (spec) {
109+
case PrimitiveType::kPrimitiveTypeUnspecified:
110+
return Kind::kError;
111+
case PrimitiveType::kBool:
112+
return Kind::kBool;
113+
case PrimitiveType::kInt64:
114+
return Kind::kInt;
115+
case PrimitiveType::kUint64:
116+
return Kind::kUint;
117+
case PrimitiveType::kDouble:
118+
return Kind::kDouble;
119+
case PrimitiveType::kString:
120+
return Kind::kString;
121+
case PrimitiveType::kBytes:
122+
return Kind::kBytes;
123+
}
124+
},
125+
[](const PrimitiveTypeWrapper& spec) -> Kind {
126+
switch (spec.type()) {
127+
case PrimitiveType::kPrimitiveTypeUnspecified:
128+
return Kind::kError;
129+
case PrimitiveType::kBool:
130+
return Kind::kBoolWrapper;
131+
case PrimitiveType::kInt64:
132+
return Kind::kIntWrapper;
133+
case PrimitiveType::kUint64:
134+
return Kind::kUintWrapper;
135+
case PrimitiveType::kDouble:
136+
return Kind::kDoubleWrapper;
137+
case PrimitiveType::kString:
138+
return Kind::kStringWrapper;
139+
case PrimitiveType::kBytes:
140+
return Kind::kBytesWrapper;
141+
}
142+
},
143+
[](const WellKnownTypeSpec& spec) -> Kind {
144+
switch (spec) {
145+
case cel::WellKnownTypeSpec::kWellKnownTypeUnspecified:
146+
return Kind::kError;
147+
case cel::WellKnownTypeSpec::kDuration:
148+
return Kind::kError;
149+
case cel::WellKnownTypeSpec::kTimestamp:
150+
return Kind::kTimestamp;
151+
case cel::WellKnownTypeSpec::kAny:
152+
return Kind::kAny;
153+
}
154+
},
155+
[](const ListTypeSpec& spec) -> Kind { return Kind::kList; },
156+
[](const MapTypeSpec& spec) -> Kind { return Kind::kMap; },
157+
[](const FunctionTypeSpec& spec) -> Kind { return Kind::kFunction; },
158+
[](const MessageTypeSpec& spec) -> Kind { return Kind::kStruct; },
159+
[](const ParamTypeSpec& spec) -> Kind { return Kind::kTypeParam; },
160+
[](const std::unique_ptr<TypeSpec>& spec) -> Kind {
161+
return Kind::kType;
162+
},
163+
[](const ErrorTypeSpec& spec) -> Kind { return Kind::kError; },
164+
[](const AbstractType& spec) -> Kind { return Kind::kOpaque; }),
165+
spec.type_kind());
166+
}
167+
168+
} // namespace
169+
170+
std::vector<Kind> FunctionDescriptor::FunctionTypeSpecToArgumentKinds(
171+
const FunctionTypeSpec& spec) {
172+
std::vector<Kind> kinds;
173+
kinds.reserve(spec.arg_types().size());
174+
for (const auto& arg : spec.arg_types()) {
175+
kinds.push_back(TypeSpecToKind(arg));
176+
}
177+
return kinds;
178+
}
179+
93180
} // namespace cel

‎common/function_descriptor.h‎

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@
1919
#include <utility>
2020
#include <vector>
2121

22+
#include "absl/base/attributes.h"
2223
#include "absl/strings/string_view.h"
2324
#include "absl/types/span.h"
25+
#include "common/ast.h"
2426
#include "common/kind.h"
2527

2628
namespace cel {
@@ -42,8 +44,28 @@ struct FunctionDescriptorOptions {
4244

4345
// Coarsely describes a function for the purpose of runtime resolution of
4446
// overloads.
45-
class FunctionDescriptor final {
47+
class FunctionDescriptor {
4648
public:
49+
// Creates a FunctionDescriptor for a global function.
50+
[[nodiscard]]
51+
static FunctionDescriptor Global(absl::string_view name,
52+
absl::string_view overload_id,
53+
const FunctionTypeSpec& type,
54+
FunctionDescriptorOptions options = {}) {
55+
return FunctionDescriptor(name, overload_id, type, options,
56+
/*is_receiver_style=*/false);
57+
}
58+
59+
// Creates a FunctionDescriptor for a member function.
60+
[[nodiscard]]
61+
static FunctionDescriptor Member(absl::string_view name,
62+
absl::string_view overload_id,
63+
const FunctionTypeSpec& type,
64+
FunctionDescriptorOptions options = {}) {
65+
return FunctionDescriptor(name, overload_id, type, options,
66+
/*is_receiver_style=*/true);
67+
}
68+
4769
FunctionDescriptor(const FunctionDescriptor&) = default;
4870
FunctionDescriptor(FunctionDescriptor&&) = default;
4971
FunctionDescriptor& operator=(const FunctionDescriptor&) = default;
@@ -67,20 +89,26 @@ class FunctionDescriptor final {
6789
std::vector<Kind> types,
6890
FunctionDescriptorOptions options = {})
6991
: name_(name),
70-
types_(std::move(types)),
92+
kinds_(std::move(types)),
7193
is_receiver_style_(is_receiver_style),
7294
options_(std::move(options)) {}
7395

7496
// Function name.
7597
const std::string& name() const { return name_; }
7698

99+
// Function overload ID. This may be empty for legacy code.
100+
[[nodiscard]]
101+
absl::string_view overload_id() const ABSL_ATTRIBUTE_LIFETIME_BOUND {
102+
return overload_id_;
103+
}
104+
77105
// Whether function is receiver style i.e. true means arg0.name(args[1:]...).
78106
bool receiver_style() const { return is_receiver_style_; }
79107

80108
// The argument types the function accepts.
81109
//
82110
// TODO(uncreated-issue/17): make this kinds
83-
const std::vector<Kind>& types() const { return types_; }
111+
const std::vector<Kind>& types() const { return kinds_; }
84112

85113
// if true (strict, default), error or unknown arguments are propagated
86114
// instead of calling the function. if false (non-strict), the function may
@@ -108,8 +136,22 @@ class FunctionDescriptor final {
108136
bool operator<(const FunctionDescriptor& other) const;
109137

110138
private:
139+
[[nodiscard]]
140+
static std::vector<Kind> FunctionTypeSpecToArgumentKinds(
141+
const FunctionTypeSpec& spec);
142+
143+
FunctionDescriptor(absl::string_view name, absl::string_view overload_id,
144+
const FunctionTypeSpec& type,
145+
FunctionDescriptorOptions options, bool is_receiver_style)
146+
: name_(name),
147+
overload_id_(overload_id),
148+
kinds_(FunctionTypeSpecToArgumentKinds(type)),
149+
is_receiver_style_(is_receiver_style),
150+
options_(std::move(options)) {}
151+
111152
std::string name_;
112-
std::vector<Kind> types_;
153+
std::string overload_id_;
154+
std::vector<Kind> kinds_;
113155
bool is_receiver_style_;
114156
FunctionDescriptorOptions options_;
115157
};

0 commit comments

Comments
 (0)