blob: 87abac2fae5ace2b000efa4d4cdd3abab2afb077 [file]
// 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_