diff options
author | Matthew Jasper <[email protected]> | 2020-05-10 16:08:28 +0100 |
---|---|---|
committer | Matthew Jasper <[email protected]> | 2020-05-10 16:25:51 +0100 |
commit | 11c0a5bb60f9377526a588c11c68d5471ae46aa3 (patch) | |
tree | efee8051e90104b4c10314b9588936f235c1c120 | |
parent | 4578154b608fa075595103d0c933da60d55b25c8 (diff) |
Highlight mutable statics as mutable
-rw-r--r-- | crates/ra_hir/src/code_model.rs | 4 | ||||
-rw-r--r-- | crates/ra_hir_def/src/data.rs | 31 | ||||
-rw-r--r-- | crates/ra_hir_def/src/db.rs | 6 | ||||
-rw-r--r-- | crates/ra_hir_ty/src/infer.rs | 8 | ||||
-rw-r--r-- | crates/ra_ide/src/snapshots/highlighting.html | 5 | ||||
-rw-r--r-- | crates/ra_ide/src/syntax_highlighting.rs | 8 | ||||
-rw-r--r-- | crates/ra_ide/src/syntax_highlighting/tests.rs | 7 |
7 files changed, 56 insertions, 13 deletions
diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index be18c845c..3fc2eccdd 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs | |||
@@ -678,6 +678,10 @@ impl Static { | |||
678 | pub fn name(self, db: &dyn HirDatabase) -> Option<Name> { | 678 | pub fn name(self, db: &dyn HirDatabase) -> Option<Name> { |
679 | db.static_data(self.id).name.clone() | 679 | db.static_data(self.id).name.clone() |
680 | } | 680 | } |
681 | |||
682 | pub fn is_mut(self, db: &dyn HirDatabase) -> bool { | ||
683 | db.static_data(self.id).mutable | ||
684 | } | ||
681 | } | 685 | } |
682 | 686 | ||
683 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | 687 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
diff --git a/crates/ra_hir_def/src/data.rs b/crates/ra_hir_def/src/data.rs index e7eb2bb11..e2130d931 100644 --- a/crates/ra_hir_def/src/data.rs +++ b/crates/ra_hir_def/src/data.rs | |||
@@ -251,11 +251,6 @@ impl ConstData { | |||
251 | Arc::new(ConstData::new(db, vis_default, node)) | 251 | Arc::new(ConstData::new(db, vis_default, node)) |
252 | } | 252 | } |
253 | 253 | ||
254 | pub(crate) fn static_data_query(db: &dyn DefDatabase, konst: StaticId) -> Arc<ConstData> { | ||
255 | let node = konst.lookup(db).source(db); | ||
256 | Arc::new(ConstData::new(db, RawVisibility::private(), node)) | ||
257 | } | ||
258 | |||
259 | fn new<N: NameOwner + TypeAscriptionOwner + VisibilityOwner>( | 254 | fn new<N: NameOwner + TypeAscriptionOwner + VisibilityOwner>( |
260 | db: &dyn DefDatabase, | 255 | db: &dyn DefDatabase, |
261 | vis_default: RawVisibility, | 256 | vis_default: RawVisibility, |
@@ -270,6 +265,32 @@ impl ConstData { | |||
270 | } | 265 | } |
271 | } | 266 | } |
272 | 267 | ||
268 | #[derive(Debug, Clone, PartialEq, Eq)] | ||
269 | pub struct StaticData { | ||
270 | pub name: Option<Name>, | ||
271 | pub type_ref: TypeRef, | ||
272 | pub visibility: RawVisibility, | ||
273 | pub mutable: bool, | ||
274 | } | ||
275 | |||
276 | impl StaticData { | ||
277 | pub(crate) fn static_data_query(db: &dyn DefDatabase, konst: StaticId) -> Arc<StaticData> { | ||
278 | let node = konst.lookup(db).source(db); | ||
279 | let ctx = LowerCtx::new(db, node.file_id); | ||
280 | |||
281 | let name = node.value.name().map(|n| n.as_name()); | ||
282 | let type_ref = TypeRef::from_ast_opt(&ctx, node.value.ascribed_type()); | ||
283 | let mutable = node.value.mut_token().is_some(); | ||
284 | let visibility = RawVisibility::from_ast_with_default( | ||
285 | db, | ||
286 | RawVisibility::private(), | ||
287 | node.map(|n| n.visibility()), | ||
288 | ); | ||
289 | |||
290 | Arc::new(StaticData { name, type_ref, visibility, mutable }) | ||
291 | } | ||
292 | } | ||
293 | |||
273 | fn collect_items_in_macros( | 294 | fn collect_items_in_macros( |
274 | db: &dyn DefDatabase, | 295 | db: &dyn DefDatabase, |
275 | expander: &mut Expander, | 296 | expander: &mut Expander, |
diff --git a/crates/ra_hir_def/src/db.rs b/crates/ra_hir_def/src/db.rs index 5dc7395f5..e665ab45d 100644 --- a/crates/ra_hir_def/src/db.rs +++ b/crates/ra_hir_def/src/db.rs | |||
@@ -10,7 +10,7 @@ use crate::{ | |||
10 | adt::{EnumData, StructData}, | 10 | adt::{EnumData, StructData}, |
11 | attr::Attrs, | 11 | attr::Attrs, |
12 | body::{scope::ExprScopes, Body, BodySourceMap}, | 12 | body::{scope::ExprScopes, Body, BodySourceMap}, |
13 | data::{ConstData, FunctionData, ImplData, TraitData, TypeAliasData}, | 13 | data::{ConstData, FunctionData, ImplData, StaticData, TraitData, TypeAliasData}, |
14 | docs::Documentation, | 14 | docs::Documentation, |
15 | generics::GenericParams, | 15 | generics::GenericParams, |
16 | lang_item::{LangItemTarget, LangItems}, | 16 | lang_item::{LangItemTarget, LangItems}, |
@@ -77,8 +77,8 @@ pub trait DefDatabase: InternDatabase + AstDatabase + Upcast<dyn AstDatabase> { | |||
77 | #[salsa::invoke(ConstData::const_data_query)] | 77 | #[salsa::invoke(ConstData::const_data_query)] |
78 | fn const_data(&self, konst: ConstId) -> Arc<ConstData>; | 78 | fn const_data(&self, konst: ConstId) -> Arc<ConstData>; |
79 | 79 | ||
80 | #[salsa::invoke(ConstData::static_data_query)] | 80 | #[salsa::invoke(StaticData::static_data_query)] |
81 | fn static_data(&self, konst: StaticId) -> Arc<ConstData>; | 81 | fn static_data(&self, konst: StaticId) -> Arc<StaticData>; |
82 | 82 | ||
83 | #[salsa::invoke(Body::body_with_source_map_query)] | 83 | #[salsa::invoke(Body::body_with_source_map_query)] |
84 | fn body_with_source_map(&self, def: DefWithBodyId) -> (Arc<Body>, Arc<BodySourceMap>); | 84 | fn body_with_source_map(&self, def: DefWithBodyId) -> (Arc<Body>, Arc<BodySourceMap>); |
diff --git a/crates/ra_hir_ty/src/infer.rs b/crates/ra_hir_ty/src/infer.rs index a21ad8d86..fb7c6cd8c 100644 --- a/crates/ra_hir_ty/src/infer.rs +++ b/crates/ra_hir_ty/src/infer.rs | |||
@@ -22,7 +22,7 @@ use rustc_hash::FxHashMap; | |||
22 | 22 | ||
23 | use hir_def::{ | 23 | use hir_def::{ |
24 | body::Body, | 24 | body::Body, |
25 | data::{ConstData, FunctionData}, | 25 | data::{ConstData, FunctionData, StaticData}, |
26 | expr::{BindingAnnotation, ExprId, PatId}, | 26 | expr::{BindingAnnotation, ExprId, PatId}, |
27 | lang_item::LangItemTarget, | 27 | lang_item::LangItemTarget, |
28 | path::{path, Path}, | 28 | path::{path, Path}, |
@@ -71,7 +71,7 @@ pub(crate) fn infer_query(db: &dyn HirDatabase, def: DefWithBodyId) -> Arc<Infer | |||
71 | match def { | 71 | match def { |
72 | DefWithBodyId::ConstId(c) => ctx.collect_const(&db.const_data(c)), | 72 | DefWithBodyId::ConstId(c) => ctx.collect_const(&db.const_data(c)), |
73 | DefWithBodyId::FunctionId(f) => ctx.collect_fn(&db.function_data(f)), | 73 | DefWithBodyId::FunctionId(f) => ctx.collect_fn(&db.function_data(f)), |
74 | DefWithBodyId::StaticId(s) => ctx.collect_const(&db.static_data(s)), | 74 | DefWithBodyId::StaticId(s) => ctx.collect_static(&db.static_data(s)), |
75 | } | 75 | } |
76 | 76 | ||
77 | ctx.infer_body(); | 77 | ctx.infer_body(); |
@@ -485,6 +485,10 @@ impl<'a> InferenceContext<'a> { | |||
485 | self.return_ty = self.make_ty(&data.type_ref); | 485 | self.return_ty = self.make_ty(&data.type_ref); |
486 | } | 486 | } |
487 | 487 | ||
488 | fn collect_static(&mut self, data: &StaticData) { | ||
489 | self.return_ty = self.make_ty(&data.type_ref); | ||
490 | } | ||
491 | |||
488 | fn collect_fn(&mut self, data: &FunctionData) { | 492 | fn collect_fn(&mut self, data: &FunctionData) { |
489 | let body = Arc::clone(&self.body); // avoid borrow checker problem | 493 | let body = Arc::clone(&self.body); // avoid borrow checker problem |
490 | let ctx = crate::lower::TyLoweringContext::new(self.db, &self.resolver) | 494 | let ctx = crate::lower::TyLoweringContext::new(self.db, &self.resolver) |
diff --git a/crates/ra_ide/src/snapshots/highlighting.html b/crates/ra_ide/src/snapshots/highlighting.html index 4b12fe823..0a881d384 100644 --- a/crates/ra_ide/src/snapshots/highlighting.html +++ b/crates/ra_ide/src/snapshots/highlighting.html | |||
@@ -56,7 +56,10 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd | |||
56 | <span class="keyword">let</span> <span class="variable declaration">x</span> = <span class="numeric_literal">92</span>; | 56 | <span class="keyword">let</span> <span class="variable declaration">x</span> = <span class="numeric_literal">92</span>; |
57 | <span class="variable mutable">vec</span>.<span class="unresolved_reference">push</span>(<span class="struct">Foo</span> { <span class="field">x</span>, <span class="field">y</span>: <span class="numeric_literal">1</span> }); | 57 | <span class="variable mutable">vec</span>.<span class="unresolved_reference">push</span>(<span class="struct">Foo</span> { <span class="field">x</span>, <span class="field">y</span>: <span class="numeric_literal">1</span> }); |
58 | } | 58 | } |
59 | <span class="keyword unsafe">unsafe</span> { <span class="variable mutable">vec</span>.<span class="unresolved_reference">set_len</span>(<span class="numeric_literal">0</span>); } | 59 | <span class="keyword unsafe">unsafe</span> { |
60 | <span class="variable mutable">vec</span>.<span class="unresolved_reference">set_len</span>(<span class="numeric_literal">0</span>); | ||
61 | <span class="static mutable">STATIC_MUT</span> = <span class="numeric_literal">1</span>; | ||
62 | } | ||
60 | 63 | ||
61 | <span class="keyword">let</span> <span class="keyword">mut</span> <span class="variable declaration mutable">x</span> = <span class="numeric_literal">42</span>; | 64 | <span class="keyword">let</span> <span class="keyword">mut</span> <span class="variable declaration mutable">x</span> = <span class="numeric_literal">42</span>; |
62 | <span class="keyword">let</span> <span class="variable declaration mutable">y</span> = &<span class="keyword">mut</span> <span class="variable mutable">x</span>; | 65 | <span class="keyword">let</span> <span class="variable declaration mutable">y</span> = &<span class="keyword">mut</span> <span class="variable mutable">x</span>; |
diff --git a/crates/ra_ide/src/syntax_highlighting.rs b/crates/ra_ide/src/syntax_highlighting.rs index 6658c7bb2..9c54b92a3 100644 --- a/crates/ra_ide/src/syntax_highlighting.rs +++ b/crates/ra_ide/src/syntax_highlighting.rs | |||
@@ -431,10 +431,16 @@ fn highlight_name(db: &RootDatabase, def: Definition) -> Highlight { | |||
431 | hir::ModuleDef::Adt(hir::Adt::Union(_)) => HighlightTag::Union, | 431 | hir::ModuleDef::Adt(hir::Adt::Union(_)) => HighlightTag::Union, |
432 | hir::ModuleDef::EnumVariant(_) => HighlightTag::EnumVariant, | 432 | hir::ModuleDef::EnumVariant(_) => HighlightTag::EnumVariant, |
433 | hir::ModuleDef::Const(_) => HighlightTag::Constant, | 433 | hir::ModuleDef::Const(_) => HighlightTag::Constant, |
434 | hir::ModuleDef::Static(_) => HighlightTag::Static, | ||
435 | hir::ModuleDef::Trait(_) => HighlightTag::Trait, | 434 | hir::ModuleDef::Trait(_) => HighlightTag::Trait, |
436 | hir::ModuleDef::TypeAlias(_) => HighlightTag::TypeAlias, | 435 | hir::ModuleDef::TypeAlias(_) => HighlightTag::TypeAlias, |
437 | hir::ModuleDef::BuiltinType(_) => HighlightTag::BuiltinType, | 436 | hir::ModuleDef::BuiltinType(_) => HighlightTag::BuiltinType, |
437 | hir::ModuleDef::Static(s) => { | ||
438 | let mut h = Highlight::new(HighlightTag::Static); | ||
439 | if s.is_mut(db) { | ||
440 | h |= HighlightModifier::Mutable; | ||
441 | } | ||
442 | return h; | ||
443 | } | ||
438 | }, | 444 | }, |
439 | Definition::SelfType(_) => HighlightTag::SelfType, | 445 | Definition::SelfType(_) => HighlightTag::SelfType, |
440 | Definition::TypeParam(_) => HighlightTag::TypeParam, | 446 | Definition::TypeParam(_) => HighlightTag::TypeParam, |
diff --git a/crates/ra_ide/src/syntax_highlighting/tests.rs b/crates/ra_ide/src/syntax_highlighting/tests.rs index d2926ba78..13894869c 100644 --- a/crates/ra_ide/src/syntax_highlighting/tests.rs +++ b/crates/ra_ide/src/syntax_highlighting/tests.rs | |||
@@ -17,6 +17,8 @@ struct Foo { | |||
17 | pub y: i32, | 17 | pub y: i32, |
18 | } | 18 | } |
19 | 19 | ||
20 | static mut STATIC_MUT: i32 = 0; | ||
21 | |||
20 | fn foo<'a, T>() -> T { | 22 | fn foo<'a, T>() -> T { |
21 | foo::<'a, i32>() | 23 | foo::<'a, i32>() |
22 | } | 24 | } |
@@ -40,7 +42,10 @@ fn main() { | |||
40 | let x = 92; | 42 | let x = 92; |
41 | vec.push(Foo { x, y: 1 }); | 43 | vec.push(Foo { x, y: 1 }); |
42 | } | 44 | } |
43 | unsafe { vec.set_len(0); } | 45 | unsafe { |
46 | vec.set_len(0); | ||
47 | STATIC_MUT = 1; | ||
48 | } | ||
44 | 49 | ||
45 | let mut x = 42; | 50 | let mut x = 42; |
46 | let y = &mut x; | 51 | let y = &mut x; |