Resolve remaining clippy lints and add to Travis build

This commit is contained in:
David Tolnay 2016-02-27 16:30:13 -08:00
parent b3c34c4f29
commit 6ba6fec475
7 changed files with 103 additions and 109 deletions

View file

@ -7,5 +7,8 @@ rust:
env: env:
global: global:
- secure: ZUcdcbS8xbpdII9FSPx7VtoVhEkJhWL2Hb75tDlKDHNhfXqmt1NyB9q/2qXJ5Ulp4MnYXwsI8LsDloR6gvdB4xElay3smuF/neGvMjrqcB15/2p0MSQ+kZjMsNB6mlb5kAlm8ahduXIscppmw/V+m5hn3Vo+RQz/Ng+pzv0nc8KEXPMYrfRFg+a7FaeIbRbb8ir9EfflUSqArLq2hbi2WdhM3hFMcCIAUt6DD4x5ubjEg60OnIof5FDu0mXMXzQvUfHWOeYnsNcD/DLyDnm6FuQEzk37M4EB8op2SdBUeQMQ5abR3i2rd//DZpbTTEjud0PseWohGAwTwL2aoFrqs7uYQMx+vcGlOzAyDUm4VemVUa3F2BECdzU5BiujcKOITJEVUYWongld93arQq34FuXG/TO/T1XrerxfG6LTkTkKS5Vz7W8z6Rloa99WrQLJg1ZJP6itEU7G7KsDFVgRhsg7rz4/dV/2+cV4UvIwd4HlGXKCFlH0SClqvM3/7i/qqCD0689SJW6Zip+ly38MXlGy2s/AmReEasXvFer9JkOEIuPa8QTBNAjDlw7bWXi6neQWBIZU1VhZcSssnrVmEFN8fNklShzpw5DyKCv8jPTx2O6Dw8B/LgIK8uo+eaTXiO6zz/T1c/qEdsYslvxPA2D3F+ONpPU7238ykT4eRog= - secure: ZUcdcbS8xbpdII9FSPx7VtoVhEkJhWL2Hb75tDlKDHNhfXqmt1NyB9q/2qXJ5Ulp4MnYXwsI8LsDloR6gvdB4xElay3smuF/neGvMjrqcB15/2p0MSQ+kZjMsNB6mlb5kAlm8ahduXIscppmw/V+m5hn3Vo+RQz/Ng+pzv0nc8KEXPMYrfRFg+a7FaeIbRbb8ir9EfflUSqArLq2hbi2WdhM3hFMcCIAUt6DD4x5ubjEg60OnIof5FDu0mXMXzQvUfHWOeYnsNcD/DLyDnm6FuQEzk37M4EB8op2SdBUeQMQ5abR3i2rd//DZpbTTEjud0PseWohGAwTwL2aoFrqs7uYQMx+vcGlOzAyDUm4VemVUa3F2BECdzU5BiujcKOITJEVUYWongld93arQq34FuXG/TO/T1XrerxfG6LTkTkKS5Vz7W8z6Rloa99WrQLJg1ZJP6itEU7G7KsDFVgRhsg7rz4/dV/2+cV4UvIwd4HlGXKCFlH0SClqvM3/7i/qqCD0689SJW6Zip+ly38MXlGy2s/AmReEasXvFer9JkOEIuPa8QTBNAjDlw7bWXi6neQWBIZU1VhZcSssnrVmEFN8fNklShzpw5DyKCv8jPTx2O6Dw8B/LgIK8uo+eaTXiO6zz/T1c/qEdsYslvxPA2D3F+ONpPU7238ykT4eRog=
script:
- cargo build --features clippy --verbose
- cargo test --verbose
after_script: after_script:
- curl http://www.rust-ci.org/artifacts/put?t=$RUSTCI_TOKEN | sh - curl http://www.rust-ci.org/artifacts/put?t=$RUSTCI_TOKEN | sh

View file

@ -7,3 +7,6 @@ documentation = "http://chyh1990.github.io/yaml-rust/doc/yaml_rust/"
license = "MIT/Apache-2.0" license = "MIT/Apache-2.0"
description = "The missing YAML 1.2 parser for rust" description = "The missing YAML 1.2 parser for rust"
repository = "https://github.com/chyh1990/yaml-rust" repository = "https://github.com/chyh1990/yaml-rust"
[dependencies]
clippy = { version = "^0.*", optional = true }

View file

