diff options
Diffstat (limited to 'crates')
14 files changed, 53 insertions, 34 deletions
diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs index 1594d4f0f..0516a05b4 100644 --- a/crates/hir/src/semantics.rs +++ b/crates/hir/src/semantics.rs | |||
@@ -207,8 +207,8 @@ impl<'db, DB: HirDatabase> Semantics<'db, DB> { | |||
207 | self.imp.resolve_record_field(field) | 207 | self.imp.resolve_record_field(field) |
208 | } | 208 | } |
209 | 209 | ||
210 | pub fn resolve_record_field_pat(&self, field: &ast::RecordPatField) -> Option<Field> { | 210 | pub fn resolve_record_pat_field(&self, field: &ast::RecordPatField) -> Option<Field> { |
211 | self.imp.resolve_record_field_pat(field) | 211 | self.imp.resolve_record_pat_field(field) |
212 | } | 212 | } |
213 | 213 | ||
214 | pub fn resolve_macro_call(&self, macro_call: &ast::MacroCall) -> Option<MacroDef> { | 214 | pub fn resolve_macro_call(&self, macro_call: &ast::MacroCall) -> Option<MacroDef> { |
@@ -433,8 +433,8 @@ impl<'db> SemanticsImpl<'db> { | |||
433 | self.analyze(field.syntax()).resolve_record_field(self.db, field) | 433 | self.analyze(field.syntax()).resolve_record_field(self.db, field) |
434 | } | 434 | } |
435 | 435 | ||
436 | fn resolve_record_field_pat(&self, field: &ast::RecordPatField) -> Option<Field> { | 436 | fn resolve_record_pat_field(&self, field: &ast::RecordPatField) -> Option<Field> { |
437 | self.analyze(field.syntax()).resolve_record_field_pat(self.db, field) | 437 | self.analyze(field.syntax()).resolve_record_pat_field(self.db, field) |
438 | } | 438 | } |
439 | 439 | ||
440 | fn resolve_macro_call(&self, macro_call: &ast::MacroCall) -> Option<MacroDef> { | 440 | fn resolve_macro_call(&self, macro_call: &ast::MacroCall) -> Option<MacroDef> { |
diff --git a/crates/hir/src/source_analyzer.rs b/crates/hir/src/source_analyzer.rs index 1d13c4f1d..1aef0f33f 100644 --- a/crates/hir/src/source_analyzer.rs +++ b/crates/hir/src/source_analyzer.rs | |||
@@ -179,13 +179,13 @@ impl SourceAnalyzer { | |||
179 | Some((struct_field.into(), local)) | 179 | Some((struct_field.into(), local)) |
180 | } | 180 | } |
181 | 181 | ||
182 | pub(crate) fn resolve_record_field_pat( | 182 | pub(crate) fn resolve_record_pat_field( |
183 | &self, | 183 | &self, |
184 | _db: &dyn HirDatabase, | 184 | _db: &dyn HirDatabase, |
185 | field: &ast::RecordPatField, | 185 | field: &ast::RecordPatField, |
186 | ) -> Option<Field> { | 186 | ) -> Option<Field> { |
187 | let pat_id = self.pat_id(&field.pat()?)?; | 187 | let pat_id = self.pat_id(&field.pat()?)?; |
188 | let struct_field = self.infer.as_ref()?.record_field_pat_resolution(pat_id)?; | 188 | let struct_field = self.infer.as_ref()?.record_pat_field_resolution(pat_id)?; |
189 | Some(struct_field.into()) | 189 | Some(struct_field.into()) |
190 | } | 190 | } |
191 | 191 | ||
diff --git a/crates/hir_ty/src/infer.rs b/crates/hir_ty/src/infer.rs index 03b00b101..2b53b8297 100644 --- a/crates/hir_ty/src/infer.rs +++ b/crates/hir_ty/src/infer.rs | |||
@@ -125,7 +125,7 @@ pub struct InferenceResult { | |||
125 | field_resolutions: FxHashMap<ExprId, FieldId>, | 125 | field_resolutions: FxHashMap<ExprId, FieldId>, |
126 | /// For each field in record literal, records the field it resolves to. | 126 | /// For each field in record literal, records the field it resolves to. |
127 | record_field_resolutions: FxHashMap<ExprId, FieldId>, | 127 | record_field_resolutions: FxHashMap<ExprId, FieldId>, |
128 | record_field_pat_resolutions: FxHashMap<PatId, FieldId>, | 128 | record_pat_field_resolutions: FxHashMap<PatId, FieldId>, |
129 | /// For each struct literal, records the variant it resolves to. | 129 | /// For each struct literal, records the variant it resolves to. |
130 | variant_resolutions: FxHashMap<ExprOrPatId, VariantId>, | 130 | variant_resolutions: FxHashMap<ExprOrPatId, VariantId>, |
131 | /// For each associated item record what it resolves to | 131 | /// For each associated item record what it resolves to |
@@ -146,8 +146,8 @@ impl InferenceResult { | |||
146 | pub fn record_field_resolution(&self, expr: ExprId) -> Option<FieldId> { | 146 | pub fn record_field_resolution(&self, expr: ExprId) -> Option<FieldId> { |
147 | self.record_field_resolutions.get(&expr).copied() | 147 | self.record_field_resolutions.get(&expr).copied() |
148 | } | 148 | } |
149 | pub fn record_field_pat_resolution(&self, pat: PatId) -> Option<FieldId> { | 149 | pub fn record_pat_field_resolution(&self, pat: PatId) -> Option<FieldId> { |
150 | self.record_field_pat_resolutions.get(&pat).copied() | 150 | self.record_pat_field_resolutions.get(&pat).copied() |
151 | } | 151 | } |
152 | pub fn variant_resolution_for_expr(&self, id: ExprId) -> Option<VariantId> { | 152 | pub fn variant_resolution_for_expr(&self, id: ExprId) -> Option<VariantId> { |
153 | self.variant_resolutions.get(&id.into()).copied() | 153 | self.variant_resolutions.get(&id.into()).copied() |
diff --git a/crates/hir_ty/src/infer/pat.rs b/crates/hir_ty/src/infer/pat.rs index 4dd4f9802..dde38bc39 100644 --- a/crates/hir_ty/src/infer/pat.rs +++ b/crates/hir_ty/src/infer/pat.rs | |||
@@ -70,7 +70,7 @@ impl<'a> InferenceContext<'a> { | |||
70 | let matching_field = var_data.as_ref().and_then(|it| it.field(&subpat.name)); | 70 | let matching_field = var_data.as_ref().and_then(|it| it.field(&subpat.name)); |
71 | if let Some(local_id) = matching_field { | 71 | if let Some(local_id) = matching_field { |
72 | let field_def = FieldId { parent: def.unwrap(), local_id }; | 72 | let field_def = FieldId { parent: def.unwrap(), local_id }; |
73 | self.result.record_field_pat_resolutions.insert(subpat.pat, field_def); | 73 | self.result.record_pat_field_resolutions.insert(subpat.pat, field_def); |
74 | } | 74 | } |
75 | 75 | ||
76 | let expected_ty = | 76 | let expected_ty = |
diff --git a/crates/ide_db/src/defs.rs b/crates/ide_db/src/defs.rs index 0d0affc27..f8c7aa491 100644 --- a/crates/ide_db/src/defs.rs +++ b/crates/ide_db/src/defs.rs | |||
@@ -157,9 +157,9 @@ pub fn classify_name(sema: &Semantics<RootDatabase>, name: &ast::Name) -> Option | |||
157 | ast::IdentPat(it) => { | 157 | ast::IdentPat(it) => { |
158 | let local = sema.to_def(&it)?; | 158 | let local = sema.to_def(&it)?; |
159 | 159 | ||
160 | if let Some(record_field_pat) = it.syntax().parent().and_then(ast::RecordPatField::cast) { | 160 | if let Some(record_pat_field) = it.syntax().parent().and_then(ast::RecordPatField::cast) { |
161 | if record_field_pat.name_ref().is_none() { | 161 | if record_pat_field.name_ref().is_none() { |
162 | if let Some(field) = sema.resolve_record_field_pat(&record_field_pat) { | 162 | if let Some(field) = sema.resolve_record_pat_field(&record_pat_field) { |
163 | let field = Definition::Field(field); | 163 | let field = Definition::Field(field); |
164 | return Some(NameClass::FieldShorthand { local, field }); | 164 | return Some(NameClass::FieldShorthand { local, field }); |
165 | } | 165 | } |
@@ -275,8 +275,8 @@ pub fn classify_name_ref( | |||
275 | } | 275 | } |
276 | } | 276 | } |
277 | 277 | ||
278 | if let Some(record_field_pat) = ast::RecordPatField::cast(parent.clone()) { | 278 | if let Some(record_pat_field) = ast::RecordPatField::cast(parent.clone()) { |
279 | if let Some(field) = sema.resolve_record_field_pat(&record_field_pat) { | 279 | if let Some(field) = sema.resolve_record_pat_field(&record_pat_field) { |
280 | let field = Definition::Field(field); | 280 | let field = Definition::Field(field); |
281 | return Some(NameRefClass::Definition(field)); | 281 | return Some(NameRefClass::Definition(field)); |
282 | } | 282 | } |
diff --git a/crates/parser/src/grammar/patterns.rs b/crates/parser/src/grammar/patterns.rs index 796f206e1..7e7f73dee 100644 --- a/crates/parser/src/grammar/patterns.rs +++ b/crates/parser/src/grammar/patterns.rs | |||
@@ -188,7 +188,7 @@ fn tuple_pat_fields(p: &mut Parser) { | |||
188 | p.expect(T![')']); | 188 | p.expect(T![')']); |
189 | } | 189 | } |
190 | 190 | ||
191 | // test record_field_pat_list | 191 | // test record_pat_field_list |
192 | // fn foo() { | 192 | // fn foo() { |
193 | // let S {} = (); | 193 | // let S {} = (); |
194 | // let S { f, ref mut g } = (); | 194 | // let S { f, ref mut g } = (); |
@@ -208,7 +208,7 @@ fn record_pat_field_list(p: &mut Parser) { | |||
208 | c => { | 208 | c => { |
209 | let m = p.start(); | 209 | let m = p.start(); |
210 | match c { | 210 | match c { |
211 | // test record_field_pat | 211 | // test record_pat_field |
212 | // fn foo() { | 212 | // fn foo() { |
213 | // let S { 0: 1 } = (); | 213 | // let S { 0: 1 } = (); |
214 | // let S { x: 1 } = (); | 214 | // let S { x: 1 } = (); |
diff --git a/crates/project_model/src/lib.rs b/crates/project_model/src/lib.rs index 2d91939ce..288c39e49 100644 --- a/crates/project_model/src/lib.rs +++ b/crates/project_model/src/lib.rs | |||
@@ -33,7 +33,7 @@ pub enum ProjectWorkspace { | |||
33 | /// Project workspace was discovered by running `cargo metadata` and `rustc --print sysroot`. | 33 | /// Project workspace was discovered by running `cargo metadata` and `rustc --print sysroot`. |
34 | Cargo { cargo: CargoWorkspace, sysroot: Sysroot }, | 34 | Cargo { cargo: CargoWorkspace, sysroot: Sysroot }, |
35 | /// Project workspace was manually specified using a `rust-project.json` file. | 35 | /// Project workspace was manually specified using a `rust-project.json` file. |
36 | Json { project: ProjectJson }, | 36 | Json { project: ProjectJson, sysroot: Option<Sysroot> }, |
37 | } | 37 | } |
38 | 38 | ||
39 | impl fmt::Debug for ProjectWorkspace { | 39 | impl fmt::Debug for ProjectWorkspace { |
@@ -44,10 +44,10 @@ impl fmt::Debug for ProjectWorkspace { | |||
44 | .field("n_packages", &cargo.packages().len()) | 44 | .field("n_packages", &cargo.packages().len()) |
45 | .field("n_sysroot_crates", &sysroot.crates().len()) | 45 | .field("n_sysroot_crates", &sysroot.crates().len()) |
46 | .finish(), | 46 | .finish(), |
47 | ProjectWorkspace::Json { project } => { | 47 | ProjectWorkspace::Json { project, sysroot } => { |
48 | let mut debug_struct = f.debug_struct("Json"); | 48 | let mut debug_struct = f.debug_struct("Json"); |
49 | debug_struct.field("n_crates", &project.n_crates()); | 49 | debug_struct.field("n_crates", &project.n_crates()); |
50 | if let Some(sysroot) = &project.sysroot { | 50 | if let Some(sysroot) = sysroot { |
51 | debug_struct.field("n_sysroot_crates", &sysroot.crates().len()); | 51 | debug_struct.field("n_sysroot_crates", &sysroot.crates().len()); |
52 | } | 52 | } |
53 | debug_struct.finish() | 53 | debug_struct.finish() |
@@ -169,7 +169,11 @@ impl ProjectWorkspace { | |||
169 | })?; | 169 | })?; |
170 | let project_location = project_json.parent().unwrap().to_path_buf(); | 170 | let project_location = project_json.parent().unwrap().to_path_buf(); |
171 | let project = ProjectJson::new(&project_location, data); | 171 | let project = ProjectJson::new(&project_location, data); |
172 | ProjectWorkspace::Json { project } | 172 | let sysroot = match &project.sysroot_src { |
173 | Some(path) => Some(Sysroot::load(path)?), | ||
174 | None => None, | ||
175 | }; | ||
176 | ProjectWorkspace::Json { project, sysroot } | ||
173 | } | 177 | } |
174 | ProjectManifest::CargoToml(cargo_toml) => { | 178 | ProjectManifest::CargoToml(cargo_toml) => { |
175 | let cargo_version = utf8_stdout({ | 179 | let cargo_version = utf8_stdout({ |
@@ -203,12 +207,21 @@ impl ProjectWorkspace { | |||
203 | Ok(res) | 207 | Ok(res) |
204 | } | 208 | } |
205 | 209 | ||
210 | pub fn load_inline(project_json: ProjectJson) -> Result<ProjectWorkspace> { | ||
211 | let sysroot = match &project_json.sysroot_src { | ||
212 | Some(path) => Some(Sysroot::load(path)?), | ||
213 | None => None, | ||
214 | }; | ||
215 | |||
216 | Ok(ProjectWorkspace::Json { project: project_json, sysroot }) | ||
217 | } | ||
218 | |||
206 | /// Returns the roots for the current `ProjectWorkspace` | 219 | /// Returns the roots for the current `ProjectWorkspace` |
207 | /// The return type contains the path and whether or not | 220 | /// The return type contains the path and whether or not |
208 | /// the root is a member of the current workspace | 221 | /// the root is a member of the current workspace |
209 | pub fn to_roots(&self) -> Vec<PackageRoot> { | 222 | pub fn to_roots(&self) -> Vec<PackageRoot> { |
210 | match self { | 223 | match self { |
211 | ProjectWorkspace::Json { project } => project | 224 | ProjectWorkspace::Json { project, sysroot } => project |
212 | .crates() | 225 | .crates() |
213 | .map(|(_, krate)| PackageRoot { | 226 | .map(|(_, krate)| PackageRoot { |
214 | is_member: krate.is_workspace_member, | 227 | is_member: krate.is_workspace_member, |
@@ -217,7 +230,7 @@ impl ProjectWorkspace { | |||
217 | }) | 230 | }) |
218 | .collect::<FxHashSet<_>>() | 231 | .collect::<FxHashSet<_>>() |
219 | .into_iter() | 232 | .into_iter() |
220 | .chain(project.sysroot.as_ref().into_iter().flat_map(|sysroot| { | 233 | .chain(sysroot.as_ref().into_iter().flat_map(|sysroot| { |
221 | sysroot.crates().map(move |krate| PackageRoot { | 234 | sysroot.crates().map(move |krate| PackageRoot { |
222 | is_member: false, | 235 | is_member: false, |
223 | include: vec![sysroot[krate].root_dir().to_path_buf()], | 236 | include: vec![sysroot[krate].root_dir().to_path_buf()], |
@@ -255,7 +268,7 @@ impl ProjectWorkspace { | |||
255 | 268 | ||
256 | pub fn proc_macro_dylib_paths(&self) -> Vec<AbsPathBuf> { | 269 | pub fn proc_macro_dylib_paths(&self) -> Vec<AbsPathBuf> { |
257 | match self { | 270 | match self { |
258 | ProjectWorkspace::Json { project } => project | 271 | ProjectWorkspace::Json { project, sysroot: _ } => project |
259 | .crates() | 272 | .crates() |
260 | .filter_map(|(_, krate)| krate.proc_macro_dylib_path.as_ref()) | 273 | .filter_map(|(_, krate)| krate.proc_macro_dylib_path.as_ref()) |
261 | .cloned() | 274 | .cloned() |
@@ -285,9 +298,8 @@ impl ProjectWorkspace { | |||
285 | ) -> CrateGraph { | 298 | ) -> CrateGraph { |
286 | let mut crate_graph = CrateGraph::default(); | 299 | let mut crate_graph = CrateGraph::default(); |
287 | match self { | 300 | match self { |
288 | ProjectWorkspace::Json { project } => { | 301 | ProjectWorkspace::Json { project, sysroot } => { |
289 | let sysroot_dps = project | 302 | let sysroot_dps = sysroot |
290 | .sysroot | ||
291 | .as_ref() | 303 | .as_ref() |
292 | .map(|sysroot| sysroot_to_crate_graph(&mut crate_graph, sysroot, target, load)); | 304 | .map(|sysroot| sysroot_to_crate_graph(&mut crate_graph, sysroot, target, load)); |
293 | 305 | ||
diff --git a/crates/project_model/src/project_json.rs b/crates/project_model/src/project_json.rs index 5a0fe749a..979e90058 100644 --- a/crates/project_model/src/project_json.rs +++ b/crates/project_model/src/project_json.rs | |||
@@ -7,12 +7,12 @@ use paths::{AbsPath, AbsPathBuf}; | |||
7 | use rustc_hash::FxHashMap; | 7 | use rustc_hash::FxHashMap; |
8 | use serde::{de, Deserialize}; | 8 | use serde::{de, Deserialize}; |
9 | 9 | ||
10 | use crate::{cfg_flag::CfgFlag, Sysroot}; | 10 | use crate::cfg_flag::CfgFlag; |
11 | 11 | ||
12 | /// Roots and crates that compose this Rust project. | 12 | /// Roots and crates that compose this Rust project. |
13 | #[derive(Clone, Debug, Eq, PartialEq)] | 13 | #[derive(Clone, Debug, Eq, PartialEq)] |
14 | pub struct ProjectJson { | 14 | pub struct ProjectJson { |
15 | pub(crate) sysroot: Option<Sysroot>, | 15 | pub(crate) sysroot_src: Option<AbsPathBuf>, |
16 | crates: Vec<Crate>, | 16 | crates: Vec<Crate>, |
17 | } | 17 | } |
18 | 18 | ||
@@ -35,7 +35,7 @@ pub struct Crate { | |||
35 | impl ProjectJson { | 35 | impl ProjectJson { |
36 | pub fn new(base: &AbsPath, data: ProjectJsonData) -> ProjectJson { | 36 | pub fn new(base: &AbsPath, data: ProjectJsonData) -> ProjectJson { |
37 | ProjectJson { | 37 | ProjectJson { |
38 | sysroot: data.sysroot_src.map(|it| base.join(it)).map(|it| Sysroot::load(&it)), | 38 | sysroot_src: data.sysroot_src.map(|it| base.join(it)), |
39 | crates: data | 39 | crates: data |
40 | .crates | 40 | .crates |
41 | .into_iter() | 41 | .into_iter() |
diff --git a/crates/project_model/src/sysroot.rs b/crates/project_model/src/sysroot.rs index 74c0eda9a..871808d89 100644 --- a/crates/project_model/src/sysroot.rs +++ b/crates/project_model/src/sysroot.rs | |||
@@ -51,11 +51,11 @@ impl Sysroot { | |||
51 | pub fn discover(cargo_toml: &AbsPath) -> Result<Sysroot> { | 51 | pub fn discover(cargo_toml: &AbsPath) -> Result<Sysroot> { |
52 | let current_dir = cargo_toml.parent().unwrap(); | 52 | let current_dir = cargo_toml.parent().unwrap(); |
53 | let sysroot_src_dir = discover_sysroot_src_dir(current_dir)?; | 53 | let sysroot_src_dir = discover_sysroot_src_dir(current_dir)?; |
54 | let res = Sysroot::load(&sysroot_src_dir); | 54 | let res = Sysroot::load(&sysroot_src_dir)?; |
55 | Ok(res) | 55 | Ok(res) |
56 | } | 56 | } |
57 | 57 | ||
58 | pub fn load(sysroot_src_dir: &AbsPath) -> Sysroot { | 58 | pub fn load(sysroot_src_dir: &AbsPath) -> Result<Sysroot> { |
59 | let mut sysroot = Sysroot { crates: Arena::default() }; | 59 | let mut sysroot = Sysroot { crates: Arena::default() }; |
60 | 60 | ||
61 | for name in SYSROOT_CRATES.trim().lines() { | 61 | for name in SYSROOT_CRATES.trim().lines() { |
@@ -89,7 +89,14 @@ impl Sysroot { | |||
89 | } | 89 | } |
90 | } | 90 | } |
91 | 91 | ||
92 | sysroot | 92 | if sysroot.by_name("core").is_none() { |
93 | anyhow::bail!( | ||
94 | "could not find libcore in sysroot path `{}`", | ||
95 | sysroot_src_dir.as_ref().display() | ||
96 | ); | ||
97 | } | ||
98 | |||
99 | Ok(sysroot) | ||
93 | } | 100 | } |
94 | 101 | ||
95 | fn by_name(&self, name: &str) -> Option<SysrootCrate> { | 102 | fn by_name(&self, name: &str) -> Option<SysrootCrate> { |
diff --git a/crates/rust-analyzer/src/reload.rs b/crates/rust-analyzer/src/reload.rs index 20019b944..bab6f8a71 100644 --- a/crates/rust-analyzer/src/reload.rs +++ b/crates/rust-analyzer/src/reload.rs | |||
@@ -109,7 +109,7 @@ impl GlobalState { | |||
109 | ) | 109 | ) |
110 | } | 110 | } |
111 | LinkedProject::InlineJsonProject(it) => { | 111 | LinkedProject::InlineJsonProject(it) => { |
112 | Ok(project_model::ProjectWorkspace::Json { project: it.clone() }) | 112 | project_model::ProjectWorkspace::load_inline(it.clone()) |
113 | } | 113 | } |
114 | }) | 114 | }) |
115 | .collect::<Vec<_>>(); | 115 | .collect::<Vec<_>>(); |
diff --git a/crates/syntax/test_data/parser/inline/ok/0102_record_field_pat_list.rast b/crates/syntax/test_data/parser/inline/ok/0102_record_pat_field_list.rast index 866e60ed8..866e60ed8 100644 --- a/crates/syntax/test_data/parser/inline/ok/0102_record_field_pat_list.rast +++ b/crates/syntax/test_data/parser/inline/ok/0102_record_pat_field_list.rast | |||
diff --git a/crates/syntax/test_data/parser/inline/ok/0102_record_field_pat_list.rs b/crates/syntax/test_data/parser/inline/ok/0102_record_pat_field_list.rs index da3412fa8..da3412fa8 100644 --- a/crates/syntax/test_data/parser/inline/ok/0102_record_field_pat_list.rs +++ b/crates/syntax/test_data/parser/inline/ok/0102_record_pat_field_list.rs | |||
diff --git a/crates/syntax/test_data/parser/inline/ok/0145_record_field_pat.rast b/crates/syntax/test_data/parser/inline/ok/0145_record_pat_field.rast index 925409bdf..925409bdf 100644 --- a/crates/syntax/test_data/parser/inline/ok/0145_record_field_pat.rast +++ b/crates/syntax/test_data/parser/inline/ok/0145_record_pat_field.rast | |||
diff --git a/crates/syntax/test_data/parser/inline/ok/0145_record_field_pat.rs b/crates/syntax/test_data/parser/inline/ok/0145_record_pat_field.rs index 26b1d5f89..26b1d5f89 100644 --- a/crates/syntax/test_data/parser/inline/ok/0145_record_field_pat.rs +++ b/crates/syntax/test_data/parser/inline/ok/0145_record_pat_field.rs | |||