Skip to content

Commit bb0fb99

Browse files
committed
---
yaml --- r: 190014 b: refs/heads/master c: 8c85a9d h: refs/heads/master v: v3
1 parent 3e7e3a6 commit bb0fb99

File tree

7 files changed

+144
-98
lines changed

7 files changed

+144
-98
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: edbc0e509f016426f6366fba0d0001bc828bd450
2+
refs/heads/master: 8c85a9d20f6d764f80e55132f821dcd996921327
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 270a677d4d698916f5ad103f0afc3c070b8dbeb4
55
refs/heads/try: 1c28ab65017d74fc13d003f7c7a73d1a48e5406f

trunk/src/librustc/middle/dead.rs

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ struct MarkSymbolVisitor<'a, 'tcx: 'a> {
4747
struct_has_extern_repr: bool,
4848
ignore_non_const_paths: bool,
4949
inherited_pub_visibility: bool,
50-
ignore_variant_stack: Vec<ast::NodeId>,
5150
}
5251

5352
impl<'a, 'tcx> MarkSymbolVisitor<'a, 'tcx> {
@@ -60,7 +59,6 @@ impl<'a, 'tcx> MarkSymbolVisitor<'a, 'tcx> {
6059
struct_has_extern_repr: false,
6160
ignore_non_const_paths: false,
6261
inherited_pub_visibility: false,
63-
ignore_variant_stack: vec![],
6462
}
6563
}
6664

@@ -81,9 +79,7 @@ impl<'a, 'tcx> MarkSymbolVisitor<'a, 'tcx> {
8179
def::DefPrimTy(_) => (),
8280
def::DefVariant(enum_id, variant_id, _) => {
8381
self.check_def_id(enum_id);
84-
if !self.ignore_variant_stack.contains(&variant_id.node) {
85-
self.check_def_id(variant_id);
86-
}
82+
self.check_def_id(variant_id);
8783
}
8884
_ => {
8985
self.check_def_id(def.def_id());
@@ -282,23 +278,6 @@ impl<'a, 'tcx, 'v> Visitor<'v> for MarkSymbolVisitor<'a, 'tcx> {
282278
visit::walk_expr(self, expr);
283279
}
284280

285-
fn visit_arm(&mut self, arm: &ast::Arm) {
286-
if arm.pats.len() == 1 {
287-
let pat = &*arm.pats[0];
288-
let variants = pat_util::necessary_variants(&self.tcx.def_map, pat);
289-
290-
// Inside the body, ignore constructions of variants
291-
// necessary for the pattern to match. Those construction sites
292-
// can't be reached unless the variant is constructed elsewhere.
293-
let len = self.ignore_variant_stack.len();
294-
self.ignore_variant_stack.push_all(&*variants);
295-
visit::walk_arm(self, arm);
296-
self.ignore_variant_stack.truncate(len);
297-
} else {
298-
visit::walk_arm(self, arm);
299-
}
300-
}
301-
302281
fn visit_pat(&mut self, pat: &ast::Pat) {
303282
let def_map = &self.tcx.def_map;
304283
match pat.node {
@@ -418,11 +397,6 @@ fn create_and_seed_worklist(tcx: &ty::ctxt,
418397
worklist.push(*id);
419398
}
420399
for id in reachable_symbols {
421-
// Reachable variants can be dead, because we warn about
422-
// variants never constructed, not variants never used.
423-
if let Some(ast_map::NodeVariant(..)) = tcx.map.find(*id) {
424-
continue;
425-
}
426400
worklist.push(*id);
427401
}
428402

trunk/src/librustc/middle/pat_util.rs

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -155,27 +155,3 @@ pub fn def_to_path(tcx: &ty::ctxt, id: ast::DefId) -> ast::Path {
155155
span: DUMMY_SP,
156156
})
157157
}
158-
159-
/// Return variants that are necessary to exist for the pattern to match.
160-
pub fn necessary_variants(dm: &DefMap, pat: &ast::Pat) -> Vec<ast::NodeId> {
161-
let mut variants = vec![];
162-
walk_pat(pat, |p| {
163-
match p.node {
164-
ast::PatEnum(_, _) |
165-
ast::PatIdent(_, _, None) |
166-
ast::PatStruct(..) => {
167-
match dm.borrow().get(&p.id) {
168-
Some(&PathResolution {base_def: DefVariant(_, id, _), ..}) => {
169-
variants.push(id.node);
170-
}
171-
_ => ()
172-
}
173-
}
174-
_ => ()
175-
}
176-
true
177-
});
178-
variants.sort();
179-
variants.dedup();
180-
variants
181-
}

trunk/src/librustdoc/html/render.rs

Lines changed: 107 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
//! both occur before the crate is rendered.
3535
pub use self::ExternalLocation::*;
3636

37+
use std::ascii::OwnedAsciiExt;
3738
use std::cell::RefCell;
3839
use std::cmp::Ordering;
3940
use std::collections::{HashMap, HashSet};
@@ -239,6 +240,51 @@ struct IndexItem {
239240
path: String,
240241
desc: String,
241242
parent: Option<ast::DefId>,
243+
search_type: Option<IndexItemFunctionType>,
244+
}
245+
246+
/// A type used for the search index.
247+
struct Type {
248+
name: Option<String>,
249+
}
250+
251+
impl fmt::Display for Type {
252+
/// Formats type as {name: $name}.
253+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
254+
// Wrapping struct fmt should never call us when self.name is None,
255+
// but just to be safe we write `null` in that case.
256+
match self.name {
257+
Some(ref n) => write!(f, "{{\"name\":\"{}\"}}", n),
258+
None => write!(f, "null")
259+
}
260+
}
261+
}
262+
263+
/// Full type of functions/methods in the search index.
264+
struct IndexItemFunctionType {
265+
inputs: Vec<Type>,
266+
output: Option<Type>
267+
}
268+
269+
impl fmt::Display for IndexItemFunctionType {
270+
/// Formats a full fn type as a JSON {inputs: [Type], outputs: Type/null}.
271+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
272+
// If we couldn't figure out a type, just write `null`.
273+
if self.inputs.iter().any(|ref i| i.name.is_none()) ||
274+
(self.output.is_some() && self.output.as_ref().unwrap().name.is_none()) {
275+
return write!(f, "null")
276+
}
277+
278+
let inputs: Vec<String> = self.inputs.iter().map(|ref t| format!("{}", t)).collect();
279+
try!(write!(f, "{{\"inputs\":[{}],\"output\":", inputs.connect(",")));
280+
281+
match self.output {
282+
Some(ref t) => try!(write!(f, "{}", t)),
283+
None => try!(write!(f, "null"))
284+
};
285+
286+
Ok(try!(write!(f, "}}")))
287+
}
242288
}
243289

