Skip to content

Commit e65158b

Browse files
committed
---
yaml --- r: 216655 b: refs/heads/stable c: 347ee73 h: refs/heads/master i: 216653: c6ae8c3 216651: aac8888 216647: 94600cc 216639: 70137a6 v: v3
1 parent 03a5875 commit e65158b

File tree

34 files changed

+1172
-99
lines changed

34 files changed

+1172
-99
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,5 @@ refs/heads/tmp: 378a370ff2057afeb1eae86eb6e78c476866a4a6
2929
refs/tags/1.0.0-alpha.2: 4c705f6bc559886632d3871b04f58aab093bfa2f
3030
refs/tags/homu-tmp: a5286998df566e736b32f6795bfc3803bdaf453d
3131
refs/tags/1.0.0-beta: 8cbb92b53468ee2b0c2d3eeb8567005953d40828
32-
refs/heads/stable: e95241bf2875a4cf292ea8cb59100875b6277917
32+
refs/heads/stable: 347ee73ef7f3108d4626f0d414acd1432bfe50bf
3333
refs/tags/1.0.0: 55bd4f8ff2b323f317ae89e254ce87162d52a375

branches/stable/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/stable/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/stable/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/stable/src/libcollections/bit.rs

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ use core::hash;
8989
use core::iter::RandomAccessIterator;
9090
use core::iter::{Chain, Enumerate, Repeat, Skip, Take, repeat, Cloned};
9191
use core::iter::{self, FromIterator};
92+
use core::mem::swap;
9293
use core::ops::Index;
9394
use core::slice;
9495
use core::{u8, u32, usize};
@@ -602,6 +603,106 @@ impl BitVec {
602603
Iter { bit_vec: self, next_idx: 0, end_idx: self.nbits }
603604
}
604605

606+
/// Moves all bits from `other` into `Self`, leaving `other` empty.
607+
///
608+
/// # Examples
609+
///
610+
/// ```
611+
/// # #![feature(collections, bit_vec_append_split_off)]
612+
/// use std::collections::BitVec;
613+
///
614+
/// let mut a = BitVec::from_bytes(&[0b10000000]);
615+
/// let mut b = BitVec::from_bytes(&[0b01100001]);
616+
///
617+
/// a.append(&mut b);
618+
///
619+
/// assert_eq!(a.len(), 16);
620+
/// assert_eq!(b.len(), 0);
621+
/// assert!(a.eq_vec(&[true, false, false, false, false, false, false, false,
622+
/// false, true, true, false, false, false, false, true]));
623+
/// ```
624+
#[unstable(feature = "bit_vec_append_split_off",
625+
reason = "recently added as part of collections reform 2")]
626+
pub fn append(&mut self, other: &mut Self) {
627+
let b = self.len() % u32::BITS;
628+
629+
self.nbits += other.len();
630+
other.nbits = 0;
631+
632+
if b == 0 {
633+
self.storage.append(&mut other.storage);
634+
} else {
635+
self.storage.reserve(other.storage.len());
636+
637+
for block in other.storage.drain(..) {
638+
*(self.storage.last_mut().unwrap()) |= block << b;
639+
self.storage.push(block >> (u32::BITS - b));
640+
}
641+
}
642+
}
643+
644+
/// Splits the `BitVec` into two at the given bit,
645+
/// retaining the first half in-place and returning the second one.
646+
///
647+
/// # Examples
648+
///
649+
/// ```
650+
/// # #![feature(collections, bit_vec_append_split_off)]
651+
/// use std::collections::BitVec;
652+
/// let mut a = BitVec::new();
653+
/// a.push(true);
654+
/// a.push(false);
655+
/// a.push(false);
656+
/// a.push(true);
657+
///
658+
/// let b = a.split_off(2);
659+
///
660+
/// assert_eq!(a.len(), 2);
661+
/// assert_eq!(b.len(), 2);
662+
/// assert!(a.eq_vec(&[true, false]));
663+
/// assert!(b.eq_vec(&[false, true]));
664+
/// ```
665+
#[unstable(feature = "bit_vec_append_split_off",
666+
reason = "recently added as part of collections reform 2")]
667+
pub fn split_off(&mut self, at: usize) -> Self {
668+
assert!(at <= self.len(), "`at` out of bounds");
669+
670+
let mut other = BitVec::new();
671+
672+
if at == 0 {
673+
swap(self, &mut other);
674+
return other;
675+
} else if at == self.len() {
676+
return other;
677+
}
678+
679+
let w = at / u32::BITS;
680+
let b = at % u32::BITS;
681+
other.nbits = self.nbits - at;
682+
self.nbits = at;
683+
if b == 0 {
684+
// Split at block boundary
685+
other.storage = self.storage.split_off(w);
686+
} else {
687+
other.storage.reserve(self.storage.len() - w);
688+
689+
{
690+
let mut iter = self.storage[w..].iter();
691+
let mut last = *iter.next().unwrap();
692+
for &cur in iter {
693+
other.storage.push((last >> b) | (cur << (u32::BITS - b)));
694+
last = cur;
695+
}
696+
other.storage.push(last >> b);
697+
}
698+
699+
self.storage.truncate(w+1);
700+
self.fix_last_block();
701+
}
702+
703+
other
704+
}
705+
605706
/// Returns `true` if all bits are 0.
606707
///
607708
/// # Examples

branches/stable/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/stable/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/stable/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> {

0 commit comments

Comments
 (0)