diff options
Diffstat (limited to 'crates/ra_ide')
-rw-r--r-- | crates/ra_ide/src/completion/complete_dot.rs | 57 | ||||
-rw-r--r-- | crates/ra_ide/src/snapshots/highlighting.html | 6 | ||||
-rw-r--r-- | crates/ra_ide/src/snapshots/rainbow_highlighting.html | 6 | ||||
-rw-r--r-- | crates/ra_ide/src/syntax_highlighting.rs | 27 |
4 files changed, 79 insertions, 17 deletions
diff --git a/crates/ra_ide/src/completion/complete_dot.rs b/crates/ra_ide/src/completion/complete_dot.rs index 294964887..210a685e4 100644 --- a/crates/ra_ide/src/completion/complete_dot.rs +++ b/crates/ra_ide/src/completion/complete_dot.rs | |||
@@ -1,6 +1,6 @@ | |||
1 | //! FIXME: write short doc here | 1 | //! FIXME: write short doc here |
2 | 2 | ||
3 | use hir::Type; | 3 | use hir::{HasVisibility, Type}; |
4 | 4 | ||
5 | use crate::completion::completion_item::CompletionKind; | 5 | use crate::completion::completion_item::CompletionKind; |
6 | use crate::{ | 6 | use crate::{ |
@@ -38,9 +38,15 @@ pub(super) fn complete_dot(acc: &mut Completions, ctx: &CompletionContext) { | |||
38 | fn complete_fields(acc: &mut Completions, ctx: &CompletionContext, receiver: &Type) { | 38 | fn complete_fields(acc: &mut Completions, ctx: &CompletionContext, receiver: &Type) { |
39 | for receiver in receiver.autoderef(ctx.db) { | 39 | for receiver in receiver.autoderef(ctx.db) { |
40 | for (field, ty) in receiver.fields(ctx.db) { | 40 | for (field, ty) in receiver.fields(ctx.db) { |
41 | if ctx.module.map_or(false, |m| !field.is_visible_from(ctx.db, m)) { | ||
42 | // Skip private field. FIXME: If the definition location of the | ||
43 | // field is editable, we should show the completion | ||
44 | continue; | ||
45 | } | ||
41 | acc.add_field(ctx, field, &ty); | 46 | acc.add_field(ctx, field, &ty); |
42 | } | 47 | } |
43 | for (i, ty) in receiver.tuple_fields(ctx.db).into_iter().enumerate() { | 48 | for (i, ty) in receiver.tuple_fields(ctx.db).into_iter().enumerate() { |
49 | // FIXME: Handle visibility | ||
44 | acc.add_tuple_field(ctx, i, &ty); | 50 | acc.add_tuple_field(ctx, i, &ty); |
45 | } | 51 | } |
46 | } | 52 | } |
@@ -187,6 +193,55 @@ mod tests { | |||
187 | } | 193 | } |
188 | 194 | ||
189 | #[test] | 195 | #[test] |
196 | fn test_struct_field_visibility_private() { | ||
197 | assert_debug_snapshot!( | ||
198 | do_ref_completion( | ||
199 | r" | ||
200 | mod inner { | ||
201 | struct A { | ||
202 | private_field: u32, | ||
203 | pub pub_field: u32, | ||
204 | pub(crate) crate_field: u32, | ||
205 | pub(super) super_field: u32, | ||
206 | } | ||
207 | } | ||
208 | fn foo(a: inner::A) { | ||
209 | a.<|> | ||
210 | } | ||
211 | ", | ||
212 | ), | ||
213 | @r###" | ||
214 | [ | ||
215 | CompletionItem { | ||
216 | label: "crate_field", | ||
217 | source_range: [313; 313), | ||
218 | delete: [313; 313), | ||
219 | insert: "crate_field", | ||
220 | kind: Field, | ||
221 | detail: "u32", | ||
222 | }, | ||
223 | CompletionItem { | ||
224 | label: "pub_field", | ||
225 | source_range: [313; 313), | ||
226 | delete: [313; 313), | ||
227 | insert: "pub_field", | ||
228 | kind: Field, | ||
229 | detail: "u32", | ||
230 | }, | ||
231 | CompletionItem { | ||
232 | label: "super_field", | ||
233 | source_range: [313; 313), | ||
234 | delete: [313; 313), | ||
235 | insert: "super_field", | ||
236 | kind: Field, | ||
237 | detail: "u32", | ||
238 | }, | ||
239 | ] | ||
240 | "### | ||
241 | ); | ||
242 | } | ||
243 | |||
244 | #[test] | ||
190 | fn test_method_completion() { | 245 | fn test_method_completion() { |
191 | assert_debug_snapshot!( | 246 | assert_debug_snapshot!( |
192 | do_ref_completion( | 247 | do_ref_completion( |
diff --git a/crates/ra_ide/src/snapshots/highlighting.html b/crates/ra_ide/src/snapshots/highlighting.html index a097cf8e8..1d130544f 100644 --- a/crates/ra_ide/src/snapshots/highlighting.html +++ b/crates/ra_ide/src/snapshots/highlighting.html | |||
@@ -38,12 +38,12 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd | |||
38 | <span class="keyword">fn</span> <span class="function">main</span>() { | 38 | <span class="keyword">fn</span> <span class="function">main</span>() { |
39 | <span class="macro">println</span><span class="macro">!</span>(<span class="string">"Hello, {}!"</span>, <span class="literal.numeric">92</span>); | 39 | <span class="macro">println</span><span class="macro">!</span>(<span class="string">"Hello, {}!"</span>, <span class="literal.numeric">92</span>); |
40 | 40 | ||
41 | <span class="keyword">let</span> <span class="keyword">mut</span> <span class="variable.mut">vec</span> = <span class="text">Vec</span>::<span class="text">new</span>(); | 41 | <span class="keyword">let</span> <span class="keyword">mut</span> <span class="variable.mut">vec</span> = Vec::new(); |
42 | <span class="keyword.control">if</span> <span class="keyword">true</span> { | 42 | <span class="keyword.control">if</span> <span class="keyword">true</span> { |
43 | <span class="keyword">let</span> <span class="variable">x</span> = <span class="literal.numeric">92</span>; | 43 | <span class="keyword">let</span> <span class="variable">x</span> = <span class="literal.numeric">92</span>; |
44 | <span class="variable.mut">vec</span>.<span class="text">push</span>(<span class="type">Foo</span> { <span class="field">x</span>, <span class="field">y</span>: <span class="literal.numeric">1</span> }); | 44 | <span class="variable.mut">vec</span>.push(<span class="type">Foo</span> { <span class="field">x</span>, <span class="field">y</span>: <span class="literal.numeric">1</span> }); |
45 | } | 45 | } |
46 | <span class="keyword.unsafe">unsafe</span> { <span class="variable.mut">vec</span>.<span class="text">set_len</span>(<span class="literal.numeric">0</span>); } | 46 | <span class="keyword.unsafe">unsafe</span> { <span class="variable.mut">vec</span>.set_len(<span class="literal.numeric">0</span>); } |
47 | 47 | ||
48 | <span class="keyword">let</span> <span class="keyword">mut</span> <span class="variable.mut">x</span> = <span class="literal.numeric">42</span>; | 48 | <span class="keyword">let</span> <span class="keyword">mut</span> <span class="variable.mut">x</span> = <span class="literal.numeric">42</span>; |
49 | <span class="keyword">let</span> <span class="variable.mut">y</span> = &<span class="keyword">mut</span> <span class="variable.mut">x</span>; | 49 | <span class="keyword">let</span> <span class="variable.mut">y</span> = &<span class="keyword">mut</span> <span class="variable.mut">x</span>; |
diff --git a/crates/ra_ide/src/snapshots/rainbow_highlighting.html b/crates/ra_ide/src/snapshots/rainbow_highlighting.html index 110556c09..d90ee8540 100644 --- a/crates/ra_ide/src/snapshots/rainbow_highlighting.html +++ b/crates/ra_ide/src/snapshots/rainbow_highlighting.html | |||
@@ -25,11 +25,11 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd | |||
25 | </style> | 25 | </style> |
26 | <pre><code><span class="keyword">fn</span> <span class="function">main</span>() { | 26 | <pre><code><span class="keyword">fn</span> <span class="function">main</span>() { |
27 | <span class="keyword">let</span> <span class="variable" data-binding-hash="8723171760279909834" style="color: hsl(307,91%,75%);">hello</span> = <span class="string">"hello"</span>; | 27 | <span class="keyword">let</span> <span class="variable" data-binding-hash="8723171760279909834" style="color: hsl(307,91%,75%);">hello</span> = <span class="string">"hello"</span>; |
28 | <span class="keyword">let</span> <span class="variable" data-binding-hash="14702933417323009544" style="color: hsl(108,90%,49%);">x</span> = <span class="variable" data-binding-hash="8723171760279909834" style="color: hsl(307,91%,75%);">hello</span>.<span class="text">to_string</span>(); | 28 | <span class="keyword">let</span> <span class="variable" data-binding-hash="14702933417323009544" style="color: hsl(108,90%,49%);">x</span> = <span class="variable" data-binding-hash="8723171760279909834" style="color: hsl(307,91%,75%);">hello</span>.to_string(); |
29 | <span class="keyword">let</span> <span class="variable" data-binding-hash="5443150872754369068" style="color: hsl(215,43%,43%);">y</span> = <span class="variable" data-binding-hash="8723171760279909834" style="color: hsl(307,91%,75%);">hello</span>.<span class="text">to_string</span>(); | 29 | <span class="keyword">let</span> <span class="variable" data-binding-hash="5443150872754369068" style="color: hsl(215,43%,43%);">y</span> = <span class="variable" data-binding-hash="8723171760279909834" style="color: hsl(307,91%,75%);">hello</span>.to_string(); |
30 | 30 | ||
31 | <span class="keyword">let</span> <span class="variable" data-binding-hash="17358108296605513516" style="color: hsl(331,46%,60%);">x</span> = <span class="string">"other color please!"</span>; | 31 | <span class="keyword">let</span> <span class="variable" data-binding-hash="17358108296605513516" style="color: hsl(331,46%,60%);">x</span> = <span class="string">"other color please!"</span>; |
32 | <span class="keyword">let</span> <span class="variable" data-binding-hash="2073121142529774969" style="color: hsl(320,43%,74%);">y</span> = <span class="variable" data-binding-hash="17358108296605513516" style="color: hsl(331,46%,60%);">x</span>.<span class="text">to_string</span>(); | 32 | <span class="keyword">let</span> <span class="variable" data-binding-hash="2073121142529774969" style="color: hsl(320,43%,74%);">y</span> = <span class="variable" data-binding-hash="17358108296605513516" style="color: hsl(331,46%,60%);">x</span>.to_string(); |
33 | } | 33 | } |
34 | 34 | ||
35 | <span class="keyword">fn</span> <span class="function">bar</span>() { | 35 | <span class="keyword">fn</span> <span class="function">bar</span>() { |
diff --git a/crates/ra_ide/src/syntax_highlighting.rs b/crates/ra_ide/src/syntax_highlighting.rs index 0228ee7e9..56a36f587 100644 --- a/crates/ra_ide/src/syntax_highlighting.rs +++ b/crates/ra_ide/src/syntax_highlighting.rs | |||
@@ -20,13 +20,13 @@ pub mod tags { | |||
20 | pub(crate) const FIELD: &str = "field"; | 20 | pub(crate) const FIELD: &str = "field"; |
21 | pub(crate) const FUNCTION: &str = "function"; | 21 | pub(crate) const FUNCTION: &str = "function"; |
22 | pub(crate) const MODULE: &str = "module"; | 22 | pub(crate) const MODULE: &str = "module"; |
23 | pub(crate) const TYPE: &str = "type"; | ||
24 | pub(crate) const CONSTANT: &str = "constant"; | 23 | pub(crate) const CONSTANT: &str = "constant"; |
25 | pub(crate) const MACRO: &str = "macro"; | 24 | pub(crate) const MACRO: &str = "macro"; |
25 | |||
26 | pub(crate) const VARIABLE: &str = "variable"; | 26 | pub(crate) const VARIABLE: &str = "variable"; |
27 | pub(crate) const VARIABLE_MUT: &str = "variable.mut"; | 27 | pub(crate) const VARIABLE_MUT: &str = "variable.mut"; |
28 | pub(crate) const TEXT: &str = "text"; | ||
29 | 28 | ||
29 | pub(crate) const TYPE: &str = "type"; | ||
30 | pub(crate) const TYPE_BUILTIN: &str = "type.builtin"; | 30 | pub(crate) const TYPE_BUILTIN: &str = "type.builtin"; |
31 | pub(crate) const TYPE_SELF: &str = "type.self"; | 31 | pub(crate) const TYPE_SELF: &str = "type.self"; |
32 | pub(crate) const TYPE_PARAM: &str = "type.param"; | 32 | pub(crate) const TYPE_PARAM: &str = "type.param"; |
@@ -35,13 +35,14 @@ pub mod tags { | |||
35 | pub(crate) const LITERAL_BYTE: &str = "literal.byte"; | 35 | pub(crate) const LITERAL_BYTE: &str = "literal.byte"; |
36 | pub(crate) const LITERAL_NUMERIC: &str = "literal.numeric"; | 36 | pub(crate) const LITERAL_NUMERIC: &str = "literal.numeric"; |
37 | pub(crate) const LITERAL_CHAR: &str = "literal.char"; | 37 | pub(crate) const LITERAL_CHAR: &str = "literal.char"; |
38 | |||
38 | pub(crate) const LITERAL_COMMENT: &str = "comment"; | 39 | pub(crate) const LITERAL_COMMENT: &str = "comment"; |
39 | pub(crate) const LITERAL_STRING: &str = "string"; | 40 | pub(crate) const LITERAL_STRING: &str = "string"; |
40 | pub(crate) const LITERAL_ATTRIBUTE: &str = "attribute"; | 41 | pub(crate) const LITERAL_ATTRIBUTE: &str = "attribute"; |
41 | 42 | ||
43 | pub(crate) const KEYWORD: &str = "keyword"; | ||
42 | pub(crate) const KEYWORD_UNSAFE: &str = "keyword.unsafe"; | 44 | pub(crate) const KEYWORD_UNSAFE: &str = "keyword.unsafe"; |
43 | pub(crate) const KEYWORD_CONTROL: &str = "keyword.control"; | 45 | pub(crate) const KEYWORD_CONTROL: &str = "keyword.control"; |
44 | pub(crate) const KEYWORD: &str = "keyword"; | ||
45 | } | 46 | } |
46 | 47 | ||
47 | #[derive(Debug)] | 48 | #[derive(Debug)] |
@@ -109,15 +110,21 @@ pub(crate) fn highlight(db: &RootDatabase, file_id: FileId) -> Vec<HighlightedRa | |||
109 | let name_ref = node.as_node().cloned().and_then(ast::NameRef::cast).unwrap(); | 110 | let name_ref = node.as_node().cloned().and_then(ast::NameRef::cast).unwrap(); |
110 | let name_kind = | 111 | let name_kind = |
111 | classify_name_ref(db, InFile::new(file_id.into(), &name_ref)).map(|d| d.kind); | 112 | classify_name_ref(db, InFile::new(file_id.into(), &name_ref)).map(|d| d.kind); |
113 | match name_kind { | ||
114 | Some(name_kind) => { | ||
115 | if let Local(local) = &name_kind { | ||
116 | if let Some(name) = local.name(db) { | ||
117 | let shadow_count = | ||
118 | bindings_shadow_count.entry(name.clone()).or_default(); | ||
119 | binding_hash = | ||
120 | Some(calc_binding_hash(file_id, &name, *shadow_count)) | ||
121 | } | ||
122 | }; | ||
112 | 123 | ||
113 | if let Some(Local(local)) = &name_kind { | 124 | highlight_name(db, name_kind) |
114 | if let Some(name) = local.name(db) { | ||
115 | let shadow_count = bindings_shadow_count.entry(name.clone()).or_default(); | ||
116 | binding_hash = Some(calc_binding_hash(file_id, &name, *shadow_count)) | ||
117 | } | 125 | } |
118 | }; | 126 | _ => continue, |
119 | 127 | } | |
120 | name_kind.map_or(tags::TEXT, |it| highlight_name(db, it)) | ||
121 | } | 128 | } |
122 | NAME => { | 129 | NAME => { |
123 | let name = node.as_node().cloned().and_then(ast::Name::cast).unwrap(); | 130 | let name = node.as_node().cloned().and_then(ast::Name::cast).unwrap(); |