]> git.lizzy.rs Git - rust.git/blob - src/imports.rs
Keep comments on fn arguments
[rust.git] / src / imports.rs
1 // Copyright 2015 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 use visitor::FmtVisitor;
12 use lists::{write_list, ListFormatting, SeparatorTactic, ListTactic};
13
14 use syntax::ast;
15 use syntax::codemap::Span;
16 use syntax::parse::token;
17 use syntax::print::pprust;
18
19 use IDEAL_WIDTH;
20
21 // TODO change import lists with one item to a single import
22 //      remove empty lists (if they're even possible)
23 // TODO (some day) remove unused imports, expand globs, compress many single imports into a list import
24
25 impl<'a> FmtVisitor<'a> {
26     // Basically just pretty prints a multi-item import.
27     pub fn rewrite_use_list(&mut self,
28                         path: &ast::Path,
29                         path_list: &[ast::PathListItem],
30                         vp_span: Span) -> String {
31         // FIXME remove unused imports
32
33         // FIXME check indentation
34         let l_loc = self.codemap.lookup_char_pos(vp_span.lo);
35
36         let path_str = pprust::path_to_string(&path);
37
38         // 3 = :: + {
39         let indent = l_loc.col.0 + path_str.len() + 3;
40         let fmt = ListFormatting {
41             tactic: ListTactic::Mixed,
42             separator: ",",
43             trailing_separator: SeparatorTactic::Never,
44             indent: indent,
45             // 2 = } + ;
46             h_width: IDEAL_WIDTH - (indent + path_str.len() + 2),
47             v_width: IDEAL_WIDTH - (indent + path_str.len() + 2),
48         };
49
50         // TODO handle any comments inbetween items.
51         // If `self` is in the list, put it first.
52         let head = if path_list.iter().any(|vpi|
53             if let ast::PathListItem_::PathListMod{ .. } = vpi.node {
54                 true
55             } else {
56                 false
57             }
58         ) {
59             Some(("self".to_string(), String::new()))
60         } else {
61             None
62         };
63
64         let items: Vec<_> = head.into_iter().chain(path_list.iter().filter_map(|vpi| {
65             match vpi.node {
66                 ast::PathListItem_::PathListIdent{ name, .. } => {
67                     Some((token::get_ident(name).to_string(), String::new()))
68                 }
69                 // Skip `self`, because we added it above.
70                 ast::PathListItem_::PathListMod{ .. } => None,
71             }
72         })).collect();
73
74         format!("use {}::{{{}}};", path_str, write_list(&items, &fmt))
75     }
76 }