Merge pull request #1334 from gypsydave5/fix_1255

Fix #1255 - incorrect removal of `default` on associated types
This commit is contained in:
Nick Cameron 2017-02-27 11:57:58 +13:00 committed by GitHub
commit eff665c5c4
3 changed files with 39 additions and 11 deletions

View file

@ -1240,11 +1240,11 @@ pub fn rewrite_associated_type(ident: ast::Ident,
let type_bounds_str = if let Some(ty_param_bounds) = ty_param_bounds_opt {
let bounds: &[_] = ty_param_bounds;
let bound_str = try_opt!(bounds.iter()
.map(|ty_bound| {
ty_bound.rewrite(context, Shape::legacy(context.config.max_width, indent))
})
.intersperse(Some(" + ".to_string()))
.collect::<Option<String>>());
.map(|ty_bound| {
ty_bound.rewrite(context, Shape::legacy(context.config.max_width, indent))
})
.intersperse(Some(" + ".to_string()))
.collect::<Option<String>>());
if bounds.len() > 0 {
format!(": {}", bound_str)
} else {
@ -1267,6 +1267,22 @@ pub fn rewrite_associated_type(ident: ast::Ident,
}
}
pub fn rewrite_associated_impl_type(ident: ast::Ident,
defaultness: ast::Defaultness,
ty_opt: Option<&ptr::P<ast::Ty>>,
ty_param_bounds_opt: Option<&ast::TyParamBounds>,
context: &RewriteContext,
indent: Indent)
-> Option<String> {
let result =
try_opt!(rewrite_associated_type(ident, ty_opt, ty_param_bounds_opt, context, indent));
match defaultness {
ast::Defaultness::Default => Some(format!("default {}", result)),
_ => Some(result),
}
}
impl Rewrite for ast::FunctionRetTy {
fn rewrite(&self, context: &RewriteContext, shape: Shape) -> Option<String> {
match *self {

View file

@ -21,7 +21,8 @@ use config::Config;
use rewrite::{Rewrite, RewriteContext};
use comment::rewrite_comment;
use macros::{rewrite_macro, MacroPosition};
use items::{rewrite_static, rewrite_associated_type, rewrite_type_alias, format_impl, format_trait};
use items::{rewrite_static, rewrite_associated_type, rewrite_associated_impl_type,
rewrite_type_alias, format_impl, format_trait};
fn is_use_item(item: &ast::Item) -> bool {
match item.node {
@ -411,11 +412,12 @@ impl<'a> FmtVisitor<'a> {
self.push_rewrite(ii.span, rewrite);
}
ast::ImplItemKind::Type(ref ty) => {
let rewrite = rewrite_associated_type(ii.ident,
Some(ty),
None,
&self.get_context(),
self.block_indent);
let rewrite = rewrite_associated_impl_type(ii.ident,
ii.defaultness,
Some(ty),
None,
&self.get_context(),
self.block_indent);
self.push_rewrite(ii.span, rewrite);
}
ast::ImplItemKind::Macro(ref mac) => {

View file

@ -0,0 +1,10 @@
// Test for issue #1255
// Default annotation incorrectly removed on associated types
#![feature(specialization)]
trait Trait {
type Type;
}
impl<T> Trait for T {
default type Type = u64; // 'default' should not be removed
}