Skip to content

Commit bcb766e

Browse files
committed
---
yaml --- r: 208055 b: refs/heads/snap-stage3 c: e6378cb h: refs/heads/master i: 208053: 780c424 208051: 62e4870 208047: 4ecc687 v: v3
1 parent b0d4c1d commit bcb766e

File tree

19 files changed

+680
-35
lines changed

19 files changed

+680
-35
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
refs/heads/master: 38a97becdf3e6a6157f6f7ec2d98ade8d8edc193
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
4-
refs/heads/snap-stage3: 833fc273a7e63edea4f44e18112facdafe9185f6
4+
refs/heads/snap-stage3: e6378cbda39521fa3b9a457b5ed36ecefe37f932
55
refs/heads/try: 7b4ef47b7805a402d756fb8157101f64880a522f
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/dist-snap: ba4081a5a8573875fed17545846f6f6902c8ba8d

branches/snap-stage3/mk/crates.mk

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ RUSTC_CRATES := rustc rustc_typeck rustc_borrowck rustc_resolve rustc_driver \
5858
rustc_data_structures
5959
HOST_CRATES := syntax $(RUSTC_CRATES) rustdoc fmt_macros
6060
CRATES := $(TARGET_CRATES) $(HOST_CRATES)
61-
TOOLS := compiletest rustdoc rustc rustbook
61+
TOOLS := compiletest rustdoc rustc rustbook error-index-generator
6262

6363
DEPS_core :=
6464
DEPS_libc := core
@@ -107,10 +107,12 @@ TOOL_DEPS_compiletest := test getopts
107107
TOOL_DEPS_rustdoc := rustdoc
108108
TOOL_DEPS_rustc := rustc_driver
109109
TOOL_DEPS_rustbook := std rustdoc
110+
TOOL_DEPS_error-index-generator := rustdoc syntax serialize
110111
TOOL_SOURCE_compiletest := $(S)src/compiletest/compiletest.rs
111112
TOOL_SOURCE_rustdoc := $(S)src/driver/driver.rs
112113
TOOL_SOURCE_rustc := $(S)src/driver/driver.rs
113114
TOOL_SOURCE_rustbook := $(S)src/rustbook/main.rs
115+
TOOL_SOURCE_error-index-generator := $(S)src/error-index-generator/main.rs
114116

115117
ONLY_RLIB_core := 1
116118
ONLY_RLIB_libc := 1

branches/snap-stage3/mk/docs.mk

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,13 @@ RUSTBOOK_EXE = $(HBIN2_H_$(CFG_BUILD))/rustbook$(X_$(CFG_BUILD))
7171
# ./configure
7272
RUSTBOOK = $(RPATH_VAR2_T_$(CFG_BUILD)_H_$(CFG_BUILD)) $(RUSTBOOK_EXE)
7373

74+
# The error-index-generator executable...
75+
ERR_IDX_GEN_EXE = $(HBIN2_H_$(CFG_BUILD))/error-index-generator$(X_$(CFG_BUILD))
76+
ERR_IDX_GEN = $(RPATH_VAR2_T_$(CFG_BUILD)_H_$(CFG_BUILD)) $(ERR_IDX_GEN_EXE)
77+
7478
D := $(S)src/doc
7579

76-
DOC_TARGETS := trpl style
80+
DOC_TARGETS := trpl style error-index
7781
COMPILER_DOC_TARGETS :=
7882
DOC_L10N_TARGETS :=
7983