244290
// TLS keys used to carry information around during rendering.
@@ -409,6 +455,7 @@ fn build_index(krate: &clean::Crate, cache: &mut Cache) -> io::Result<String> {
409455
path: fqp[..fqp.len() - 1].connect("::"),
410456
desc: shorter(item.doc_value()).to_string(),
411457
parent: Some(did),
458+
search_type: None,
412459
});
413460
},
414461
None => {}
@@ -458,7 +505,11 @@ fn build_index(krate: &clean::Crate, cache: &mut Cache) -> io::Result<String> {
458505
let pathid = *nodeid_to_pathid.get(&nodeid).unwrap();
459506
try!(write!(&mut w, ",{}", pathid));
460507
}
461-
None => {}
508+
None => try!(write!(&mut w, ",null"))
509+
}
510+
match item.search_type {
511+
Some(ref t) => try!(write!(&mut w, ",{}", t)),
512+
None => try!(write!(&mut w, ",null"))
462513
}
463514
try!(write!(&mut w, "]"));
464515
}
@@ -872,12 +923,21 @@ impl DocFolder for Cache {
872923

873924
match parent {
874925
(parent, Some(path)) if is_method || (!self.privmod && !hidden_field) => {
926+
// Needed to determine `self` type.
927+
let parent_basename = self.parent_stack.first().and_then(|parent| {
928+
match self.paths.get(parent) {
929+
Some(&(ref fqp, _)) => Some(fqp[fqp.len() - 1].clone()),
930+
_ => None
931+
}
932+
});
933+
875934
self.search_index.push(IndexItem {
876935
ty: shortty(&item),
877936
name: s.to_string(),
878937
path: path.connect("::").to_string(),
879938
desc: shorter(item.doc_value()).to_string(),
880939
parent: parent,
940+
search_type: get_index_search_type(&item, parent_basename),
881941
});
882942
}
883943
(Some(parent), None) if is_method || (!self.privmod && !hidden_field)=> {
@@ -2307,6 +2367,52 @@ fn make_item_keywords(it: &clean::Item) -> String {
23072367
format!("{}, {}", get_basic_keywords(), it.name.as_ref().unwrap())
23082368
}
23092369

2370+
fn get_index_search_type(item: &clean::Item,
2371+
parent: Option<String>) -> Option<IndexItemFunctionType> {
2372+
let decl = match item.inner {
2373+
clean::FunctionItem(ref f) => &f.decl,
2374+
clean::MethodItem(ref m) => &m.decl,
2375+
clean::TyMethodItem(ref m) => &m.decl,
2376+
_ => return None
2377+
};
2378+
2379+
let mut inputs = Vec::new();
2380+
2381+
// Consider `self` an argument as well.
2382+
if let Some(name) = parent {
2383+
inputs.push(Type { name: Some(name.into_ascii_lowercase()) });
2384+
}
2385+
2386+
inputs.extend(&mut decl.inputs.values.iter().map(|arg| {
2387+
get_index_type(&arg.type_)
2388+
}));
2389+
2390+
let output = match decl.output {
2391+
clean::FunctionRetTy::Return(ref return_type) => Some(get_index_type(return_type)),
2392+
_ => None
2393+
};
2394+
2395+
Some(IndexItemFunctionType { inputs: inputs, output: output })
2396+
}
2397+
2398+
fn get_index_type(clean_type: &clean::Type) -> Type {
2399+
Type { name: get_index_type_name(clean_type).map(|s| s.into_ascii_lowercase()) }
2400+
}
2401+
2402+
fn get_index_type_name(clean_type: &clean::Type) -> Option<String> {
2403+
match *clean_type {
2404+
clean::ResolvedPath { ref path, .. } => {
2405+
let segments = &path.segments;
2406+
Some(segments[segments.len() - 1].name.clone())
2407+
},
2408+
clean::Generic(ref s) => Some(s.clone()),
2409+
clean::Primitive(ref p) => Some(format!("{:?}", p)),
2410+
clean::BorrowedRef { ref type_, .. } => get_index_type_name(type_),
2411+
// FIXME: add all from clean::Type.
2412+
_ => None
2413+
}
2414+
}
2415+
23102416
pub fn cache() -> Arc<Cache> {
23112417
CACHE_KEY.with(|c| c.borrow().clone())
23122418
}

trunk/src/librustdoc/html/static/main.js

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,33 @@
209209
break;
210210
}
211211
}
212+
// searching by type
213+
} else if (val.search("->") > -1) {
214+
var trimmer = function (s) { return s.trim(); };
215+
var parts = val.split("->").map(trimmer);
216+
var input = parts[0];
217+
// sort inputs so that order does not matter
218+
var inputs = input.split(",").map(trimmer).sort();
219+
var output = parts[1];
220+
221+
for (var i = 0; i < nSearchWords; ++i) {
222+
var type = searchIndex[i].type;
223+
if (!type) {
224+
continue;
225+
}
226+
227+
// sort index inputs so that order does not matter
228+
var typeInputs = type.inputs.map(function (input) {
229+
return input.name;
230+
}).sort();
231+
232+
// allow searching for void (no output) functions as well
233+
var typeOutput = type.output ? type.output.name : "";
234+
if (inputs.toString() === typeInputs.toString() &&
235+
output == typeOutput) {
236+
results.push({id: i, index: -1, dontValidate: true});
237+
}
238+
}
212239
} else {
213240
// gather matching search results up to a certain maximum
214241
val = val.replace(/\_/g, "");
@@ -329,6 +356,11 @@
329356
path = result.item.path.toLowerCase(),
330357
parent = result.item.parent;
331358

359+
// this validation does not make sense when searching by types
360+
if (result.dontValidate) {
361+
continue;
362+
}
363+
332364
var valid = validateResult(name, path, split, parent);
333365
if (!valid) {
334366
result.id = -1;
@@ -573,7 +605,8 @@
573605
// (String) name,
574606
// (String) full path or empty string for previous path,
575607
// (String) description,
576-
// (optional Number) the parent path index to `paths`]
608+
// (Number | null) the parent path index to `paths`]
609+
// (Object | null) the type of the function (if any)
577610
var items = rawSearchIndex[crate].items;
578611
// an array of [(Number) item type,
579612
// (String) name]
@@ -598,7 +631,7 @@
598631
var rawRow = items[i];
599632
var row = {crate: crate, ty: rawRow[0], name: rawRow[1],
600633
path: rawRow[2] || lastPath, desc: rawRow[3],
601-
parent: paths[rawRow[4]]};
634+
parent: paths[rawRow[4]], type: rawRow[5]};
602635
searchIndex.push(row);
603636
if (typeof row.name === "string") {
604637
var word = row.name.toLowerCase();

trunk/src/libtest/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,6 @@ impl fmt::Display for TestName {
123123
#[derive(Clone, Copy)]
124124
enum NamePadding {
125125
PadNone,
126-
#[allow(dead_code)]
127126
PadOnLeft,
128127
PadOnRight,
129128
}

trunk/src/test/compile-fail/lint-dead-code-variant.rs

Lines changed: 0 additions & 42 deletions
This file was deleted.

0 commit comments

Comments
 (0)