1717#include < memory>
1818#include < string>
1919#include < utility>
20+ #include < vector>
2021
2122#include " absl/container/flat_hash_set.h"
2223#include " absl/status/status.h"
2324#include " absl/status/statusor.h"
2425#include " absl/strings/str_cat.h"
2526#include " absl/strings/string_view.h"
27+ #include " checker/type_check_issue.h"
2628#include " checker/type_checker.h"
2729#include " checker/type_checker_builder.h"
2830#include " checker/type_checker_builder_factory.h"
2931#include " checker/validation_result.h"
32+ #include " common/ast.h"
3033#include " common/source.h"
3134#include " compiler/compiler.h"
3235#include " internal/status_macros.h"
@@ -45,19 +48,38 @@ class CompilerImpl : public Compiler {
4548 CompilerImpl (std::unique_ptr<TypeChecker> type_checker,
4649 std::unique_ptr<Parser> parser,
4750 // Copy the validator in case builder is reused.
48- Validator validator)
51+ Validator validator, CompilerOptions options )
4952 : type_checker_(std::move(type_checker)),
5053 parser_ (std::move(parser)),
51- validator_(std::move(validator)) {}
54+ validator_(std::move(validator)),
55+ options_(options) {}
5256
5357 absl::StatusOr<ValidationResult> Compile (
5458 absl::string_view expression, absl::string_view description,
5559 google::protobuf::Arena* arena) const override {
5660 CEL_ASSIGN_OR_RETURN (auto source,
5761 cel::NewSource (expression, std::string (description)));
58- CEL_ASSIGN_OR_RETURN (auto ast, parser_->Parse (*source));
62+ std::vector<cel::ParseIssue> parse_issues;
63+ absl::StatusOr<std::unique_ptr<cel::Ast>> ast =
64+ parser_->Parse (*source, &parse_issues);
65+ if (!ast.ok ()) {
66+ if (!options_.adapt_parser_errors ||
67+ ast.status ().code () != absl::StatusCode::kInvalidArgument ||
68+ parse_issues.empty ()) {
69+ return ast.status ();
70+ }
71+ std::vector<TypeCheckIssue> check_issues;
72+ check_issues.reserve (parse_issues.size ());
73+ for (const auto & issue : parse_issues) {
74+ check_issues.push_back (TypeCheckIssue::CreateError (
75+ issue.location (), std::string (issue.message ())));
76+ }
77+ ValidationResult result (std::move (check_issues));
78+ result.SetSource (std::move (source));
79+ return result;
80+ }
5981 CEL_ASSIGN_OR_RETURN (ValidationResult result,
60- type_checker_->Check (std::move (ast), arena));
82+ type_checker_->Check (* std::move (ast), arena));
6183
6284 result.SetSource (std::move (source));
6385 if (!validator_.validations ().empty ()) {
@@ -76,16 +98,18 @@ class CompilerImpl : public Compiler {
7698 std::unique_ptr<TypeChecker> type_checker_;
7799 std::unique_ptr<Parser> parser_;
78100 Validator validator_;
101+ CompilerOptions options_;
79102};
80103
81104class CompilerBuilderImpl : public CompilerBuilder {
82105 public:
83106 CompilerBuilderImpl (std::unique_ptr<TypeCheckerBuilder> type_checker_builder,
84107 std::unique_ptr<ParserBuilder> parser_builder,
85- Validator validator = Validator() )
108+ Validator validator, CompilerOptions options )
86109 : type_checker_builder_(std::move(type_checker_builder)),
87110 parser_builder_ (std::move(parser_builder)),
88- validator_(std::move(validator)) {}
111+ validator_(std::move(validator)),
112+ options_(options) {}
89113
90114 absl::Status AddLibrary (CompilerLibrary library) override {
91115 if (!library.id .empty ()) {
@@ -146,23 +170,23 @@ class CompilerBuilderImpl : public CompilerBuilder {
146170 absl::StatusOr<std::unique_ptr<Compiler>> Build () override {
147171 CEL_ASSIGN_OR_RETURN (auto parser, parser_builder_->Build ());
148172 CEL_ASSIGN_OR_RETURN (auto type_checker, type_checker_builder_->Build ());
149- return std::make_unique<CompilerImpl>(std::move (type_checker),
150- std::move (parser), validator_);
173+ return std::make_unique<CompilerImpl>(
174+ std::move (type_checker), std::move (parser), validator_, options_ );
151175 }
152176
153177 private:
154178 std::unique_ptr<TypeCheckerBuilder> type_checker_builder_;
155179 std::unique_ptr<ParserBuilder> parser_builder_;
156180 Validator validator_;
181+ CompilerOptions options_;
157182
158183 absl::flat_hash_set<std::string> library_ids_;
159184 absl::flat_hash_set<std::string> subsets_;
160185};
161186
162187std::unique_ptr<CompilerBuilder> CompilerImpl::ToBuilder () const {
163- auto builder = std::make_unique<CompilerBuilderImpl>(
164- type_checker_->ToBuilder (), parser_->ToBuilder (), validator_);
165- return builder;
188+ return std::make_unique<CompilerBuilderImpl>(
189+ type_checker_->ToBuilder (), parser_->ToBuilder (), validator_, options_);
166190}
167191
168192} // namespace
@@ -179,7 +203,8 @@ absl::StatusOr<std::unique_ptr<CompilerBuilder>> NewCompilerBuilder(
179203 auto parser_builder = NewParserBuilder (options.parser_options );
180204
181205 return std::make_unique<CompilerBuilderImpl>(std::move (type_checker_builder),
182- std::move (parser_builder));
206+ std::move (parser_builder),
207+ Validator (), options);
183208}
184209
185210} // namespace cel
0 commit comments