diff options
5 files changed, 47 insertions, 2 deletions
diff --git a/crates/ra_project_model/src/cargo_workspace.rs b/crates/ra_project_model/src/cargo_workspace.rs index 291594e2a..738fd6f61 100644 --- a/crates/ra_project_model/src/cargo_workspace.rs +++ b/crates/ra_project_model/src/cargo_workspace.rs | |||
@@ -75,6 +75,7 @@ pub type Target = Idx<TargetData>; | |||
75 | 75 | ||
76 | #[derive(Debug, Clone)] | 76 | #[derive(Debug, Clone)] |
77 | pub struct PackageData { | 77 | pub struct PackageData { |
78 | pub id: String, | ||
78 | pub name: String, | 79 | pub name: String, |
79 | pub manifest: PathBuf, | 80 | pub manifest: PathBuf, |
80 | pub targets: Vec<Target>, | 81 | pub targets: Vec<Target>, |
@@ -180,6 +181,7 @@ impl CargoWorkspace { | |||
180 | .with_context(|| format!("Failed to parse edition {}", edition))?; | 181 | .with_context(|| format!("Failed to parse edition {}", edition))?; |
181 | let pkg = packages.alloc(PackageData { | 182 | let pkg = packages.alloc(PackageData { |
182 | name, | 183 | name, |
184 | id: id.to_string(), | ||
183 | manifest: manifest_path, | 185 | manifest: manifest_path, |
184 | targets: Vec::new(), | 186 | targets: Vec::new(), |
185 | is_member, | 187 | is_member, |
@@ -249,6 +251,18 @@ impl CargoWorkspace { | |||
249 | pub fn workspace_root(&self) -> &Path { | 251 | pub fn workspace_root(&self) -> &Path { |
250 | &self.workspace_root | 252 | &self.workspace_root |
251 | } | 253 | } |
254 | |||
255 | pub fn package_flag(&self, package: &PackageData) -> String { | ||
256 | if self.is_unique(&*package.name) { | ||
257 | package.name.clone() | ||
258 | } else { | ||
259 | package.id.clone() | ||
260 | } | ||
261 | } | ||
262 | |||
263 | fn is_unique(&self, name: &str) -> bool { | ||
264 | self.packages.iter().filter(|(_, v)| v.name == name).count() == 1 | ||
265 | } | ||
252 | } | 266 | } |
253 | 267 | ||
254 | #[derive(Debug, Clone, Default)] | 268 | #[derive(Debug, Clone, Default)] |
diff --git a/crates/ra_syntax/src/parsing/text_tree_sink.rs b/crates/ra_syntax/src/parsing/text_tree_sink.rs index dd202601d..87bb21cd9 100644 --- a/crates/ra_syntax/src/parsing/text_tree_sink.rs +++ b/crates/ra_syntax/src/parsing/text_tree_sink.rs | |||
@@ -149,10 +149,21 @@ fn n_attached_trivias<'a>( | |||
149 | MACRO_CALL | CONST_DEF | TYPE_ALIAS_DEF | STRUCT_DEF | ENUM_DEF | ENUM_VARIANT | FN_DEF | 149 | MACRO_CALL | CONST_DEF | TYPE_ALIAS_DEF | STRUCT_DEF | ENUM_DEF | ENUM_VARIANT | FN_DEF |
150 | | TRAIT_DEF | MODULE | RECORD_FIELD_DEF | STATIC_DEF => { | 150 | | TRAIT_DEF | MODULE | RECORD_FIELD_DEF | STATIC_DEF => { |
151 | let mut res = 0; | 151 | let mut res = 0; |
152 | for (i, (kind, text)) in trivias.enumerate() { | 152 | let mut trivias = trivias.enumerate().peekable(); |
153 | |||
154 | while let Some((i, (kind, text))) = trivias.next() { | ||
153 | match kind { | 155 | match kind { |
154 | WHITESPACE => { | 156 | WHITESPACE => { |
155 | if text.contains("\n\n") { | 157 | if text.contains("\n\n") { |
158 | // we check whether the next token is a doc-comment | ||
159 | // and skip the whitespace in this case | ||
160 | if let Some((peek_kind, peek_text)) = | ||
161 | trivias.peek().map(|(_, pair)| pair) | ||
162 | { | ||
163 | if *peek_kind == COMMENT && peek_text.starts_with("///") { | ||
164 | continue; | ||
165 | } | ||
166 | } | ||
156 | break; | 167 | break; |
157 | } | 168 | } |
158 | } | 169 | } |
diff --git a/crates/ra_syntax/test_data/parser/ok/0065_comment_newline.rs b/crates/ra_syntax/test_data/parser/ok/0065_comment_newline.rs new file mode 100644 index 000000000..1fafe216b --- /dev/null +++ b/crates/ra_syntax/test_data/parser/ok/0065_comment_newline.rs | |||
@@ -0,0 +1,3 @@ | |||
1 | /// Example | ||
2 | |||
3 | fn test() {} | ||
diff --git a/crates/ra_syntax/test_data/parser/ok/0065_comment_newline.txt b/crates/ra_syntax/test_data/parser/ok/0065_comment_newline.txt new file mode 100644 index 000000000..91d0c3736 --- /dev/null +++ b/crates/ra_syntax/test_data/parser/ok/0065_comment_newline.txt | |||
@@ -0,0 +1,17 @@ | |||
1 | SOURCE_FILE@[0; 26) | ||
2 | FN_DEF@[0; 25) | ||
3 | COMMENT@[0; 11) "/// Example" | ||
4 | WHITESPACE@[11; 13) "\n\n" | ||
5 | FN_KW@[13; 15) "fn" | ||
6 | WHITESPACE@[15; 16) " " | ||
7 | NAME@[16; 20) | ||
8 | IDENT@[16; 20) "test" | ||
9 | PARAM_LIST@[20; 22) | ||
10 | L_PAREN@[20; 21) "(" | ||
11 | R_PAREN@[21; 22) ")" | ||
12 | WHITESPACE@[22; 23) " " | ||
13 | BLOCK_EXPR@[23; 25) | ||
14 | BLOCK@[23; 25) | ||
15 | L_CURLY@[23; 24) "{" | ||
16 | R_CURLY@[24; 25) "}" | ||
17 | WHITESPACE@[25; 26) "\n" | ||
diff --git a/crates/rust-analyzer/src/cargo_target_spec.rs b/crates/rust-analyzer/src/cargo_target_spec.rs index f87bdcec5..942c30328 100644 --- a/crates/rust-analyzer/src/cargo_target_spec.rs +++ b/crates/rust-analyzer/src/cargo_target_spec.rs | |||
@@ -77,7 +77,7 @@ impl CargoTargetSpec { | |||
77 | ProjectWorkspace::Cargo { cargo, .. } => { | 77 | ProjectWorkspace::Cargo { cargo, .. } => { |
78 | let tgt = cargo.target_by_root(&path)?; | 78 | let tgt = cargo.target_by_root(&path)?; |
79 | Some(CargoTargetSpec { | 79 | Some(CargoTargetSpec { |
80 | package: cargo[cargo[tgt].package].name.clone(), | 80 | package: cargo.package_flag(&cargo[cargo[tgt].package]), |
81 | target: cargo[tgt].name.clone(), | 81 | target: cargo[tgt].name.clone(), |
82 | target_kind: cargo[tgt].kind, | 82 | target_kind: cargo[tgt].kind, |
83 | }) | 83 | }) |