Merge pull request #2165 from topecongiro/issue-2164
Handle large types on struct fields
This commit is contained in:
commit
fa794f5808
@ -2596,7 +2596,7 @@ pub fn rewrite_assign_rhs<S: Into<String>, R: Rewrite>(
|
|||||||
Some(lhs + &rhs)
|
Some(lhs + &rhs)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn choose_rhs<R: Rewrite>(
|
pub fn choose_rhs<R: Rewrite>(
|
||||||
context: &RewriteContext,
|
context: &RewriteContext,
|
||||||
expr: &R,
|
expr: &R,
|
||||||
shape: Shape,
|
shape: Shape,
|
||||||
|
33
src/items.rs
33
src/items.rs
@ -23,7 +23,7 @@
|
|||||||
use comment::{combine_strs_with_missing_comments, contains_comment, recover_comment_removed,
|
use comment::{combine_strs_with_missing_comments, contains_comment, recover_comment_removed,
|
||||||
recover_missing_comment_in_span, rewrite_missing_comment, FindUncommented};
|
recover_missing_comment_in_span, rewrite_missing_comment, FindUncommented};
|
||||||
use config::{BraceStyle, Config, Density, IndentStyle, ReturnIndent};
|
use config::{BraceStyle, Config, Density, IndentStyle, ReturnIndent};
|
||||||
use expr::{format_expr, is_empty_block, is_simple_block_stmt, rewrite_assign_rhs,
|
use expr::{choose_rhs, format_expr, is_empty_block, is_simple_block_stmt, rewrite_assign_rhs,
|
||||||
rewrite_call_inner, ExprType};
|
rewrite_call_inner, ExprType};
|
||||||
use lists::{definitive_tactic, itemize_list, write_list, DefinitiveListTactic, ListFormatting,
|
use lists::{definitive_tactic, itemize_list, write_list, DefinitiveListTactic, ListFormatting,
|
||||||
ListItem, ListTactic, Separator, SeparatorPlace, SeparatorTactic};
|
ListItem, ListTactic, Separator, SeparatorPlace, SeparatorTactic};
|
||||||
@ -1200,7 +1200,7 @@ pub fn format_struct_struct(
|
|||||||
let items_str = rewrite_with_alignment(
|
let items_str = rewrite_with_alignment(
|
||||||
fields,
|
fields,
|
||||||
context,
|
context,
|
||||||
Shape::indented(offset, context.config),
|
Shape::indented(offset, context.config).sub_width(1)?,
|
||||||
mk_sp(body_lo, span.hi()),
|
mk_sp(body_lo, span.hi()),
|
||||||
one_line_budget,
|
one_line_budget,
|
||||||
)?;
|
)?;
|
||||||
@ -1480,34 +1480,23 @@ pub fn rewrite_struct_field(
|
|||||||
spacing.push(' ');
|
spacing.push(' ');
|
||||||
}
|
}
|
||||||
let ty_shape = shape.offset_left(overhead + spacing.len())?;
|
let ty_shape = shape.offset_left(overhead + spacing.len())?;
|
||||||
if let Some(ref ty) = field.ty.rewrite(context, ty_shape) {
|
let mut orig_ty = field.ty.rewrite(context, ty_shape);
|
||||||
|
if let Some(ref ty) = orig_ty {
|
||||||
if !ty.contains('\n') {
|
if !ty.contains('\n') {
|
||||||
return Some(attr_prefix + &spacing + ty);
|
return Some(attr_prefix + &spacing + ty);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// We must use multiline.
|
// We must use multiline. We are going to put attributes and a field on different lines.
|
||||||
let new_shape = shape.with_max_width(context.config);
|
// 1 = " "
|
||||||
let ty_rewritten = field.ty.rewrite(context, new_shape)?;
|
let rhs_shape = shape.offset_left(last_line_width(&prefix) + 1)?;
|
||||||
|
orig_ty = field.ty.rewrite(context, rhs_shape);
|
||||||
let field_str = if prefix.is_empty() {
|
let field_str = if prefix.is_empty() {
|
||||||
ty_rewritten
|
orig_ty?
|
||||||
} else if prefix.len() + first_line_width(&ty_rewritten) + 1 <= shape.width {
|
|
||||||
prefix + " " + &ty_rewritten
|
|
||||||
} else {
|
} else {
|
||||||
let type_offset = shape.indent.block_indent(context.config);
|
prefix + &choose_rhs(context, &*field.ty, rhs_shape, orig_ty)?
|
||||||
let nested_shape = Shape::indented(type_offset, context.config);
|
|
||||||
let nested_ty = field.ty.rewrite(context, nested_shape)?;
|
|
||||||
prefix + "\n" + &type_offset.to_string(context.config) + &nested_ty
|
|
||||||
};
|
};
|
||||||
combine_strs_with_missing_comments(
|
combine_strs_with_missing_comments(context, &attrs_str, &field_str, missing_span, shape, false)
|
||||||
context,
|
|
||||||
&attrs_str,
|
|
||||||
&field_str,
|
|
||||||
missing_span,
|
|
||||||
shape,
|
|
||||||
attrs_extendable,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct StaticParts<'a> {
|
pub struct StaticParts<'a> {
|
||||||
|
17
src/types.rs
17
src/types.rs
@ -25,7 +25,8 @@
|
|||||||
SeparatorPlace, SeparatorTactic};
|
SeparatorPlace, SeparatorTactic};
|
||||||
use rewrite::{Rewrite, RewriteContext};
|
use rewrite::{Rewrite, RewriteContext};
|
||||||
use shape::Shape;
|
use shape::Shape;
|
||||||
use utils::{colon_spaces, extra_offset, format_abi, format_mutability, last_line_width, mk_sp};
|
use utils::{colon_spaces, extra_offset, first_line_width, format_abi, format_mutability,
|
||||||
|
last_line_width, mk_sp};
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
|
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
|
||||||
pub enum PathContext {
|
pub enum PathContext {
|
||||||
@ -365,7 +366,8 @@ enum ArgumentKind<T>
|
|||||||
let list_str = write_list(&item_vec, &fmt)?;
|
let list_str = write_list(&item_vec, &fmt)?;
|
||||||
|
|
||||||
let ty_shape = match context.config.indent_style() {
|
let ty_shape = match context.config.indent_style() {
|
||||||
IndentStyle::Block => shape.block().block_indent(context.config.tab_spaces()),
|
// 4 = " -> "
|
||||||
|
IndentStyle::Block => shape.offset_left(4)?,
|
||||||
IndentStyle::Visual => shape.block_left(4)?,
|
IndentStyle::Visual => shape.block_left(4)?,
|
||||||
};
|
};
|
||||||
let output = match *output {
|
let output = match *output {
|
||||||
@ -376,24 +378,23 @@ enum ArgumentKind<T>
|
|||||||
FunctionRetTy::Default(..) => String::new(),
|
FunctionRetTy::Default(..) => String::new(),
|
||||||
};
|
};
|
||||||
|
|
||||||
let shape = shape.sub_width(output.len())?;
|
let extendable = (!list_str.contains('\n') || list_str.is_empty()) && !output.contains("\n");
|
||||||
let extendable = !list_str.contains('\n') || list_str.is_empty();
|
|
||||||
let args = wrap_args_with_parens(
|
let args = wrap_args_with_parens(
|
||||||
context,
|
context,
|
||||||
&list_str,
|
&list_str,
|
||||||
extendable,
|
extendable,
|
||||||
shape,
|
shape.sub_width(first_line_width(&output))?,
|
||||||
Shape::indented(offset, context.config),
|
Shape::indented(offset, context.config),
|
||||||
);
|
);
|
||||||
if last_line_width(&args) + output.len() > shape.width {
|
if last_line_width(&args) + first_line_width(&output) <= shape.width {
|
||||||
|
Some(format!("{}{}", args, output))
|
||||||
|
} else {
|
||||||
Some(format!(
|
Some(format!(
|
||||||
"{}\n{}{}",
|
"{}\n{}{}",
|
||||||
args,
|
args,
|
||||||
offset.to_string(context.config),
|
offset.to_string(context.config),
|
||||||
output.trim_left()
|
output.trim_left()
|
||||||
))
|
))
|
||||||
} else {
|
|
||||||
Some(format!("{}{}", args, output))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
4
tests/source/issue-2164.rs
Normal file
4
tests/source/issue-2164.rs
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
// A stress test against code generated by bindgen.
|
||||||
|
#[repr(C)]
|
||||||
|
#[derive(Debug, Copy, Clone)]
|
||||||
|
pub struct emacs_env_25 { pub size : isize , pub private_members : * mut emacs_env_private , pub make_global_ref : :: std :: option :: Option < unsafe extern "C" fn ( env : * mut emacs_env , any_reference : emacs_value ) -> emacs_value > , pub free_global_ref : :: std :: option :: Option < unsafe extern "C" fn ( env : * mut emacs_env , global_reference : emacs_value ) > , pub non_local_exit_check : :: std :: option :: Option < unsafe extern "C" fn ( env : * mut emacs_env ) -> emacs_funcall_exit > , pub non_local_exit_clear : :: std :: option :: Option < unsafe extern "C" fn ( env : * mut emacs_env ) > , pub non_local_exit_get : :: std :: option :: Option < unsafe extern "C" fn ( env : * mut emacs_env , non_local_exit_symbol_out : * mut emacs_value , non_local_exit_data_out : * mut emacs_value ) -> emacs_funcall_exit > , pub non_local_exit_signal : :: std :: option :: Option < unsafe extern "C" fn ( env : * mut emacs_env , non_local_exit_symbol : emacs_value , non_local_exit_data : emacs_value ) > , pub non_local_exit_throw : :: std :: option :: Option < unsafe extern "C" fn ( env : * mut emacs_env , tag : emacs_value , value : emacs_value ) > , pub make_function : :: std :: option :: Option < unsafe extern "C" fn ( env : * mut emacs_env , min_arity : isize , max_arity : isize , function : :: std :: option :: Option < unsafe extern "C" fn ( env : * mut emacs_env , nargs : isize , args : * mut emacs_value , arg1 : * mut ::libc :: c_void ) -> emacs_value > , documentation : * const ::libc :: c_char , data : * mut ::libc :: c_void ) -> emacs_value > , pub funcall : :: std :: option :: Option < unsafe extern "C" fn ( env : * mut emacs_env , function : emacs_value , nargs : isize , args : * mut emacs_value ) -> emacs_value > , pub intern : :: std :: option :: Option < unsafe extern "C" fn ( env : * mut emacs_env , symbol_name : * const ::libc :: c_char ) -> emacs_value > , pub type_of : :: std :: option :: Option < unsafe extern "C" fn ( env : * mut emacs_env , value : emacs_value ) -> emacs_value > , pub is_not_nil : :: std :: option :: Option < unsafe extern "C" fn ( env : * mut emacs_env , value : emacs_value ) -> bool > , pub eq : :: std :: option :: Option < unsafe extern "C" fn ( env : * mut emacs_env , a : emacs_value , b : emacs_value ) -> bool > , pub extract_integer : :: std :: option :: Option < unsafe extern "C" fn ( env : * mut emacs_env , value : emacs_value ) -> intmax_t > , pub make_integer : :: std :: option :: Option < unsafe extern "C" fn ( env : * mut emacs_env , value : intmax_t ) -> emacs_value > , pub extract_float : :: std :: option :: Option < unsafe extern "C" fn ( env : * mut emacs_env , value : emacs_value ) -> f64 > , pub make_float : :: std :: option :: Option < unsafe extern "C" fn ( env : * mut emacs_env , value : f64 ) -> emacs_value > , pub copy_string_contents : :: std :: option :: Option < unsafe extern "C" fn ( env : * mut emacs_env , value : emacs_value , buffer : * mut ::libc :: c_char , size_inout : * mut isize ) -> bool > , pub make_string : :: std :: option :: Option < unsafe extern "C" fn ( env : * mut emacs_env , contents : * const ::libc :: c_char , length : isize ) -> emacs_value > , pub make_user_ptr : :: std :: option :: Option < unsafe extern "C" fn ( env : * mut emacs_env , fin : :: std :: option :: Option < unsafe extern "C" fn ( arg1 : * mut ::libc :: c_void ) > , ptr : * mut ::libc :: c_void ) -> emacs_value > , pub get_user_ptr : :: std :: option :: Option < unsafe extern "C" fn ( env : * mut emacs_env , uptr : emacs_value ) -> * mut ::libc :: c_void > , pub set_user_ptr : :: std :: option :: Option < unsafe extern "C" fn ( env : * mut emacs_env , uptr : emacs_value , ptr : * mut ::libc :: c_void ) > , pub get_user_finalizer : :: std :: option :: Option < unsafe extern "C" fn ( arg1 : * mut ::libc :: c_void , env : * mut emacs_env , uptr : emacs_value ) -> :: std :: option :: Option < unsafe extern "C" fn ( arg1 : * mut ::libc :: c_void , env : * mut emacs_env , uptr : emacs_value ) > > , pub set_user_finalizer : :: std :: option :: Option < unsafe extern "C" fn ( env : * mut emacs_env , uptr : emacs_value , fin : :: std :: option :: Option < unsafe extern "C" fn ( arg1 : * mut ::libc :: c_void ) > ) > , pub vec_get : :: std :: option :: Option < unsafe extern "C" fn ( env : * mut emacs_env , vec : emacs_value , i : isize ) -> emacs_value > , pub vec_set : :: std :: option :: Option < unsafe extern "C" fn ( env : * mut emacs_env , vec : emacs_value , i : isize , val : emacs_value ) > , pub vec_size : :: std :: option :: Option < unsafe extern "C" fn ( env : * mut emacs_env , vec : emacs_value ) -> isize > , }
|
@ -78,8 +78,7 @@ impl<M, S, F, X> SubSelectDirect<M, S, F, X>
|
|||||||
where
|
where
|
||||||
M: select::Selector,
|
M: select::Selector,
|
||||||
S: event::Stream,
|
S: event::Stream,
|
||||||
F: for<'t> FnMut(transform::Api<'t, Stream<ContentStream<S>>>)
|
F: for<'t> FnMut(transform::Api<'t, Stream<ContentStream<S>>>) -> transform::Api<'t, X>,
|
||||||
-> transform::Api<'t, X>,
|
|
||||||
X: event::Stream,
|
X: event::Stream,
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
132
tests/target/issue-2164.rs
Normal file
132
tests/target/issue-2164.rs
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
// A stress test against code generated by bindgen.
|
||||||
|
#[repr(C)]
|
||||||
|
#[derive(Debug, Copy, Clone)]
|
||||||
|
pub struct emacs_env_25 {
|
||||||
|
pub size: isize,
|
||||||
|
pub private_members: *mut emacs_env_private,
|
||||||
|
pub make_global_ref: ::std::option::Option<
|
||||||
|
unsafe extern "C" fn(env: *mut emacs_env, any_reference: emacs_value) -> emacs_value,
|
||||||
|
>,
|
||||||
|
pub free_global_ref: ::std::option::Option<
|
||||||
|
unsafe extern "C" fn(env: *mut emacs_env, global_reference: emacs_value),
|
||||||
|
>,
|
||||||
|
pub non_local_exit_check:
|
||||||
|
::std::option::Option<unsafe extern "C" fn(env: *mut emacs_env) -> emacs_funcall_exit>,
|
||||||
|
pub non_local_exit_clear: ::std::option::Option<unsafe extern "C" fn(env: *mut emacs_env)>,
|
||||||
|
pub non_local_exit_get: ::std::option::Option<
|
||||||
|
unsafe extern "C" fn(
|
||||||
|
env: *mut emacs_env,
|
||||||
|
non_local_exit_symbol_out: *mut emacs_value,
|
||||||
|
non_local_exit_data_out: *mut emacs_value,
|
||||||
|
) -> emacs_funcall_exit,
|
||||||
|
>,
|
||||||
|
pub non_local_exit_signal: ::std::option::Option<
|
||||||
|
unsafe extern "C" fn(
|
||||||
|
env: *mut emacs_env,
|
||||||
|
non_local_exit_symbol: emacs_value,
|
||||||
|
non_local_exit_data: emacs_value,
|
||||||
|
),
|
||||||
|
>,
|
||||||
|
pub non_local_exit_throw: ::std::option::Option<
|
||||||
|
unsafe extern "C" fn(env: *mut emacs_env, tag: emacs_value, value: emacs_value),
|
||||||
|
>,
|
||||||
|
pub make_function: ::std::option::Option<
|
||||||
|
unsafe extern "C" fn(
|
||||||
|
env: *mut emacs_env,
|
||||||
|
min_arity: isize,
|
||||||
|
max_arity: isize,
|
||||||
|
function: ::std::option::Option<
|
||||||
|
unsafe extern "C" fn(
|
||||||
|
env: *mut emacs_env,
|
||||||
|
nargs: isize,
|
||||||
|
args: *mut emacs_value,
|
||||||
|
arg1: *mut ::libc::c_void,
|
||||||
|
) -> emacs_value,
|
||||||
|
>,
|
||||||
|
documentation: *const ::libc::c_char,
|
||||||
|
data: *mut ::libc::c_void,
|
||||||
|
) -> emacs_value,
|
||||||
|
>,
|
||||||
|
pub funcall: ::std::option::Option<
|
||||||
|
unsafe extern "C" fn(
|
||||||
|
env: *mut emacs_env,
|
||||||
|
function: emacs_value,
|
||||||
|
nargs: isize,
|
||||||
|
args: *mut emacs_value,
|
||||||
|
) -> emacs_value,
|
||||||
|
>,
|
||||||
|
pub intern: ::std::option::Option<
|
||||||
|
unsafe extern "C" fn(env: *mut emacs_env, symbol_name: *const ::libc::c_char)
|
||||||
|
-> emacs_value,
|
||||||
|
>,
|
||||||
|
pub type_of: ::std::option::Option<
|
||||||
|
unsafe extern "C" fn(env: *mut emacs_env, value: emacs_value) -> emacs_value,
|
||||||
|
>,
|
||||||
|
pub is_not_nil: ::std::option::Option<
|
||||||
|
unsafe extern "C" fn(env: *mut emacs_env, value: emacs_value) -> bool,
|
||||||
|
>,
|
||||||
|
pub eq: ::std::option::Option<
|
||||||
|
unsafe extern "C" fn(env: *mut emacs_env, a: emacs_value, b: emacs_value) -> bool,
|
||||||
|
>,
|
||||||
|
pub extract_integer: ::std::option::Option<
|
||||||
|
unsafe extern "C" fn(env: *mut emacs_env, value: emacs_value) -> intmax_t,
|
||||||
|
>,
|
||||||
|
pub make_integer: ::std::option::Option<
|
||||||
|
unsafe extern "C" fn(env: *mut emacs_env, value: intmax_t) -> emacs_value,
|
||||||
|
>,
|
||||||
|
pub extract_float:
|
||||||
|
::std::option::Option<unsafe extern "C" fn(env: *mut emacs_env, value: emacs_value) -> f64>,
|
||||||
|
pub make_float:
|
||||||
|
::std::option::Option<unsafe extern "C" fn(env: *mut emacs_env, value: f64) -> emacs_value>,
|
||||||
|
pub copy_string_contents: ::std::option::Option<
|
||||||
|
unsafe extern "C" fn(
|
||||||
|
env: *mut emacs_env,
|
||||||
|
value: emacs_value,
|
||||||
|
buffer: *mut ::libc::c_char,
|
||||||
|
size_inout: *mut isize,
|
||||||
|
) -> bool,
|
||||||
|
>,
|
||||||
|
pub make_string: ::std::option::Option<
|
||||||
|
unsafe extern "C" fn(env: *mut emacs_env, contents: *const ::libc::c_char, length: isize)
|
||||||
|
-> emacs_value,
|
||||||
|
>,
|
||||||
|
pub make_user_ptr: ::std::option::Option<
|
||||||
|
unsafe extern "C" fn(
|
||||||
|
env: *mut emacs_env,
|
||||||
|
fin: ::std::option::Option<
|
||||||
|
unsafe extern "C" fn(arg1: *mut ::libc::c_void),
|
||||||
|
>,
|
||||||
|
ptr: *mut ::libc::c_void,
|
||||||
|
) -> emacs_value,
|
||||||
|
>,
|
||||||
|
pub get_user_ptr: ::std::option::Option<
|
||||||
|
unsafe extern "C" fn(env: *mut emacs_env, uptr: emacs_value) -> *mut ::libc::c_void,
|
||||||
|
>,
|
||||||
|
pub set_user_ptr: ::std::option::Option<
|
||||||
|
unsafe extern "C" fn(env: *mut emacs_env, uptr: emacs_value, ptr: *mut ::libc::c_void),
|
||||||
|
>,
|
||||||
|
pub get_user_finalizer: ::std::option::Option<
|
||||||
|
unsafe extern "C" fn(
|
||||||
|
arg1: *mut ::libc::c_void, env: *mut emacs_env, uptr: emacs_value
|
||||||
|
) -> ::std::option::Option<
|
||||||
|
unsafe extern "C" fn(arg1: *mut ::libc::c_void, env: *mut emacs_env, uptr: emacs_value),
|
||||||
|
>,
|
||||||
|
>,
|
||||||
|
pub set_user_finalizer: ::std::option::Option<
|
||||||
|
unsafe extern "C" fn(
|
||||||
|
env: *mut emacs_env,
|
||||||
|
uptr: emacs_value,
|
||||||
|
fin: ::std::option::Option<
|
||||||
|
unsafe extern "C" fn(arg1: *mut ::libc::c_void),
|
||||||
|
>,
|
||||||
|
),
|
||||||
|
>,
|
||||||
|
pub vec_get: ::std::option::Option<
|
||||||
|
unsafe extern "C" fn(env: *mut emacs_env, vec: emacs_value, i: isize) -> emacs_value,
|
||||||
|
>,
|
||||||
|
pub vec_set: ::std::option::Option<
|
||||||
|
unsafe extern "C" fn(env: *mut emacs_env, vec: emacs_value, i: isize, val: emacs_value),
|
||||||
|
>,
|
||||||
|
pub vec_size:
|
||||||
|
::std::option::Option<unsafe extern "C" fn(env: *mut emacs_env, vec: emacs_value) -> isize>,
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user