diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2019-11-12 15:30:36 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2019-11-12 15:30:36 +0000 |
commit | 2549be750e4c611a582bc0845b1da71e131f1118 (patch) | |
tree | fec19f32a3b9dd7ced95281b291674ed7ee3a4cd | |
parent | 55f3ff241a2105d2903266703474acbd24a85e84 (diff) | |
parent | dae087656abf5d120cd9c051bf4fc446fca101e1 (diff) |
Merge #2217
2217: Implement FromStr for enum Edition r=matklad a=clemarescx
Just did this as I came across the comment in the code asking for implementing `std::str::FromStr` for `input::Edition`.
Not sure what was meant by "proper error handling" though, `panic!` with a descriptive message might not be it :sweat_smile:
Co-authored-by: Metabaron <[email protected]>
-rw-r--r-- | crates/ra_db/src/fixture.rs | 3 | ||||
-rw-r--r-- | crates/ra_db/src/input.rs | 17 | ||||
-rw-r--r-- | crates/ra_project_model/src/cargo_workspace.rs | 14 |
3 files changed, 23 insertions, 11 deletions
diff --git a/crates/ra_db/src/fixture.rs b/crates/ra_db/src/fixture.rs index f5dd59f84..ee883b615 100644 --- a/crates/ra_db/src/fixture.rs +++ b/crates/ra_db/src/fixture.rs | |||
@@ -1,5 +1,6 @@ | |||
1 | //! FIXME: write short doc here | 1 | //! FIXME: write short doc here |
2 | 2 | ||
3 | use std::str::FromStr; | ||
3 | use std::sync::Arc; | 4 | use std::sync::Arc; |
4 | 5 | ||
5 | use ra_cfg::CfgOptions; | 6 | use ra_cfg::CfgOptions; |
@@ -164,7 +165,7 @@ fn parse_meta(meta: &str) -> ParsedMeta { | |||
164 | match key { | 165 | match key { |
165 | "crate" => krate = Some(value.to_string()), | 166 | "crate" => krate = Some(value.to_string()), |
166 | "deps" => deps = value.split(',').map(|it| it.to_string()).collect(), | 167 | "deps" => deps = value.split(',').map(|it| it.to_string()).collect(), |
167 | "edition" => edition = Edition::from_string(&value), | 168 | "edition" => edition = Edition::from_str(&value).unwrap(), |
168 | "cfg" => { | 169 | "cfg" => { |
169 | for key in value.split(',') { | 170 | for key in value.split(',') { |
170 | match split1(key, '=') { | 171 | match split1(key, '=') { |
diff --git a/crates/ra_db/src/input.rs b/crates/ra_db/src/input.rs index 60f7dc881..c0d95a13f 100644 --- a/crates/ra_db/src/input.rs +++ b/crates/ra_db/src/input.rs | |||
@@ -13,6 +13,7 @@ use ra_syntax::SmolStr; | |||
13 | use rustc_hash::FxHashSet; | 13 | use rustc_hash::FxHashSet; |
14 | 14 | ||
15 | use crate::{RelativePath, RelativePathBuf}; | 15 | use crate::{RelativePath, RelativePathBuf}; |
16 | use std::str::FromStr; | ||
16 | 17 | ||
17 | /// `FileId` is an integer which uniquely identifies a file. File paths are | 18 | /// `FileId` is an integer which uniquely identifies a file. File paths are |
18 | /// messy and system-dependent, so most of the code should work directly with | 19 | /// messy and system-dependent, so most of the code should work directly with |
@@ -97,12 +98,18 @@ pub enum Edition { | |||
97 | Edition2015, | 98 | Edition2015, |
98 | } | 99 | } |
99 | 100 | ||
100 | impl Edition { | 101 | #[derive(Debug)] |
101 | //FIXME: replace with FromStr with proper error handling | 102 | pub struct ParseEditionError { |
102 | pub fn from_string(s: &str) -> Edition { | 103 | pub msg: String, |
104 | } | ||
105 | |||
106 | impl FromStr for Edition { | ||
107 | type Err = ParseEditionError; | ||
108 | fn from_str(s: &str) -> Result<Self, Self::Err> { | ||
103 | match s { | 109 | match s { |
104 | "2015" => Edition::Edition2015, | 110 | "2015" => Ok(Edition::Edition2015), |
105 | "2018" | _ => Edition::Edition2018, | 111 | "2018" => Ok(Edition::Edition2018), |
112 | _ => Err(ParseEditionError { msg: format!("unknown edition: {}", s) }), | ||
106 | } | 113 | } |
107 | } | 114 | } |
108 | } | 115 | } |
diff --git a/crates/ra_project_model/src/cargo_workspace.rs b/crates/ra_project_model/src/cargo_workspace.rs index 28dadea9d..cf88911b7 100644 --- a/crates/ra_project_model/src/cargo_workspace.rs +++ b/crates/ra_project_model/src/cargo_workspace.rs | |||
@@ -1,6 +1,7 @@ | |||
1 | //! FIXME: write short doc here | 1 | //! FIXME: write short doc here |
2 | 2 | ||
3 | use std::path::{Path, PathBuf}; | 3 | use std::path::{Path, PathBuf}; |
4 | use std::str::FromStr; | ||
4 | 5 | ||
5 | use cargo_metadata::{CargoOpt, MetadataCommand}; | 6 | use cargo_metadata::{CargoOpt, MetadataCommand}; |
6 | use ra_arena::{impl_arena_id, Arena, RawId}; | 7 | use ra_arena::{impl_arena_id, Arena, RawId}; |
@@ -140,18 +141,21 @@ impl CargoWorkspace { | |||
140 | let ws_members = &meta.workspace_members; | 141 | let ws_members = &meta.workspace_members; |
141 | 142 | ||
142 | for meta_pkg in meta.packages { | 143 | for meta_pkg in meta.packages { |
143 | let is_member = ws_members.contains(&meta_pkg.id); | 144 | let cargo_metadata::Package { id, edition, name, manifest_path, .. } = meta_pkg; |
145 | let is_member = ws_members.contains(&id); | ||
146 | let edition = Edition::from_str(&edition) | ||
147 | .map_err(|e| (format!("metadata for package {} failed: {}", &name, e.msg)))?; | ||
144 | let pkg = packages.alloc(PackageData { | 148 | let pkg = packages.alloc(PackageData { |
145 | name: meta_pkg.name, | 149 | name, |
146 | manifest: meta_pkg.manifest_path.clone(), | 150 | manifest: manifest_path, |
147 | targets: Vec::new(), | 151 | targets: Vec::new(), |
148 | is_member, | 152 | is_member, |
149 | edition: Edition::from_string(&meta_pkg.edition), | 153 | edition, |
150 | dependencies: Vec::new(), | 154 | dependencies: Vec::new(), |
151 | features: Vec::new(), | 155 | features: Vec::new(), |
152 | }); | 156 | }); |
153 | let pkg_data = &mut packages[pkg]; | 157 | let pkg_data = &mut packages[pkg]; |
154 | pkg_by_id.insert(meta_pkg.id.clone(), pkg); | 158 | pkg_by_id.insert(id, pkg); |
155 | for meta_tgt in meta_pkg.targets { | 159 | for meta_tgt in meta_pkg.targets { |
156 | let tgt = targets.alloc(TargetData { | 160 | let tgt = targets.alloc(TargetData { |
157 | pkg, | 161 | pkg, |