@ -114,8 +114,8 @@ impl<'a> YamlEmitter<'a> {
} }
fn emit_node(&mut self, node: &Yaml) -> EmitResult { fn emit_node(&mut self, node: &Yaml) -> EmitResult {
match node { match *node {
&Yaml::Array(ref v) => { Yaml::Array(ref v) => {
if v.is_empty() { if v.is_empty() {
try!(write!(self.writer, "[]")); try!(write!(self.writer, "[]"));
Ok(()) Ok(())
@ -124,21 +124,19 @@ impl<'a> YamlEmitter<'a> {
try!(write!(self.writer, "\n")); try!(write!(self.writer, "\n"));
} }
self.level += 1; self.level += 1;
let mut cnt = 0usize; for (cnt, x) in v.iter().enumerate() {
for x in v { if cnt > 0 {
try!(write!(self.writer, "\n"));
}
try!(self.write_indent()); try!(self.write_indent());
try!(write!(self.writer, "- ")); try!(write!(self.writer, "- "));
try!(self.emit_node(x)); try!(self.emit_node(x));
cnt += 1;
if cnt < v.len() {
try!(write!(self.writer, "\n"));
}
} }
self.level -= 1; self.level -= 1;
Ok(()) Ok(())
} }
}, },
&Yaml::Hash(ref h) => { Yaml::Hash(ref h) => {
if h.is_empty() { if h.is_empty() {
try!(self.writer.write_str("{}")); try!(self.writer.write_str("{}"));
Ok(()) Ok(())
@ -147,32 +145,30 @@ impl<'a> YamlEmitter<'a> {
try!(write!(self.writer, "\n")); try!(write!(self.writer, "\n"));
} }
self.level += 1; self.level += 1;
let mut cnt = 0usize; for (cnt, (k, v)) in h.iter().enumerate() {
for (k, v) in h { if cnt > 0 {
try!(write!(self.writer, "\n"));
}
try!(self.write_indent()); try!(self.write_indent());
match k { match *k {
// complex key is not supported // complex key is not supported
&Yaml::Array(_) | &Yaml::Hash(_) => { Yaml::Array(_) | Yaml::Hash(_) => {
return Err(EmitError::BadHashmapKey); return Err(EmitError::BadHashmapKey);
}, },
_ => { try!(self.emit_node(k)); } _ => { try!(self.emit_node(k)); }
} }
try!(write!(self.writer, ": ")); try!(write!(self.writer, ": "));
try!(self.emit_node(v)); try!(self.emit_node(v));
cnt += 1;
if cnt < h.len() {
try!(write!(self.writer, "\n"));
}
} }
self.level -= 1; self.level -= 1;
Ok(()) Ok(())
} }
}, },
&Yaml::String(ref v) => { Yaml::String(ref v) => {
try!(escape_str(self.writer, v)); try!(escape_str(self.writer, v));
Ok(()) Ok(())
}, },
&Yaml::Boolean(v) => { Yaml::Boolean(v) => {
if v { if v {
try!(self.writer.write_str("true")); try!(self.writer.write_str("true"));
} else { } else {
@ -180,15 +176,15 @@ impl<'a> YamlEmitter<'a> {
} }
Ok(()) Ok(())
}, },
&Yaml::Integer(v) => { Yaml::Integer(v) => {
try!(write!(self.writer, "{}", v)); try!(write!(self.writer, "{}", v));
Ok(()) Ok(())
}, },
&Yaml::Real(ref v) => { Yaml::Real(ref v) => {
try!(write!(self.writer, "{}", v)); try!(write!(self.writer, "{}", v));
Ok(()) Ok(())
}, },
&Yaml::Null | &Yaml::BadValue => { Yaml::Null | Yaml::BadValue => {
try!(write!(self.writer, "~")); try!(write!(self.writer, "~"));
Ok(()) Ok(())
}, },

View file

@ -36,6 +36,12 @@
//! //!
//! ``` //! ```
#![cfg_attr(feature="clippy", feature(plugin))]
#![cfg_attr(feature="clippy", plugin(clippy))]
#![cfg_attr(feature="clippy", deny(clippy))]
#![cfg_attr(feature="clippy", warn(cyclomatic_complexity))]
#![cfg_attr(feature="clippy", allow(match_same_arms))]
pub mod yaml; pub mod yaml;
pub mod scanner; pub mod scanner;
pub mod parser; pub mod parser;
@ -89,7 +95,7 @@ mod tests {
emitter.dump(doc).unwrap(); emitter.dump(doc).unwrap();
} }
assert!(writer.len() > 0); assert!(!writer.is_empty());
} }
fn try_fail(s: &str) -> Result<Vec<Yaml>, ScanError> { fn try_fail(s: &str) -> Result<Vec<Yaml>, ScanError> {

View file

@ -55,11 +55,11 @@ pub enum Event {
impl Event { impl Event {
fn empty_scalar() -> Event { fn empty_scalar() -> Event {
// a null scalar // a null scalar
Event::Scalar("~".to_string(), TScalarStyle::Plain, 0, None) Event::Scalar("~".to_owned(), TScalarStyle::Plain, 0, None)
} }
fn empty_scalar_with_anchor(anchor: usize, tag: TokenType) -> Event { fn empty_scalar_with_anchor(anchor: usize, tag: TokenType) -> Event {
Event::Scalar("".to_string(), TScalarStyle::Plain, anchor, Some(tag)) Event::Scalar("".to_owned(), TScalarStyle::Plain, anchor, Some(tag))
} }
} }
@ -179,10 +179,7 @@ impl<T: Iterator<Item=char>> Parser<T> {
fn load_node<R: EventReceiver>(&mut self, first_ev: &Event, recv: &mut R) fn load_node<R: EventReceiver>(&mut self, first_ev: &Event, recv: &mut R)
-> Result<(), ScanError> { -> Result<(), ScanError> {
match *first_ev { match *first_ev {
Event::Alias(..) => { Event::Alias(..) | Event::Scalar(..) => {
Ok(())
},
Event::Scalar(..) => {
Ok(()) Ok(())
}, },
Event::SequenceStart(_) => { Event::SequenceStart(_) => {
@ -275,7 +272,7 @@ impl<T: Iterator<Item=char>> Parser<T> {
self.skip(); self.skip();
Ok(Event::StreamStart) Ok(Event::StreamStart)
}, },
_ => return Err(ScanError::new(tok.0, _ => Err(ScanError::new(tok.0,
"did not find expected <stream-start>")), "did not find expected <stream-start>")),
} }
} }
@ -283,14 +280,9 @@ impl<T: Iterator<Item=char>> Parser<T> {
fn document_start(&mut self, implicit: bool) -> ParseResult { fn document_start(&mut self, implicit: bool) -> ParseResult {
let mut tok = try!(self.peek()); let mut tok = try!(self.peek());
if !implicit { if !implicit {
loop { while let TokenType::DocumentEnd = tok.1 {
match tok.1 {
TokenType::DocumentEnd => {
self.skip(); self.skip();
tok = try!(self.peek()); tok = try!(self.peek());
},
_ => break
}
} }
} }
@ -298,7 +290,7 @@ impl<T: Iterator<Item=char>> Parser<T> {
TokenType::StreamEnd => { TokenType::StreamEnd => {
self.state = State::End; self.state = State::End;
self.skip(); self.skip();
return Ok(Event::StreamEnd); Ok(Event::StreamEnd)
}, },
TokenType::VersionDirective(..) TokenType::VersionDirective(..)
| TokenType::TagDirective(..) | TokenType::TagDirective(..)
@ -376,20 +368,17 @@ impl<T: Iterator<Item=char>> Parser<T> {
let tok = try!(self.peek()); let tok = try!(self.peek());
let _start_mark = tok.0; let _start_mark = tok.0;
match tok.1 { if let TokenType::DocumentEnd = tok.1 {
TokenType::DocumentEnd => {
self.skip(); self.skip();
_implicit = false; _implicit = false;
} }
_ => {}
}
// TODO tag handling // TODO tag handling
self.state = State::DocumentStart; self.state = State::DocumentStart;
Ok(Event::DocumentEnd) Ok(Event::DocumentEnd)
} }
fn register_anchor(&mut self, name: &String, _: &Marker) -> Result<usize, ScanError> { fn register_anchor(&mut self, name: &str, _: &Marker) -> Result<usize, ScanError> {
// anchors can be overrided/reused // anchors can be overrided/reused
// if self.anchors.contains_key(name) { // if self.anchors.contains_key(name) {
// return Err(ScanError::new(*mark, // return Err(ScanError::new(*mark,
@ -397,7 +386,7 @@ impl<T: Iterator<Item=char>> Parser<T> {
// } // }
let new_id = self.anchor_id; let new_id = self.anchor_id;
self.anchor_id += 1; self.anchor_id += 1;
self.anchors.insert(name.clone(), new_id); self.anchors.insert(name.to_owned(), new_id);
Ok(new_id) Ok(new_id)
} }

View file

@ -45,7 +45,7 @@ impl ScanError {
pub fn new(loc: Marker, info: &str) -> ScanError { pub fn new(loc: Marker, info: &str) -> ScanError {
ScanError { ScanError {
mark: loc, mark: loc,
info: info.to_string() info: info.to_owned()
} }
} }
} }
@ -233,7 +233,7 @@ impl<T: Iterator<Item=char>> Scanner<T> {
} }
} }
#[inline(always)] #[inline]
fn lookahead(&mut self, count: usize) { fn lookahead(&mut self, count: usize) {
if self.buffer.len() >= count { if self.buffer.len() >= count {
return; return;
@ -386,7 +386,7 @@ impl<T: Iterator<Item=char>> Scanner<T> {
// plain scalar // plain scalar
'-' if !is_blankz(nc) => self.fetch_plain_scalar(), '-' if !is_blankz(nc) => self.fetch_plain_scalar(),
':' | '?' if !is_blankz(nc) && self.flow_level == 0 => self.fetch_plain_scalar(), ':' | '?' if !is_blankz(nc) && self.flow_level == 0 => self.fetch_plain_scalar(),
'%' | '@' | '`' => return Err(ScanError::new(self.mark, '%' | '@' | '`' => Err(ScanError::new(self.mark,
&format!("unexpected character: `{}'", c))), &format!("unexpected character: `{}'", c))),
_ => self.fetch_plain_scalar(), _ => self.fetch_plain_scalar(),
} }
@ -404,9 +404,8 @@ impl<T: Iterator<Item=char>> Scanner<T> {
self.token_available = false; self.token_available = false;
self.tokens_parsed += 1; self.tokens_parsed += 1;
match t.1 { if let TokenType::StreamEnd = t.1 {
TokenType::StreamEnd => self.stream_end_produced = true, self.stream_end_produced = true;
_ => {}
} }
Ok(Some(t)) Ok(Some(t))
} }
@ -697,12 +696,12 @@ impl<T: Iterator<Item=char>> Scanner<T> {
suffix = try!(self.scan_tag_uri(false, secondary, &String::new(), &start_mark)); suffix = try!(self.scan_tag_uri(false, secondary, &String::new(), &start_mark));
} else { } else {
suffix = try!(self.scan_tag_uri(false, false, &handle, &start_mark)); suffix = try!(self.scan_tag_uri(false, false, &handle, &start_mark));
handle = "!".to_string(); handle = "!".to_owned();
// A special case: the '!' tag. Set the handle to '' and the // A special case: the '!' tag. Set the handle to '' and the
// suffix to '!'. // suffix to '!'.
if suffix.len() == 0 { if suffix.is_empty() {
handle.clear(); handle.clear();
suffix = "!".to_string(); suffix = "!".to_owned();
} }
} }
} }
@ -739,20 +738,18 @@ impl<T: Iterator<Item=char>> Scanner<T> {
if self.ch() == '!' { if self.ch() == '!' {
string.push(self.ch()); string.push(self.ch());
self.skip(); self.skip();
} else { } else if directive && string != "!" {
// It's either the '!' tag or not really a tag handle. If it's a %TAG // It's either the '!' tag or not really a tag handle. If it's a %TAG
// directive, it's an error. If it's a tag token, it must be a part of // directive, it's an error. If it's a tag token, it must be a part of
// URI. // URI.
if directive && string != "!" {
return Err(ScanError::new(*mark, return Err(ScanError::new(*mark,
"while parsing a tag directive, did not find expected '!'")); "while parsing a tag directive, did not find expected '!'"));
} }
}
Ok(string) Ok(string)
} }
fn scan_tag_uri(&mut self, directive: bool, _is_secondary: bool, fn scan_tag_uri(&mut self, directive: bool, _is_secondary: bool,
head: &String, mark: &Marker) -> Result<String, ScanError> { head: &str, mark: &Marker) -> Result<String, ScanError> {
let mut length = head.len(); let mut length = head.len();
let mut string = String::new(); let mut string = String::new();
@ -1588,11 +1585,9 @@ impl<T: Iterator<Item=char>> Scanner<T> {
fn remove_simple_key(&mut self) -> ScanResult { fn remove_simple_key(&mut self) -> ScanResult {
let last = self.simple_keys.last_mut().unwrap(); let last = self.simple_keys.last_mut().unwrap();
if last.possible { if last.possible && last.required {
if last.required {
return Err(ScanError::new(self.mark, "simple key expected")); return Err(ScanError::new(self.mark, "simple key expected"));
} }
}
last.possible = false; last.possible = false;
Ok(()) Ok(())

View file

@ -94,9 +94,7 @@ impl EventReceiver for YamlLoader {
Event::Scalar(ref v, style, aid, ref tag) => { Event::Scalar(ref v, style, aid, ref tag) => {
let node = if style != TScalarStyle::Plain { let node = if style != TScalarStyle::Plain {
Yaml::String(v.clone()) Yaml::String(v.clone())
} else { } else if let Some(TokenType::Tag(ref handle, ref suffix)) = *tag {
match tag {
&Some(TokenType::Tag(ref handle, ref suffix)) => {
// XXX tag:yaml.org,2002: // XXX tag:yaml.org,2002:
if handle == "!!" { if handle == "!!" {
match suffix.as_ref() { match suffix.as_ref() {
@ -130,10 +128,9 @@ impl EventReceiver for YamlLoader {
} else { } else {
Yaml::String(v.clone()) Yaml::String(v.clone())
} }
}, } else {
// Datatype is not specified, or unrecognized // Datatype is not specified, or unrecognized
_ => { Yaml::from_str(v.as_ref()) } Yaml::from_str(v.as_ref())
}
}; };
self.insert_new_node((node, aid)); self.insert_new_node((node, aid));
@ -245,7 +242,12 @@ impl Yaml {
_ => None _ => None
} }
} }
}
#[cfg_attr(feature="clippy", allow(should_implement_trait))]
impl Yaml {
// Not implementing FromStr because there is no possibility of Error.
// This function falls back to Yaml::String if nothing else matches.
pub fn from_str(v: &str) -> Yaml { pub fn from_str(v: &str) -> Yaml {
if v.starts_with("0x") { if v.starts_with("0x") {
let n = i64::from_str_radix(&v[2..], 16); let n = i64::from_str_radix(&v[2..], 16);
@ -259,7 +261,7 @@ impl Yaml {
return Yaml::Integer(n.unwrap()); return Yaml::Integer(n.unwrap());
} }
} }
if v.starts_with("+") && v[1..].parse::<i64>().is_ok() { if v.starts_with('+') && v[1..].parse::<i64>().is_ok() {
return Yaml::Integer(v[1..].parse::<i64>().unwrap()); return Yaml::Integer(v[1..].parse::<i64>().unwrap());
} }
match v { match v {
@ -268,8 +270,8 @@ impl Yaml {
"false" => Yaml::Boolean(false), "false" => Yaml::Boolean(false),
_ if v.parse::<i64>().is_ok() => Yaml::Integer(v.parse::<i64>().unwrap()), _ if v.parse::<i64>().is_ok() => Yaml::Integer(v.parse::<i64>().unwrap()),
// try parsing as f64 // try parsing as f64
_ if v.parse::<f64>().is_ok() => Yaml::Real(v.to_string()), _ if v.parse::<f64>().is_ok() => Yaml::Real(v.to_owned()),
_ => Yaml::String(v.to_string()) _ => Yaml::String(v.to_owned())
} }
} }
} }
@ -279,7 +281,7 @@ impl<'a> Index<&'a str> for Yaml {
type Output = Yaml; type Output = Yaml;
fn index(&self, idx: &'a str) -> &Yaml { fn index(&self, idx: &'a str) -> &Yaml {
let key = Yaml::String(idx.to_string()); let key = Yaml::String(idx.to_owned());
match self.as_hash() { match self.as_hash() {
Some(h) => h.get(&key).unwrap_or(&BAD_VALUE), Some(h) => h.get(&key).unwrap_or(&BAD_VALUE),
None => &BAD_VALUE None => &BAD_VALUE
@ -333,7 +335,7 @@ a4:
a5: 'single_quoted' a5: 'single_quoted'
a6: \"double_quoted\" a6: \"double_quoted\"
a7: a7:
".to_string(); ".to_owned();
let out = YamlLoader::load_from_str(&s).unwrap(); let out = YamlLoader::load_from_str(&s).unwrap();
let doc = &out[0]; let doc = &out[0];
assert_eq!(doc["a7"].as_str().unwrap(), "你好"); assert_eq!(doc["a7"].as_str().unwrap(), "你好");