| // Copyright 2026 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef TOOLS_GN_FFI_ERR_H_ |
| #define TOOLS_GN_FFI_ERR_H_ |
| |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include "cxx.h" |
| #include "gn/err.h" |
| #include "gn/input_file.h" |
| #include "gn/input_file_manager.h" |
| #include "gn/scheduler.h" |
| #include "gn/source_file.h" |
| |
| inline const InputFile& NewInputFile(rust::Str name, rust::Str code) { |
| // Yes, the same file can be created multiple times. |
| // No, we don't really care, since this is only for error messages. |
| SourceFile source_file{std::string(name)}; |
| InputFileManager* manager = g_scheduler->input_file_manager(); |
| |
| InputFile* file = nullptr; |
| std::vector<Token>* tokens = nullptr; |
| std::unique_ptr<ParseNode>* parse_root = nullptr; |
| manager->AddDynamicInput(source_file, &file, &tokens, &parse_root); |
| file->SetContents(std::string(code)); |
| file->set_friendly_name(std::string(name)); |
| return *file; |
| } |
| |
| inline void PopulateErrWithLocation(Err& err, |
| rust::Str message, |
| rust::Str help, |
| const InputFile& file, |
| int start_line, |
| int start_column, |
| int end_line, |
| int end_column) { |
| Location begin(&file, start_line, start_column); |
| Location end(&file, end_line, end_column); |
| LocationRange range(begin, end); |
| err = Err(range, std::string(message), std::string(help)); |
| } |
| |
| inline void PopulateErrWithMessage(Err& err, |
| rust::Str message, |
| rust::Str help) { |
| err = Err(Location(), std::string(message), std::string(help)); |
| } |
| |
| inline void AppendSubErr(Err& err, |
| rust::Str message, |
| const InputFile& file, |
| int start_line, |
| int start_column, |
| int end_line, |
| int end_column) { |
| Location begin(&file, start_line, start_column); |
| Location end(&file, end_line, end_column); |
| LocationRange range(begin, end); |
| err.AppendSubErr(Err(range, std::string(message))); |
| } |
| |
| inline std::unique_ptr<Err> NewErr() { |
| return std::make_unique<Err>(); |
| } |
| |
| inline rust::String ErrToString(const Err& err) { |
| return rust::String(err.to_string()); |
| } |
| |
| #endif // TOOLS_GN_FFI_ERR_H_ |