Skip to content

Commit 3024c14

Browse files
committed
Use Try syntax for Option in place of macros or match
1 parent c7b6d82 commit 3024c14

File tree

28 files changed

+92
-230
lines changed

28 files changed

+92
-230
lines changed

src/liballoc/allocator.rs

+9-37
Original file line numberDiff line numberDiff line change
@@ -217,14 +217,8 @@ impl Layout {
217217
/// On arithmetic overflow, returns `None`.
218218
#[inline]
219219
pub fn repeat(&self, n: usize) -> Option<(Self, usize)> {
220-
let padded_size = match self.size.checked_add(self.padding_needed_for(self.align)) {
221-
None => return None,
222-
Some(padded_size) => padded_size,
223-
};
224-
let alloc_size = match padded_size.checked_mul(n) {
225-
None => return None,
226-
Some(alloc_size) => alloc_size,
227-
};
220+
let padded_size = self.size.checked_add(self.padding_needed_for(self.align))?;
221+
let alloc_size = padded_size.checked_mul(n)?;
228222

229223
// We can assume that `self.align` is a power-of-two that does
230224
// not exceed 2<sup>31</sup>. Furthermore, `alloc_size` has already been
@@ -246,26 +240,14 @@ impl Layout {
246240
/// On arithmetic overflow, returns `None`.
247241
pub fn extend(&self, next: Self) -> Option<(Self, usize)> {
248242
let new_align = cmp::max(self.align, next.align);
249-
let realigned = match Layout::from_size_align(self.size, new_align) {
250-
None => return None,
251-
Some(l) => l,
252-
};
243+
let realigned = Layout::from_size_align(self.size, new_align)?;
253244

254245
let pad = realigned.padding_needed_for(next.align);
255246

256-
let offset = match self.size.checked_add(pad) {
257-
None => return None,
258-
Some(offset) => offset,
259-
};
260-
let new_size = match offset.checked_add(next.size) {
261-
None => return None,
262-
Some(new_size) => new_size,
263-
};
247+
let offset = self.size.checked_add(pad)?;
248+
let new_size = offset.checked_add(next.size)?;
264249

265-
let layout = match Layout::from_size_align(new_size, new_align) {
266-
None => return None,
267-
Some(l) => l,
268-
};
250+
let layout = Layout::from_size_align(new_size, new_align)?;
269251
Some((layout, offset))
270252
}
271253

@@ -282,11 +264,7 @@ impl Layout {
282264
///
283265
/// On arithmetic overflow, returns `None`.
284266
pub fn repeat_packed(&self, n: usize) -> Option<Self> {
285-
let size = match self.size().checked_mul(n) {
286-
None => return None,
287-
Some(scaled) => scaled,
288-
};
289-
267+
let size = self.size().checked_mul(n)?;
290268
Layout::from_size_align(size, self.align)
291269
}
292270

@@ -306,14 +284,8 @@ impl Layout {
306284
///
307285
/// On arithmetic overflow, returns `None`.
308286
pub fn extend_packed(&self, next: Self) -> Option<(Self, usize)> {
309-
let new_size = match self.size().checked_add(next.size()) {
310-
None => return None,
311-
Some(new_size) => new_size,
312-
};
313-
let layout = match Layout::from_size_align(new_size, self.align) {
314-
None => return None,
315-
Some(l) => l,
316-
};
287+
let new_size = self.size().checked_add(next.size())?;
288+
let layout = Layout::from_size_align(new_size, self.align)?;
317289
Some((layout, self.size()))
318290
}
319291

src/liballoc/btree/set.rs

+4-10
Original file line numberDiff line numberDiff line change
@@ -1067,21 +1067,15 @@ impl<'a, T: Ord> Iterator for Intersection<'a, T> {
10671067

10681068
fn next(&mut self) -> Option<&'a T> {
10691069
loop {
1070-
let o_cmp = match (self.a.peek(), self.b.peek()) {
1071-
(None, _) => None,
1072-
(_, None) => None,
1073-
(Some(a1), Some(b1)) => Some(a1.cmp(b1)),
1074-
};
1075-
match o_cmp {
1076-
None => return None,
1077-
Some(Less) => {
1070+
match Ord::cmp(self.a.peek()?, self.b.peek()?) {
1071+
Less => {
10781072
self.a.next();
10791073
}
1080-
Some(Equal) => {
1074+
Equal => {
10811075
self.b.next();
10821076
return self.a.next();
10831077
}
1084-
Some(Greater) => {
1078+
Greater => {
10851079
self.b.next();
10861080
}
10871081
}

src/liballoc/string.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -1044,10 +1044,7 @@ impl String {
10441044
#[inline]
10451045
#[stable(feature = "rust1", since = "1.0.0")]
10461046
pub fn pop(&mut self) -> Option<char> {
1047-
let ch = match self.chars().rev().next() {
1048-
Some(ch) => ch,
1049-
None => return None,
1050-
};
1047+
let ch = self.chars().rev().next()?;
10511048
let newlen = self.len() - ch.len_utf8();
10521049
unsafe {
10531050
self.vec.set_len(newlen);

src/liballoc/vec.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -1423,10 +1423,7 @@ impl<T: PartialEq> Vec<T> {
14231423
/// ```
14241424
#[unstable(feature = "vec_remove_item", reason = "recently added", issue = "40062")]
14251425
pub fn remove_item(&mut self, item: &T) -> Option<T> {
1426-
let pos = match self.iter().position(|x| *x == *item) {
1427-
Some(x) => x,
1428-
None => return None,
1429-
};
1426+
let pos = self.iter().position(|x| *x == *item)?;
14301427
Some(self.remove(pos))
14311428
}
14321429
}

src/libcore/str/mod.rs

+4-5
Original file line numberDiff line numberDiff line change
@@ -494,11 +494,10 @@ fn unwrap_or_0(opt: Option<&u8>) -> u8 {
494494
#[inline]
495495
pub fn next_code_point<'a, I: Iterator<Item = &'a u8>>(bytes: &mut I) -> Option<u32> {
496496
// Decode UTF-8
497-
let x = match bytes.next() {
498-
None => return None,
499-
Some(&next_byte) if next_byte < 128 => return Some(next_byte as u32),
500-
Some(&next_byte) => next_byte,
501-
};
497+
let x = *bytes.next()?;
498+
if x < 128 {
499+
return Some(x as u32)
500+
}
502501

503502
// Multibyte case follows
504503
// Decode from a byte combination out of: [[[x y] z] w]

src/librustc/hir/map/mod.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -978,9 +978,8 @@ impl<'a, 'hir> NodesMatchingSuffix<'a, 'hir> {
978978
// chain, then returns `None`.
979979
fn find_first_mod_parent<'a>(map: &'a Map, mut id: NodeId) -> Option<(NodeId, Name)> {
980980
loop {
981-
match map.find(id) {
982-
None => return None,
983-
Some(NodeItem(item)) if item_is_mod(&item) =>
981+
match map.find(id)? {
982+
NodeItem(item) if item_is_mod(&item) =>
984983
return Some((id, item.name)),
985984
_ => {}
986985
}

src/librustc/infer/error_reporting/util.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,8 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
9191
.iter()
9292
.enumerate()
9393
.filter_map(|(index, arg)| {
94-
let ty = match tables.borrow().node_id_to_type_opt(arg.hir_id) {
95-
Some(v) => v,
96-
None => return None, // sometimes the tables are not yet populated
97-
};
94+
// May return None; sometimes the tables are not yet populated.
95+
let ty = tables.borrow().node_id_to_type_opt(arg.hir_id)?;
9896
let mut found_anon_region = false;
9997
let new_arg_ty = self.tcx
10098
.fold_regions(&ty, &mut false, |r, _| if *r == *anon_region {

src/librustc/ty/util.rs

+1-6
Original file line numberDiff line numberDiff line change
@@ -439,12 +439,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
439439
}
440440
});
441441

442-
let dtor_did = match dtor_did {
443-
Some(dtor) => dtor,
444-
None => return None,
445-
};
446-
447-
Some(ty::Destructor { did: dtor_did })
442+
Some(ty::Destructor { did: dtor_did? })
448443
}
449444

450445
/// Return the set of types that are required to be alive in

src/librustc/util/common.rs

+4-10
Original file line numberDiff line numberDiff line change
@@ -215,24 +215,18 @@ pub fn record_time<T, F>(accu: &Cell<Duration>, f: F) -> T where
215215
rv
216216
}
217217

218-
// Like std::macros::try!, but for Option<>.
219-
#[cfg(unix)]
220-
macro_rules! option_try(
221-
($e:expr) => (match $e { Some(e) => e, None => return None })
222-
);
223-
224218
// Memory reporting
225219
#[cfg(unix)]
226220
fn get_resident() -> Option<usize> {
227221
use std::fs::File;
228222
use std::io::Read;
229223

230224
let field = 1;
231-
let mut f = option_try!(File::open("/proc/self/statm").ok());
225+
let mut f = File::open("/proc/self/statm").ok()?;
232226
let mut contents = String::new();
233-
option_try!(f.read_to_string(&mut contents).ok());
234-
let s = option_try!(contents.split_whitespace().nth(field));
235-
let npages = option_try!(s.parse::<usize>().ok());
227+
f.read_to_string(&mut contents).ok()?;
228+
let s = contents.split_whitespace().nth(field)?;
229+
let npages = s.parse::<usize>().ok()?;
236230
Some(npages * 4096)
237231
}
238232

src/librustc_data_structures/indexed_set.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -291,10 +291,8 @@ impl<'a, T: Idx> Iterator for Iter<'a, T> {
291291
}
292292
}
293293

294-
match self.iter.next() {
295-
Some((i, word)) => self.cur = Some((*word, word_bits * i)),
296-
None => return None,
297-
}
294+
let (i, word) = self.iter.next()?;
295+
self.cur = Some((*word, word_bits * i));
298296
}
299297
}
300298
}

src/librustc_metadata/creader.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -385,10 +385,7 @@ impl<'a> CrateLoader<'a> {
385385
}
386386

387387
fn load(&mut self, locate_ctxt: &mut locator::Context) -> Option<LoadResult> {
388-
let library = match locate_ctxt.maybe_load_library_crate() {
389-
Some(lib) => lib,
390-
None => return None,
391-
};
388+
let library = locate_ctxt.maybe_load_library_crate()?;
392389

393390
// In the case that we're loading a crate, but not matching
394391
// against a hash, we could load a crate which has the same hash

src/librustc_mir/borrow_check/mod.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -1982,10 +1982,7 @@ mod prefixes {
19821982
impl<'cx, 'gcx, 'tcx> Iterator for Prefixes<'cx, 'gcx, 'tcx> {
19831983
type Item = &'cx Place<'tcx>;
19841984
fn next(&mut self) -> Option<Self::Item> {
1985-
let mut cursor = match self.next {
1986-
None => return None,
1987-
Some(place) => place,
1988-
};
1985+
let mut cursor = self.next?;
19891986

19901987
// Post-processing `place`: Enqueue any remaining
19911988
// work. Also, `place` may not be a prefix itself, but

src/librustc_trans/back/archive.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -120,10 +120,7 @@ impl<'a> ArchiveBuilder<'a> {
120120
if let Some(ref a) = self.src_archive {
121121
return a.as_ref()
122122
}
123-
let src = match self.config.src {
124-
Some(ref src) => src,
125-
None => return None,
126-
};
123+
let src = self.config.src.as_ref()?;
127124
self.src_archive = Some(ArchiveRO::open(src).ok());
128125
self.src_archive.as_ref().unwrap().as_ref()
129126
}

src/librustc_typeck/check/autoderef.rs

+3-8
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,8 @@ impl<'a, 'gcx, 'tcx> Iterator for Autoderef<'a, 'gcx, 'tcx> {
7979
let (kind, new_ty) = if let Some(mt) = self.cur_ty.builtin_deref(false, NoPreference) {
8080
(AutoderefKind::Builtin, mt.ty)
8181
} else {
82-
match self.overloaded_deref_ty(self.cur_ty) {
83-
Some(ty) => (AutoderefKind::Overloaded, ty),
84-
_ => return None,
85-
}
82+
let ty = self.overloaded_deref_ty(self.cur_ty)?;
83+
(AutoderefKind::Overloaded, ty)
8684
};
8785

8886
if new_ty.references_error() {
@@ -108,10 +106,7 @@ impl<'a, 'gcx, 'tcx> Autoderef<'a, 'gcx, 'tcx> {
108106

109107
// <cur_ty as Deref>
110108
let trait_ref = TraitRef {
111-
def_id: match tcx.lang_items().deref_trait() {
112-
Some(f) => f,
113-
None => return None,
114-
},
109+
def_id: tcx.lang_items().deref_trait()?,
115110
substs: tcx.mk_substs_trait(self.cur_ty, &[]),
116111
};
117112

src/librustdoc/html/format.rs

+7-9
Original file line numberDiff line numberDiff line change
@@ -425,15 +425,13 @@ pub fn href(did: DefId) -> Option<(String, ItemType, Vec<String>)> {
425425
Some(&(ref fqp, shortty)) => {
426426
(fqp, shortty, repeat("../").take(loc.len()).collect())
427427
}
428-
None => match cache.external_paths.get(&did) {
429-
Some(&(ref fqp, shortty)) => {
430-
(fqp, shortty, match cache.extern_locations[&did.krate] {
431-
(.., render::Remote(ref s)) => s.to_string(),
432-
(.., render::Local) => repeat("../").take(loc.len()).collect(),
433-
(.., render::Unknown) => return None,
434-
})
435-
}
436-
None => return None,
428+
None => {
429+
let &(ref fqp, shortty) = cache.external_paths.get(&did)?;
430+
(fqp, shortty, match cache.extern_locations[&did.krate] {
431+
(.., render::Remote(ref s)) => s.to_string(),
432+
(.., render::Local) => repeat("../").take(loc.len()).collect(),
433+
(.., render::Unknown) => return None,
434+
})
437435
}
438436
};
439437
for component in &fqp[..fqp.len() - 1] {

src/librustdoc/html/render.rs

+2-5
Original file line numberDiff line numberDiff line change
@@ -1672,11 +1672,8 @@ impl<'a> Item<'a> {
16721672
let mut path = String::new();
16731673
let (krate, path) = if self.item.def_id.is_local() {
16741674
let path = PathBuf::from(&self.item.source.filename);
1675-
if let Some(path) = self.cx.shared.local_sources.get(&path) {
1676-
(&self.cx.shared.layout.krate, path)
1677-
} else {
1678-
return None;
1679-
}
1675+
let path = self.cx.shared.local_sources.get(&path)?;
1676+
(&self.cx.shared.layout.krate, path)
16801677
} else {
16811678
// Macros from other libraries get special filenames which we can
16821679
// safely ignore.

src/libserialize/json.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -1052,10 +1052,7 @@ impl Json {
10521052
pub fn find_path<'a>(&'a self, keys: &[&str]) -> Option<&'a Json>{
10531053
let mut target = self;
10541054
for key in keys {
1055-
match target.find(*key) {
1056-
Some(t) => { target = t; },
1057-
None => return None
1058-
}
1055+
target = target.find(*key)?;
10591056
}
10601057
Some(target)
10611058
}

src/libstd/collections/hash/set.rs

+6-14
Original file line numberDiff line numberDiff line change
@@ -1152,13 +1152,9 @@ impl<'a, T, S> Iterator for Intersection<'a, T, S>
11521152

11531153
fn next(&mut self) -> Option<&'a T> {
11541154
loop {
1155-
match self.iter.next() {
1156-
None => return None,
1157-
Some(elt) => {
1158-
if self.other.contains(elt) {
1159-
return Some(elt);
1160-
}
1161-
}
1155+
let elt = self.iter.next()?;
1156+
if self.other.contains(elt) {
1157+
return Some(elt);
11621158
}
11631159
}
11641160
}
@@ -1202,13 +1198,9 @@ impl<'a, T, S> Iterator for Difference<'a, T, S>
12021198

12031199
fn next(&mut self) -> Option<&'a T> {
12041200
loop {
1205-
match self.iter.next() {
1206-
None => return None,
1207-
Some(elt) => {
1208-
if !self.other.contains(elt) {
1209-
return Some(elt);
1210-
}
1211-
}
1201+
let elt = self.iter.next()?;
1202+
if !self.other.contains(elt) {
1203+
return Some(elt);
12121204
}
12131205
}
12141206
}

src/libstd/io/mod.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -2019,10 +2019,9 @@ impl<R: Read> Iterator for Chars<R> {
20192019
type Item = result::Result<char, CharsError>;
20202020

20212021
fn next(&mut self) -> Option<result::Result<char, CharsError>> {
2022-
let first_byte = match read_one_byte(&mut self.inner) {
2023-
None => return None,
2024-
Some(Ok(b)) => b,
2025-
Some(Err(e)) => return Some(Err(CharsError::Other(e))),
2022+
let first_byte = match read_one_byte(&mut self.inner)? {
2023+
Ok(b) => b,
2024+
Err(e) => return Some(Err(CharsError::Other(e))),
20262025
};
20272026
let width = core_str::utf8_char_width(first_byte);
20282027
if width == 1 { return Some(Ok(first_byte as char)) }

src/libstd/net/parser.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -170,11 +170,7 @@ impl<'a> Parser<'a> {
170170
return None;
171171
}
172172

173-
let octet = self.read_number(10, 3, 0x100).map(|n| n as u8);
174-
match octet {
175-
Some(d) => bs[i] = d,
176-
None => return None,
177-
};
173+
bs[i] = self.read_number(10, 3, 0x100).map(|n| n as u8)?;
178174
i += 1;
179175
}
180176
Some(Ipv4Addr::new(bs[0], bs[1], bs[2], bs[3]))

0 commit comments

Comments
 (0)