@@ -288,3 +292,9 @@ doc/style/index.html: $(RUSTBOOK_EXE) $(wildcard $(S)/src/doc/style/*.md) | doc/
288292
@$(call E, rustbook: $@)
289293
$(Q)rm -rf doc/style
290294
$(Q)$(RUSTBOOK) build $(S)src/doc/style doc/style
295+
296+
error-index: doc/error-index.html
297+
298+
doc/error-index.html: $(ERR_IDX_GEN_EXE) | doc/
299+
$(Q)$(call E, error-index-generator: $@)
300+
$(Q)$(ERR_IDX_GEN)

branches/snap-stage3/mk/prepare.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ define PREPARE_MAN
7070
$(Q)$(PREPARE_MAN_CMD) $(PREPARE_SOURCE_MAN_DIR)/$(1) $(PREPARE_DEST_MAN_DIR)/$(1)
7171
endef
7272

73-
PREPARE_TOOLS = $(filter-out compiletest rustbook, $(TOOLS))
73+
PREPARE_TOOLS = $(filter-out compiletest rustbook error-index-generator, $(TOOLS))
7474

7575

7676
# $(1) is tool
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
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+
#![feature(rustc_private, rustdoc)]
12+
13+
extern crate syntax;
14+
extern crate rustdoc;
15+
extern crate serialize as rustc_serialize;
16+
17+
use std::collections::BTreeMap;
18+
use std::fs::{read_dir, File};
19+
use std::io::{Read, Write};
20+
use std::path::Path;
21+
use std::error::Error;
22+
23+
use syntax::diagnostics::metadata::{get_metadata_dir, ErrorMetadataMap};
24+
25+
use rustdoc::html::markdown::Markdown;
26+
use rustc_serialize::json;
27+
28+
/// Load all the metadata files from `metadata_dir` into an in-memory map.
29+
fn load_all_errors(metadata_dir: &Path) -> Result<ErrorMetadataMap, Box<Error>> {
30+
let mut all_errors = BTreeMap::new();
31+
32+
for entry in try!(read_dir(metadata_dir)) {
33+
let path = try!(entry).path();
34+
35+
let mut metadata_str = String::new();
36+
try!(
37+
File::open(&path).and_then(|mut f|
38+
f.read_to_string(&mut metadata_str))
39+
);
40+
41+
let some_errors: ErrorMetadataMap = try!(json::decode(&metadata_str));
42+
43+
for (err_code, info) in some_errors {
44+
all_errors.insert(err_code, info);
45+
}
46+
}
47+
48+
Ok(all_errors)
49+
}
50+
51+
/// Output an HTML page for the errors in `err_map` to `output_path`.
52+
fn render_error_page(err_map: &ErrorMetadataMap, output_path: &Path) -> Result<(), Box<Error>> {
53+
let mut output_file = try!(File::create(output_path));
54+
55+
try!(write!(&mut output_file,
56+
r##"<!DOCTYPE html>
57+
<html>
58+
<head>
59+
<title>Rust Compiler Error Index</title>
60+
<meta charset="utf-8">
61+
<!-- Include rust.css after main.css so its rules take priority. -->
62+
<link rel="stylesheet" type="text/css" href="main.css"/>
63+
<link rel="stylesheet" type="text/css" href="rust.css"/>
64+
<style>
65+
.error-undescribed {{
66+
display: none;
67+
}}
68+
</style>
69+
</head>
70+
<body>
71+
"##
72+
));
73+
74+
try!(write!(&mut output_file, "<h1>Rust Compiler Error Index</h1>\n"));
75+
76+
for (err_code, info) in err_map.iter() {
77+
// Enclose each error in a div so they can be shown/hidden en masse.
78+
let desc_desc = match info.description {
79+
Some(_) => "error-described",
80+
None => "error-undescribed"
81+
};
82+
let use_desc = match info.use_site {
83+
Some(_) => "error-used",
84+
None => "error-unused"
85+
};
86+
try!(write!(&mut output_file, "<div class=\"{} {}\">", desc_desc, use_desc));
87+
88+
// Error title (with self-link).
89+
try!(write!(&mut output_file,
90+
"<h2 id=\"{0}\" class=\"section-header\"><a href=\"#{0}\">{0}</a></h2>\n",
91+
err_code
92+
));
93+
94+
// Description rendered as markdown.
95+
match info.description {
96+
Some(ref desc) => try!(write!(&mut output_file, "{}", Markdown(desc))),
97+
None => try!(write!(&mut output_file, "<p>No description.</p>\n"))
98+
}
99+
100+
try!(write!(&mut output_file, "</div>\n"));
101+
}
102+
103+
try!(write!(&mut output_file, "</body>\n</html>"));
104+
105+
Ok(())
106+
}
107+
108+
fn main_with_result() -> Result<(), Box<Error>> {
109+
let metadata_dir = get_metadata_dir();
110+
let err_map = try!(load_all_errors(&metadata_dir));
111+
try!(render_error_page(&err_map, Path::new("doc/error-index.html")));
112+
Ok(())
113+
}
114+
115+
fn main() {
116+
if let Err(e) = main_with_result() {
117+
panic!("{}", e.description());
118+
}
119+
}

branches/snap-stage3/src/libcollections/slice.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -996,9 +996,13 @@ impl<T> [T] {
996996
////////////////////////////////////////////////////////////////////////////////
997997
// Extension traits for slices over specific kinds of data
998998
////////////////////////////////////////////////////////////////////////////////
999-
#[unstable(feature = "collections", reason = "U should be an associated type")]
999+
#[unstable(feature = "collections", reason = "recently changed")]
10001000
/// An extension trait for concatenating slices
1001-
pub trait SliceConcatExt<T: ?Sized, U> {
1001+
pub trait SliceConcatExt<T: ?Sized> {
1002+
#[unstable(feature = "collections", reason = "recently changed")]
1003+
/// The resulting type after concatenation
1004+
type Output;
1005+
10021006
/// Flattens a slice of `T` into a single value `U`.
10031007
///
10041008
/// # Examples
@@ -1007,7 +1011,7 @@ pub trait SliceConcatExt<T: ?Sized, U> {
10071011
/// assert_eq!(["hello", "world"].concat(), "helloworld");
10081012
/// ```
10091013
#[stable(feature = "rust1", since = "1.0.0")]
1010-
fn concat(&self) -> U;
1014+
fn concat(&self) -> Self::Output;
10111015

10121016
/// Flattens a slice of `T` into a single value `U`, placing a given separator between each.
10131017
///
@@ -1017,10 +1021,12 @@ pub trait SliceConcatExt<T: ?Sized, U> {
10171021
/// assert_eq!(["hello", "world"].connect(" "), "hello world");
10181022
/// ```
10191023
#[stable(feature = "rust1", since = "1.0.0")]
1020-
fn connect(&self, sep: &T) -> U;
1024+
fn connect(&self, sep: &T) -> Self::Output;
10211025
}
10221026

1023-
impl<T: Clone, V: AsRef<[T]>> SliceConcatExt<T, Vec<T>> for [V] {
1027+
impl<T: Clone, V: AsRef<[T]>> SliceConcatExt<T> for [V] {
1028+
type Output = Vec<T>;
1029+
10241030
fn concat(&self) -> Vec<T> {
10251031
let size = self.iter().fold(0, |acc, v| acc + v.as_ref().len());
10261032
let mut result = Vec::with_capacity(size);

branches/snap-stage3/src/libcollections/str.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,9 @@ pub use core::str::pattern;
8383
Section: Creating a string
8484
*/
8585

86-
impl<S: AsRef<str>> SliceConcatExt<str, String> for [S] {
86+
impl<S: AsRef<str>> SliceConcatExt<str> for [S] {
87+
type Output = String;
88+
8789
fn concat(&self) -> String {
8890
if self.is_empty() {
8991
return String::new();

branches/snap-stage3/src/libcollections/vec_deque.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1395,6 +1395,42 @@ impl<T> VecDeque<T> {
13951395
// naive impl
13961396
self.extend(other.drain());
13971397
}
1398+
1399+
/// Retains only the elements specified by the predicate.
1400+
///
1401+
/// In other words, remove all elements `e` such that `f(&e)` returns false.
1402+
/// This method operates in place and preserves the order of the retained
1403+
/// elements.
1404+
///
1405+
/// # Examples
1406+
///
1407+
/// ```
1408+
/// # #![feature(vec_deque_retain)]
1409+
/// use std::collections::VecDeque;
1410+
///
1411+
/// let mut buf = VecDeque::new();
1412+
/// buf.extend(1..5);
1413+
/// buf.retain(|&x| x%2 == 0);
1414+
///
1415+
/// let v: Vec<_> = buf.into_iter().collect();
1416+
/// assert_eq!(&v[..], &[2, 4]);
1417+
/// ```
1418+
#[unstable(feature = "vec_deque_retain",
1419+
reason = "new API, waiting for dust to settle")]
1420+
pub fn retain<F>(&mut self, mut f: F) where F: FnMut(&T) -> bool {
1421+
let len = self.len();
1422+
let mut del = 0;
1423+
for i in 0..len {
1424+
if !f(&self[i]) {
1425+
del += 1;
1426+
} else if del > 0 {
1427+
self.swap(i-del, i);
1428+
}
1429+
}
1430+
if del > 0 {
1431+
self.truncate(len - del);
1432+
}
1433+
}
13981434
}
13991435

14001436
impl<T: Clone> VecDeque<T> {

branches/snap-stage3/src/libcollectionstest/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#![feature(into_cow)]
2222
#![feature(step_by)]
2323
#![cfg_attr(test, feature(str_char))]
24+
#![cfg_attr(test, feature(vec_deque_retain))]
2425

2526
#[macro_use] extern crate log;
2627

branches/snap-stage3/src/libcollectionstest/vec_deque.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -885,3 +885,12 @@ fn test_append() {
885885
assert_eq!(b.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
886886
assert_eq!(a.iter().cloned().collect::<Vec<_>>(), []);
887887
}
888+
889+
#[test]
890+
fn test_retain() {
891+
let mut buf = VecDeque::new();
892+
buf.extend(1..5);
893+
buf.retain(|&x| x % 2 == 0);
894+
let v: Vec<_> = buf.into_iter().collect();
895+
assert_eq!(&v[..], &[2, 4]);
896+
}

0 commit comments

Comments
 (0)