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: 4 additions & 2 deletions cc_bindings_from_rs/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ use std::rc::Rc;

use cmdline::Cmdline;
use code_gen_utils::CcInclude;
use error_report::{ErrorReport, ErrorReporting, FatalErrors, ReportFatalError};
use error_report::{ErrorReport, ErrorReporting, FatalErrors, ReportFatalError, SourceLanguage};
use generate_bindings::{BindingsGenerator, IncludeGuard};
use kythe_metadata::cc_embed_provenance_map;
use run_compiler::run_compiler;
Expand Down Expand Up @@ -114,7 +114,8 @@ fn run_with_tcx(cmdline: &Cmdline, tcx: TyCtxt) -> Result<()> {
use generate_bindings::{generate_bindings, BindingsTokens};

let generate_error_report = cmdline.error_report_out.is_some();
let (error_report, errors) = ErrorReport::new_rc_or_ignore(generate_error_report);
let (error_report, errors) =
ErrorReport::new_rc_or_ignore(generate_error_report, SourceLanguage::Rust);
let fatal_errors = Rc::new(FatalErrors::new());

let BindingsTokens { cc_api, cc_api_impl } = {
Expand Down Expand Up @@ -670,6 +671,7 @@ mod tests {
let error_report = std::fs::read_to_string(&error_report_out_path)?;
let expected_error_report = r#"[
{
"source_language": "Rust",
"name": "test_crate::Unsupported",
"errors": [
{
Expand Down
49 changes: 38 additions & 11 deletions common/error_report.rs
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,12 @@ pub struct ItemName {
pub unique_name: Option<Rc<str>>,
}

#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum SourceLanguage {
Cpp,
Rust,
}

pub struct ItemScope<'a> {
report: &'a dyn ErrorReporting,
item: ItemName,
Expand Down Expand Up @@ -275,8 +281,10 @@ fn hide_unstable_details(input: &str) -> String {
}

/// Errors per-item.
#[derive(Default, Debug)]
#[derive(Debug)]
pub struct ErrorReport {
/// The language where items are declared.
source_language: SourceLanguage,
// The interior mutability / borrow_mut will never panic: it is never borrowed for longer than
// a method call, and the methods do not call each other.
map: RefCell<BTreeMap<u64, ErrorReportEntry>>,
Expand All @@ -302,18 +310,21 @@ where
}

impl ErrorReport {
pub fn new() -> Self {
Self::default()
pub fn new(source_language: SourceLanguage) -> Self {
Self { source_language, map: Default::default(), current_item: Default::default() }
}

/// If `enable` is true, returns a pair of an `ErrorReport` and a `dyn
/// ErrorReporting` that will report errors into the `ErrorReport`.
///
/// If `enable` is false, returns `None` with a `dyn ErrorReporting` that
/// will ignore errors.
pub fn new_rc_or_ignore(enable: bool) -> (Option<Rc<Self>>, Rc<dyn ErrorReporting>) {
pub fn new_rc_or_ignore(
enable: bool,
source_language: SourceLanguage,
) -> (Option<Rc<Self>>, Rc<dyn ErrorReporting>) {
if enable {
let this = Rc::new(Self::default());
let this = Rc::new(Self::new(source_language));
(Some(this.clone()), this)
} else {
(None, Rc::new(IgnoreErrors))
Expand Down Expand Up @@ -358,7 +369,10 @@ impl ErrorReporting for ErrorReport {
self.map
.borrow_mut()
.entry(self.current_item().id)
.or_default()
.or_insert_with(|| ErrorReportEntry {
source_language: Some(self.source_language),
..Default::default()
})
.errors
.push(reported_error);
}
Expand All @@ -371,6 +385,7 @@ impl ErrorReporting for ErrorReport {
match map.entry(item.id) {
Entry::Vacant(e) => {
e.insert(ErrorReportEntry {
source_language: Some(self.source_language),
name: item.name.clone(),
unique_name: item.unique_name.clone(),
..Default::default()
Expand Down Expand Up @@ -407,8 +422,14 @@ impl ErrorReporting for ErrorReport {
}

fn add_category(&self, category: Category) {
self.map.borrow_mut().entry(self.current_item().id).or_default().category |=
category as u32;
self.map
.borrow_mut()
.entry(self.current_item().id)
.or_insert_with(|| ErrorReportEntry {
source_language: Some(self.source_language),
..Default::default()
})
.category |= category as u32;
}
}

Expand All @@ -418,6 +439,8 @@ impl ErrorReporting for ErrorReport {
/// backwards-compatible.
#[derive(Default, Debug, Serialize, Deserialize)]
pub struct ErrorReportEntry {
pub source_language: Option<SourceLanguage>,

pub name: Rc<str>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub errors: Vec<FormattedError>,
Expand Down Expand Up @@ -638,7 +661,7 @@ mod tests {

#[gtest]
fn error_report() {
let report = ErrorReport::new();
let report = ErrorReport::new(SourceLanguage::Cpp);
report.report(&anyhow!("abc{}", "def"));
report.report(&anyhow!("abc{}", "123"));
report.report(&anyhow!("error code: {}", 65535));
Expand Down Expand Up @@ -674,6 +697,7 @@ mod tests {
serde_json::from_str::<serde_json::Value>(&report.to_json_string()).unwrap(),
serde_json::json!([
{
"source_language": "Cpp",
"name": "",
"errors": [
{
Expand Down Expand Up @@ -721,7 +745,7 @@ mod tests {

#[gtest]
fn error_report_item_name() {
let report = ErrorReport::new();
let report = ErrorReport::new(SourceLanguage::Rust);
{
let _scope =
ItemScope::new(&report, ItemName { name: "foo".into(), id: 1, unique_name: None });
Expand All @@ -739,6 +763,7 @@ mod tests {
serde_json::from_str::<serde_json::Value>(&report.to_json_string()).unwrap(),
serde_json::json!([
{
"source_language": "Rust",
"name": "foo",
"errors": [
{
Expand All @@ -748,6 +773,7 @@ mod tests {
],
},
{
"source_language": "Rust",
"name": "bar",
"errors": [
{
Expand All @@ -763,7 +789,7 @@ mod tests {

#[gtest]
fn test_error_list_elements_are_reported() {
let report = ErrorReport::new();
let report = ErrorReport::new(SourceLanguage::Cpp);
report.report(&arc_anyhow::Error::from(ErrorList::from(vec![
anyhow!("abc{}", "def"),
anyhow!("hijk"),
Expand All @@ -772,6 +798,7 @@ mod tests {
serde_json::from_str::<serde_json::Value>(&report.to_json_string()).unwrap(),
serde_json::json!([
{
"source_language": "Cpp",
"name": "",
"errors": [
{
Expand Down
5 changes: 3 additions & 2 deletions common/errors_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

use error_report::{anyhow, ErrorReport, ErrorReporting};
use error_report::{anyhow, ErrorReport, ErrorReporting, SourceLanguage};
use errors::Errors;
use googletest::prelude::*;

Expand All @@ -22,12 +22,13 @@ fn test_errors_consolidate_on_nonempty_list_returns_reportable_error() -> google
return fail!();
};

let report = ErrorReport::new();
let report = ErrorReport::new(SourceLanguage::Cpp);
report.report(&error.into());
expect_eq!(
serde_json::from_str::<serde_json::Value>(&report.to_json_string()).unwrap(),
serde_json::json!([
{
"source_language": "Cpp",
"name": "",
"errors": [
{ "fmt": "abc" },
Expand Down
4 changes: 2 additions & 2 deletions rs_bindings_from_cc/generate_bindings/cc_api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

use database::code_snippet::{Bindings, FfiBindings};
use error_report::{ErrorReport, ErrorReporting, FatalErrors};
use error_report::{ErrorReport, ErrorReporting, FatalErrors, SourceLanguage};
use ffi_types::{Environment, FfiU8Slice, FfiU8SliceBox};
use generate_bindings::generate_bindings;
use std::ffi::OsString;
Expand Down Expand Up @@ -55,7 +55,7 @@ pub unsafe extern "C" fn GenerateBindingsImpl(
catch_unwind(|| {
let mut error_report: Option<ErrorReport> = None;
let errors: &dyn ErrorReporting = if generate_error_report {
error_report.insert(ErrorReport::new())
error_report.insert(ErrorReport::new(SourceLanguage::Cpp))
} else {
&error_report::IgnoreErrors
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
use arc_anyhow::Result;
use database::code_snippet;
use database::BindingsGenerator;
use error_report::{ErrorReport, FatalErrors};
use error_report::{ErrorReport, FatalErrors, SourceLanguage};
use ffi_types::Environment;
use generate_bindings::new_database;
use generate_comment::{generate_doc_comment, generate_unsupported};
Expand Down Expand Up @@ -139,7 +139,7 @@ impl TestDbFactory {
fn new() -> Self {
Self {
ir: make_ir_from_items([]),
errors: ErrorReport::new(),
errors: ErrorReport::new(SourceLanguage::Cpp),
fatal_errors: FatalErrors::new(),
}
}
Expand Down
4 changes: 2 additions & 2 deletions rs_bindings_from_cc/generate_bindings/test_generators.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
use arc_anyhow::Result;
use database::code_snippet::BindingsTokens;
use database::db::BindingsGenerator;
use error_report::{bail, ErrorReport, FatalErrors};
use error_report::{bail, ErrorReport, FatalErrors, SourceLanguage};
use ffi_types::Environment;
use generate_bindings::{generate_bindings_tokens, new_database};
use ir::IR;
Expand Down Expand Up @@ -39,7 +39,7 @@ impl TestDbFactory {
pub fn from_cc(cc_str: &str) -> Result<Self> {
Ok(Self {
ir: ir_from_cc(cc_str)?,
errors: ErrorReport::new(),
errors: ErrorReport::new(SourceLanguage::Cpp),
fatal_errors: FatalErrors::new(),
})
}
Expand Down