]> git.lizzy.rs Git - rust.git/blob - src/imports.rs
Comments after return
[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, MAX_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         // 2 = } + ;
41         let used_width = indent + path_str.len() + 2;
42         let budget = if used_width >= IDEAL_WIDTH {
43             if used_width < MAX_WIDTH {
44                 MAX_WIDTH - used_width
45             } else {
46                 // Give up
47                 return String::new();
48             }
49         } else {
50             IDEAL_WIDTH - used_width
51         };
52         let fmt = ListFormatting {
53             tactic: ListTactic::Mixed,
54             separator: ",",
55             trailing_separator: SeparatorTactic::Never,
56             indent: indent,
57             h_width: budget,
58             v_width: budget,
59         };
60
61         // TODO handle any comments inbetween items.
62         // If `self` is in the list, put it first.
63         let head = if path_list.iter().any(|vpi|
64             if let ast::PathListItem_::PathListMod{ .. } = vpi.node {
65                 true
66             } else {
67                 false
68             }
69         ) {
70             Some(("self".to_string(), String::new()))
71         } else {
72             None
73         };
74
75         let items: Vec<_> = head.into_iter().chain(path_list.iter().filter_map(|vpi| {
76             match vpi.node {
77                 ast::PathListItem_::PathListIdent{ name, .. } => {
78                     Some((token::get_ident(name).to_string(), String::new()))
79                 }
80                 // Skip `self`, because we added it above.
81                 ast::PathListItem_::PathListMod{ .. } => None,
82             }
83         })).collect();
84
85         format!("use {}::{{{}}};", path_str, write_list(&items, &fmt))
86     }
87 }