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
Original file line number Diff line number Diff line change
Expand Up @@ -1328,7 +1328,8 @@ fn test_format_item_static_method_with_generic_type_parameters() {
test_format_item(test_src, "SomeStruct", |result| {
let result = result.unwrap().unwrap();
let main_api = &result.main_api;
let unsupported_msg = "Error generating bindings for `SomeStruct::generic_method` \
let unsupported_msg =
"Error generating bindings for associated function `SomeStruct::generic_method` \
defined at <crubit_unittests.rs>;l=12: \
No valid non-generic replacement for generic type param `T`";
assert_cc_matches!(
Expand Down Expand Up @@ -1670,7 +1671,8 @@ fn test_format_item_method_taking_self_by_arc() {
test_format_item(test_src, "SomeStruct", |result| {
let result = result.unwrap().unwrap();
let main_api = &result.main_api;
let unsupported_msg = "Error generating bindings for `SomeStruct::get_f32` \
let unsupported_msg =
"Error generating bindings for associated function `SomeStruct::get_f32` \
defined at <crubit_unittests.rs>;l=7: \
Unsupported `self` type `std::sync::Arc<SomeStruct>`";
assert_cc_matches!(
Expand Down Expand Up @@ -1706,7 +1708,8 @@ fn test_format_item_method_taking_self_by_pinned_mut_ref() {
test_format_item(test_src, "SomeStruct", |result| {
let result = result.unwrap().unwrap();
let main_api = &result.main_api;
let unsupported_msg = "Error generating bindings for `SomeStruct::set_f32` \
let unsupported_msg =
"Error generating bindings for associated function `SomeStruct::set_f32` \
defined at <crubit_unittests.rs>;l=7: \
Unsupported `self` type `std::pin::Pin<&'__anon1 mut SomeStruct>`";
assert_cc_matches!(
Expand Down
61 changes: 38 additions & 23 deletions cc_bindings_from_rs/generate_bindings/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1587,28 +1587,14 @@ pub(crate) fn report_must_bind_error<'tcx>(
) {
let tcx = db.tcx();
let item_path = tcx.def_path_str(def_id);
let def_kind = tcx.def_kind(def_id);
let kind_str = match def_kind {
rustc_hir::def::DefKind::Struct => "struct",
rustc_hir::def::DefKind::Enum => "enum",
rustc_hir::def::DefKind::Union => "union",
rustc_hir::def::DefKind::Fn => "function",
rustc_hir::def::DefKind::TyAlias => "type alias",
rustc_hir::def::DefKind::Const { .. } => "constant",
rustc_hir::def::DefKind::Trait => "trait",
rustc_hir::def::DefKind::AssocFn => "function",
rustc_hir::def::DefKind::AssocConst { .. } => "constant",
rustc_hir::def::DefKind::AssocTy => "associated type",
_ => "item",
};
let error_details = format!(" {err:#}").replace('\n', "\n ");
let bold = "\x1B[1m";
let reset = "\x1B[0m";
let red = "\x1B[31m";
let must_bind_message = format!(
"{bold}{red}error:{reset}{bold} {kind_str} `{item_path}` could not be bound{reset}\n\
{error_details}\n\
{bold}note:{reset} hard error because `#[crubit_annotate::must_bind]` was applied to `{item_path}`"
"{bold}{red}error:{reset}{bold}{}\n\
{bold}note:{reset} hard error because `#[crubit_annotate::must_bind]` was applied to `{item_path}`",
unsupported_def_error_message(db, def_id, err, ErrorStyle::Terminal),
);
db.fatal_errors().report(&must_bind_message);
}
Expand Down Expand Up @@ -1670,6 +1656,37 @@ fn generate_item_impl<'tcx>(
}
}

enum ErrorStyle {
// This message will be formatted as a comment.
Comment,
// This message will be printed to a terminal.
Terminal,
}

pub(crate) fn unsupported_def_error_message(
db: &BindingsGenerator,
def_id: DefId,
err: &Error,
style: ErrorStyle,
) -> String {
let tcx = db.tcx();
let source_loc = generate_source_location(db, def_id);
let name = tcx.def_path_str(def_id);
let def_kind = tcx.def_kind(def_id);
let kind_str = def_kind.descr(def_id);
let err_msg = if let ErrorStyle::Terminal = style {
format!("\n {err:#}").replace('\n', "\n ")
} else {
format!(" {err:#}")
};
let bold = if let ErrorStyle::Terminal = style { "\x1B[1m" } else { "" };
let reset = if let ErrorStyle::Terminal = style { "\x1B[0m" } else { "" };

// https://docs.rs/anyhow/latest/anyhow/struct.Error.html#display-representations
// says: To print causes as well [...], use the alternate selector “{:#}”.
format!("{bold}{kind_str} `{name}` defined at {source_loc}:{reset}{err_msg}")
}

/// Formats a C++ comment explaining why no bindings have been generated for
/// `local_def_id`.
pub(crate) fn generate_unsupported_def<'tcx>(
Expand All @@ -1680,12 +1697,10 @@ pub(crate) fn generate_unsupported_def<'tcx>(
let tcx = db.tcx();
db.errors().assert_in_item(item_name_for_error_report(db, def_id));
db.errors().report(&err);
let source_loc = generate_source_location(db, def_id);
let name = tcx.def_path_str(def_id);

// https://docs.rs/anyhow/latest/anyhow/struct.Error.html#display-representations
// says: To print causes as well [...], use the alternate selector “{:#}”.
let msg = format!("Error generating bindings for `{name}` defined at {source_loc}: {err:#}");
let msg = format!(
"Error generating bindings for {}",
unsupported_def_error_message(db, def_id, &err, ErrorStyle::Comment)
);
CcSnippet::new(quote! { __NEWLINE__ __NEWLINE__ __COMMENT__ #msg __NEWLINE__ })
}

Expand Down
8 changes: 4 additions & 4 deletions cc_bindings_from_rs/test/arrays/arrays_cc_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -208,20 +208,20 @@ ::std::array<::std::array<::arrays::HasDropAndDefault, 2>, 2>
function_with_nested_drop_default_arrays(
::std::array<::std::array<::arrays::HasDropAndDefault, 2>, 2> array);

// Error generating bindings for
// Error generating bindings for function
// `arrays_golden::function_with_nested_droponly_arrays` defined at
// cc_bindings_from_rs/test/arrays/arrays.rs;l=98:
// b/260128806 - nested array [arrays_golden::HasDrop; 2] is not supported
// because it contains a type that implements Drop but not Default

// Error generating bindings for
// Error generating bindings for function
// `arrays_golden::function_with_nested_nested_droponly_arrays` defined at
// cc_bindings_from_rs/test/arrays/arrays.rs;l=104:
// b/260128806 - nested array [[arrays_golden::HasDrop; 2]; 2] is not supported
// because it contains a type that implements Drop but not Default

// Error generating bindings for `arrays_golden::function_with_tuple_array_id`
// defined at
// Error generating bindings for function
// `arrays_golden::function_with_tuple_array_id` defined at
// cc_bindings_from_rs/test/arrays/arrays.rs;l=27:
// Tuple types cannot be used inside of compound data types, because std::tuple
// is not layout-compatible with a Rust tuple.
Expand Down
25 changes: 14 additions & 11 deletions cc_bindings_from_rs/test/enums/enums_cc_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ struct CRUBIT_INTERNAL_RUST_TYPE(":: enums_golden :: repr_c :: MyEnum") alignas(
// cc_bindings_from_rs/test/enums/enums.rs;l=14
static MyEnum MakeF();

// Error generating bindings for `enums_golden::repr_c::MyEnum::Z` defined at
// Error generating bindings for variant `enums_golden::repr_c::MyEnum::Z`
// defined at
// cc_bindings_from_rs/test/enums/enums.rs;l=15:
// Tuple types cannot be used inside of compound data types, because
// std::tuple is not layout-compatible with a Rust tuple.
Expand All @@ -63,12 +64,14 @@ struct CRUBIT_INTERNAL_RUST_TYPE(":: enums_golden :: repr_c :: MyEnum") alignas(
// cc_bindings_from_rs/test/enums/enums.rs;l=16
static MyEnum MakeG();

// Error generating bindings for `enums_golden::repr_c::MyEnum::B` defined at
// Error generating bindings for variant `enums_golden::repr_c::MyEnum::B`
// defined at
// cc_bindings_from_rs/test/enums/enums.rs;l=17:
// Constructing non-tuple, struct-like enum variants is not supported:
// b/487357254

// Error generating bindings for `enums_golden::repr_c::MyEnum::C` defined at
// Error generating bindings for variant `enums_golden::repr_c::MyEnum::C`
// defined at
// cc_bindings_from_rs/test/enums/enums.rs;l=18:
// Constructing non-tuple, struct-like enum variants is not supported:
// b/487357254
Expand Down Expand Up @@ -254,7 +257,7 @@ struct CRUBIT_INTERNAL_RUST_TYPE(
// Default::default
CloneCount();

// Error generating bindings for
// Error generating bindings for variant
// `enums_golden::repr_c_clone_counter::CloneCount::A` defined at
// cc_bindings_from_rs/test/enums/enums.rs;l=56:
// Constructing non-tuple, struct-like enum variants is not supported:
Expand Down Expand Up @@ -324,8 +327,8 @@ struct CRUBIT_INTERNAL_RUST_TYPE(
// cc_bindings_from_rs/test/enums/enums.rs;l=34
static DropMe MakeQ();

// Error generating bindings for `enums_golden::repr_c_drop::DropMe::C`
// defined at
// Error generating bindings for variant
// `enums_golden::repr_c_drop::DropMe::C` defined at
// cc_bindings_from_rs/test/enums/enums.rs;l=35:
// Constructing non-tuple, struct-like enum variants is not supported:
// b/487357254
Expand Down Expand Up @@ -481,7 +484,7 @@ struct CRUBIT_INTERNAL_RUST_TYPE(
static ::enums::repr_rust::RustReprEnum MakeTuplePayloadVariant(
::std::int32_t __param_0, ::std::int32_t __param_1);

// Error generating bindings for
// Error generating bindings for variant
// `enums_golden::repr_rust::RustReprEnum::StructPayloadVariant` defined at
// cc_bindings_from_rs/test/enums/enums.rs;l=122:
// Constructing non-tuple, struct-like enum variants is not supported:
Expand Down Expand Up @@ -537,19 +540,19 @@ struct CRUBIT_INTERNAL_RUST_TYPE(
// doesn't implement the `Default` trait
RustReprWithNamingConflictBetweenCtorsAndMethods() = delete;

// Error generating bindings for
// Error generating bindings for variant
// `enums_golden::repr_rust::RustReprWithNamingConflictBetweenCtorsAndMethods::NoPayloadVariant`
// defined at
// cc_bindings_from_rs/test/enums/enums.rs;l=160:
// Conflicting member function name: MakeNoPayloadVariant

// Error generating bindings for
// Error generating bindings for variant
// `enums_golden::repr_rust::RustReprWithNamingConflictBetweenCtorsAndMethods::TuplePayloadVariant`
// defined at
// cc_bindings_from_rs/test/enums/enums.rs;l=161:
// Conflicting member function name: MakeTuplePayloadVariant

// Error generating bindings for
// Error generating bindings for variant
// `enums_golden::repr_rust::RustReprWithNamingConflictBetweenCtorsAndMethods::StructPayloadVariant`
// defined at
// cc_bindings_from_rs/test/enums/enums.rs;l=162:
Expand Down Expand Up @@ -610,7 +613,7 @@ struct CRUBIT_INTERNAL_RUST_TYPE(
static void __crubit_field_offset_assertions();
};

// Error generating bindings for
// Error generating bindings for enum
// `enums_golden::repr_rust::RustReprWithSingleNoPayloadVariant` defined at
// cc_bindings_from_rs/test/enums/enums.rs;l=151:
// Zero-sized types (ZSTs) are not supported (b/258259459)
Expand Down
15 changes: 8 additions & 7 deletions cc_bindings_from_rs/test/enums/option_cc_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
namespace option {
struct HasOptions;

// Error generating bindings for `option_golden::BridgedType` defined at
// Error generating bindings for struct `option_golden::BridgedType` defined at
// cc_bindings_from_rs/test/enums/option.rs;l=178:
// Type bindings for option_golden::BridgedType suppressed due to being mapped
// to an existing C++ type (int)
Expand Down Expand Up @@ -230,8 +230,8 @@ struct CRUBIT_INTERNAL_RUST_TYPE(":: option_golden :: NonMaxU8") alignas(1)
static void __crubit_field_offset_assertions();
};

// Error generating bindings for `option_golden::OptUninhabited` defined at
// cc_bindings_from_rs/test/enums/option.rs;l=153:
// Error generating bindings for struct `option_golden::OptUninhabited` defined
// at cc_bindings_from_rs/test/enums/option.rs;l=153:
// Zero-sized types (ZSTs) are not supported (b/258259459)

// Generated from:
Expand Down Expand Up @@ -298,15 +298,16 @@ OptionWithSizeTypes final {
static void __crubit_field_offset_assertions();
};

// Error generating bindings for `option_golden::UninhabitedEnum` defined at
// cc_bindings_from_rs/test/enums/option.rs;l=151:
// Error generating bindings for enum `option_golden::UninhabitedEnum` defined
// at cc_bindings_from_rs/test/enums/option.rs;l=151:
// Zero-sized types (ZSTs) are not supported (b/258259459)

// Error generating bindings for `option_golden::Unit` defined at
// Error generating bindings for struct `option_golden::Unit` defined at
// cc_bindings_from_rs/test/enums/option.rs;l=158:
// Zero-sized types (ZSTs) are not supported (b/258259459)

// Error generating bindings for `option_golden::take_option_bridged` defined at
// Error generating bindings for function `option_golden::take_option_bridged`
// defined at
// cc_bindings_from_rs/test/enums/option.rs;l=180:
// Error handling parameter #0 of type
// `std::option::Option<option_golden::BridgedType>`: Failed to format type for
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,12 @@

namespace function_pointers {

// Error generating bindings for
// Error generating bindings for constant
// `function_pointers_golden::CONST_C_FN_PTR_ADD_TEN` defined at
// cc_bindings_from_rs/test/function_pointers/function_pointers.rs;l=27:
// Pointer values cannot be used as scalar constants.

// Error generating bindings for
// Error generating bindings for constant
// `function_pointers_golden::CONST_RUST_FN_PTR_ADD_TEN` defined at
// cc_bindings_from_rs/test/function_pointers/function_pointers.rs;l=26:
// Function pointers can't have a thunk: Any calling convention other than
Expand Down Expand Up @@ -125,19 +125,19 @@ void call_fn_ptr_no_args_or_return(crubit::type_identity_t<void()>& fn_ptr);
::std::int32_t call_fn_ptr_with_five(
crubit::type_identity_t<::std::int32_t(::std::int32_t)>& fn_ptr);

// Error generating bindings for
// Error generating bindings for function
// `function_pointers_golden::call_fn_ptr_with_five_reference` defined at
// cc_bindings_from_rs/test/function_pointers/function_pointers.rs;l=45:
// Error handling parameter #0 of type `for<'a> extern "C" fn(&'a i32) -> i32`:
// Generic function pointers are not supported yet (b/259749023)

// Error generating bindings for
// Error generating bindings for function
// `function_pointers_golden::call_fn_ptr_with_five_reference_hrtb` defined at
// cc_bindings_from_rs/test/function_pointers/function_pointers.rs;l=50:
// Error handling parameter #0 of type `for<'a> extern "C" fn(&'a i32) -> i32`:
// Generic function pointers are not supported yet (b/259749023)

// Error generating bindings for
// Error generating bindings for function
// `function_pointers_golden::call_fn_ptr_with_repr_c_struct` defined at
// cc_bindings_from_rs/test/function_pointers/function_pointers.rs;l=69:
// Error handling parameter #0 of type `extern "C"
Expand All @@ -152,15 +152,15 @@ ::std::int32_t call_fn_ptr_with_repr_c_struct_ptr_containing_seven(
crubit::type_identity_t<
::std::int32_t(::function_pointers::CStruct const*)>& fn_ptr);

// Error generating bindings for
// Error generating bindings for function
// `function_pointers_golden::call_fn_ptr_with_repr_c_struct_ref` defined at
// cc_bindings_from_rs/test/function_pointers/function_pointers.rs;l=74:
// Error handling parameter #0 of type `for<'a> extern "C" fn(&'a
// function_pointers_golden::CStruct) -> i32`: Generic function pointers are not
// supported yet (b/259749023)

// Error generating bindings for `function_pointers_golden::call_rust_fn_ptr`
// defined at
// Error generating bindings for function
// `function_pointers_golden::call_rust_fn_ptr` defined at
// cc_bindings_from_rs/test/function_pointers/function_pointers.rs;l=35:
// Error handling parameter #0 of type `fn()`: Function pointers can't have a
// thunk: Any calling convention other than `extern "C"` requires a thunk
Expand Down
2 changes: 1 addition & 1 deletion cc_bindings_from_rs/test/functions/functions_cc_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ ::std::int32_t return_type();
// cc_bindings_from_rs/test/functions/functions.rs;l=169
::std::int32_t reused_generic_param(::std::int32_t x, ::std::int32_t y);

// Error generating bindings for
// Error generating bindings for function
// `functions_golden::generic_fn_tests::into_trait_tests::unused_generic_param`
// defined at
// cc_bindings_from_rs/test/functions/functions.rs;l=204:
Expand Down
6 changes: 3 additions & 3 deletions cc_bindings_from_rs/test/golden/composable_bridging_cc_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,13 @@

namespace composable_bridging_rust {

// Error generating bindings for `composable_bridging_rust_golden::MyOptionRust`
// defined at
// Error generating bindings for struct
// `composable_bridging_rust_golden::MyOptionRust` defined at
// cc_bindings_from_rs/test/golden/composable_bridging.rs;l=39:
// Type bindings for composable_bridging_rust_golden::MyOptionRust suppressed
// due to being mapped to an existing C++ type (std::optional)

// Error generating bindings for
// Error generating bindings for struct
// `composable_bridging_rust_golden::MyOptionRustAbi` defined at
// cc_bindings_from_rs/test/golden/composable_bridging.rs;l=50:
// Generic types are not supported yet (b/259749095)
Expand Down
6 changes: 3 additions & 3 deletions cc_bindings_from_rs/test/known_traits/index/rs_index_cc_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ struct CRUBIT_INTERNAL_RUST_TYPE(":: rs_index_golden :: IntPair") alignas(4)
// cc_bindings_from_rs/test/known_traits/index/rs_index.rs;l=22
::std::int32_t const& $(__anon1) operator[](::std::uintptr_t index) const&;

// Error generating bindings for `<rs_index_golden::IntPair as
// Error generating bindings for implementation `<rs_index_golden::IntPair as
// std::ops::Index<u64>>` defined at
// cc_bindings_from_rs/test/known_traits/index/rs_index.rs;l=44:
// Index implementation for `u64` is not supported when `Index<usize>` is
Expand All @@ -149,7 +149,7 @@ struct CRUBIT_INTERNAL_RUST_TYPE(":: rs_index_golden :: IntPair") alignas(4)
// cc_bindings_from_rs/test/known_traits/index/rs_index.rs;l=34
::std::int32_t& $(__anon1) operator[](::std::uintptr_t index) &;

// Error generating bindings for `<rs_index_golden::IntPair as
// Error generating bindings for implementation `<rs_index_golden::IntPair as
// std::ops::IndexMut<u64>>` defined at
// cc_bindings_from_rs/test/known_traits/index/rs_index.rs;l=56:
// Index implementation for `u64` is not supported when `Index<usize>` is
Expand Down Expand Up @@ -211,7 +211,7 @@ struct CRUBIT_INTERNAL_RUST_TYPE(":: rs_index_golden :: Map") alignas(8)
// cc_bindings_from_rs/test/known_traits/index/rs_index.rs;l=134
rs_std::StrRef operator[](::rs_index::Id const* crubit_nonnull index) const&;

// Error generating bindings for `<rs_index_golden::Map as
// Error generating bindings for implementation `<rs_index_golden::Map as
// std::ops::IndexMut<(usize, usize)>>` defined at
// cc_bindings_from_rs/test/known_traits/index/rs_index.rs;l=121:
// Mutable references to `str` are not yet supported.
Expand Down
4 changes: 2 additions & 2 deletions cc_bindings_from_rs/test/modules/modules_cc_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ namespace modules::outer {

namespace [[deprecated]] inner_deprecated {

// Error generating bindings for
// Error generating bindings for struct
// `modules_golden::outer::inner_deprecated::SomeType` defined at
// cc_bindings_from_rs/test/modules/modules.rs;l=26:
// Zero-sized types (ZSTs) are not supported (b/258259459)
Expand All @@ -111,7 +111,7 @@ namespace modules::outer::middle {

namespace [[deprecated]] innermost_deprecated {

// Error generating bindings for
// Error generating bindings for struct
// `modules_golden::outer::middle::innermost_deprecated::SomeType` defined at
// cc_bindings_from_rs/test/modules/modules.rs;l=32:
// Zero-sized types (ZSTs) are not supported (b/258259459)
Expand Down
Loading
Loading