diff options
Diffstat (limited to 'crates/ide/src/syntax_highlighting.rs')
-rw-r--r-- | crates/ide/src/syntax_highlighting.rs | 101 |
1 files changed, 99 insertions, 2 deletions
diff --git a/crates/ide/src/syntax_highlighting.rs b/crates/ide/src/syntax_highlighting.rs index 9df8d21af..79c2f4a1e 100644 --- a/crates/ide/src/syntax_highlighting.rs +++ b/crates/ide/src/syntax_highlighting.rs | |||
@@ -42,13 +42,107 @@ pub struct HlRange { | |||
42 | // Feature: Semantic Syntax Highlighting | 42 | // Feature: Semantic Syntax Highlighting |
43 | // | 43 | // |
44 | // rust-analyzer highlights the code semantically. | 44 | // rust-analyzer highlights the code semantically. |
45 | // For example, `bar` in `foo::Bar` might be colored differently depending on whether `Bar` is an enum or a trait. | 45 | // For example, `Bar` in `foo::Bar` might be colored differently depending on whether `Bar` is an enum or a trait. |
46 | // rust-analyzer does not specify colors directly, instead it assigns tag (like `struct`) and a set of modifiers (like `declaration`) to each token. | 46 | // rust-analyzer does not specify colors directly, instead it assigns a tag (like `struct`) and a set of modifiers (like `declaration`) to each token. |
47 | // It's up to the client to map those to specific colors. | 47 | // It's up to the client to map those to specific colors. |
48 | // | 48 | // |
49 | // The general rule is that a reference to an entity gets colored the same way as the entity itself. | 49 | // The general rule is that a reference to an entity gets colored the same way as the entity itself. |
50 | // We also give special modifier for `mut` and `&mut` local variables. | 50 | // We also give special modifier for `mut` and `&mut` local variables. |
51 | // | 51 | // |
52 | // | ||
53 | // .Token Tags | ||
54 | // | ||
55 | // Rust-analyzer currently emits the following token tags: | ||
56 | // | ||
57 | // - For items: | ||
58 | // + | ||
59 | // [horizontal] | ||
60 | // enum:: Emitted for enums. | ||
61 | // function:: Emitted for free-standing functions. | ||
62 | // macro:: Emitted for macros. | ||
63 | // method:: Emitted for associated functions, also knowns as methods. | ||
64 | // namespace:: Emitted for modules. | ||
65 | // struct:: Emitted for structs. | ||
66 | // trait:: Emitted for traits. | ||
67 | // typeAlias:: Emitted for type aliases and `Self` in `impl`s. | ||
68 | // union:: Emitted for unions. | ||
69 | // | ||
70 | // - For literals: | ||
71 | // + | ||
72 | // [horizontal] | ||
73 | // boolean:: Emitted for the boolean literals `true` and `false`. | ||
74 | // character:: Emitted for character literals. | ||
75 | // number:: Emitted for numeric literals. | ||
76 | // string:: Emitted for string literals. | ||
77 | // escapeSequence:: Emitted for escaped sequences inside strings like `\n`. | ||
78 | // formatSpecifier:: Emitted for format specifiers `{:?}` in `format!`-like macros. | ||
79 | // | ||
80 | // - For operators: | ||
81 | // + | ||
82 | // [horizontal] | ||
83 | // operator:: Emitted for general operators. | ||
84 | // arithmetic:: Emitted for the arithmetic operators `+`, `-`, `*`, `/`, `+=`, `-=`, `*=`, `/=`. | ||
85 | // bitwise:: Emitted for the bitwise operators `|`, `&`, `!`, `^`, `|=`, `&=`, `^=`. | ||
86 | // comparison:: Emitted for the comparison operators `>`, `<`, `==`, `>=`, `<=`, `!=`. | ||
87 | // logical:: Emitted for the logical operators `||`, `&&`, `!`. | ||
88 | // | ||
89 | // - For punctuation: | ||
90 | // + | ||
91 | // [horizontal] | ||
92 | // punctuation:: Emitted for general punctuation. | ||
93 | // angle:: Emitted for `<>` angle brackets. | ||
94 | // brace:: Emitted for `{}` braces. | ||
95 | // bracket:: Emitted for `[]` brackets. | ||
96 | // parenthesis:: Emitted for `()` parentheses. | ||
97 | // colon:: Emitted for the `:` token. | ||
98 | // comma:: Emitted for the `,` token. | ||
99 | // dot:: Emitted for the `.` token. | ||
100 | // Semi:: Emitted for the `;` token. | ||
101 | // | ||
102 | // //- | ||
103 | // | ||
104 | // [horizontal] | ||
105 | // attribute:: Emitted for attributes. | ||
106 | // builtinType:: Emitted for builtin types like `u32`, `str` and `f32`. | ||
107 | // comment:: Emitted for comments. | ||
108 | // constParameter:: Emitted for const parameters. | ||
109 | // enumMember:: Emitted for enum variants. | ||
110 | // generic:: Emitted for generic tokens that have no mapping. | ||
111 | // keyword:: Emitted for keywords. | ||
112 | // label:: Emitted for labels. | ||
113 | // lifetime:: Emitted for lifetimes. | ||
114 | // parameter:: Emitted for non-self function parameters. | ||
115 | // property:: Emitted for struct and union fields. | ||
116 | // selfKeyword:: Emitted for the self function parameter and self path-specifier. | ||
117 | // typeParameter:: Emitted for type parameters. | ||
118 | // unresolvedReference:: Emitted for unresolved references, names that rust-analyzer can't find the definition of. | ||
119 | // variable:: Emitted for locals, constants and statics. | ||
120 | // | ||
121 | // | ||
122 | // .Token Modifiers | ||
123 | // | ||
124 | // Token modifiers allow to style some elements in the source code more precisely. | ||
125 | // | ||
126 | // Rust-analyzer currently emits the following token modifiers: | ||
127 | // | ||
128 | // [horizontal] | ||
129 | // async:: Emitted for async functions and the `async` and `await` keywords. | ||
130 | // attribute:: Emitted for tokens inside attributes. | ||
131 | // callable:: Emitted for locals whose types implements one of the `Fn*` traits. | ||
132 | // constant:: Emitted for consts. | ||
133 | // consuming:: Emitted for locals that are being consumed when use in a function call. | ||
134 | // controlFlow:: Emitted for control-flow related tokens, this includes the `?` operator. | ||
135 | // declaration:: Emitted for names of definitions, like `foo` in `fn foo() {}`. | ||
136 | // documentation:: Emitted for documentation comments. | ||
137 | // injected:: Emitted for doc-string injected highlighting like rust source blocks in documentation. | ||
138 | // intraDocLink:: Emitted for intra doc links in doc-strings. | ||
139 | // library:: Emitted for items that are defined outside of the current crate. | ||
140 | // mutable:: Emitted for mutable locals and statics. | ||
141 | // static:: Emitted for "static" functions, also known as functions that do not take a `self` param, as well as statics and consts. | ||
142 | // trait:: Emitted for associated trait items. | ||
143 | // unsafe:: Emitted for unsafe operations, like unsafe function calls, as well as the `unsafe` token. | ||
144 | // | ||
145 | // | ||
52 | // image::https://user-images.githubusercontent.com/48062697/113164457-06cfb980-9239-11eb-819b-0f93e646acf8.png[] | 146 | // image::https://user-images.githubusercontent.com/48062697/113164457-06cfb980-9239-11eb-819b-0f93e646acf8.png[] |
53 | // image::https://user-images.githubusercontent.com/48062697/113187625-f7f50100-9250-11eb-825e-91c58f236071.png[] | 147 | // image::https://user-images.githubusercontent.com/48062697/113187625-f7f50100-9250-11eb-825e-91c58f236071.png[] |
54 | pub(crate) fn highlight( | 148 | pub(crate) fn highlight( |
@@ -80,6 +174,7 @@ pub(crate) fn highlight( | |||
80 | &mut hl, | 174 | &mut hl, |
81 | &sema, | 175 | &sema, |
82 | InFile::new(file_id.into(), &root), | 176 | InFile::new(file_id.into(), &root), |
177 | sema.scope(&root).krate(), | ||
83 | range_to_highlight, | 178 | range_to_highlight, |
84 | syntactic_name_ref_highlighting, | 179 | syntactic_name_ref_highlighting, |
85 | ); | 180 | ); |
@@ -90,6 +185,7 @@ fn traverse( | |||
90 | hl: &mut Highlights, | 185 | hl: &mut Highlights, |
91 | sema: &Semantics<RootDatabase>, | 186 | sema: &Semantics<RootDatabase>, |
92 | root: InFile<&SyntaxNode>, | 187 | root: InFile<&SyntaxNode>, |
188 | krate: Option<hir::Crate>, | ||
93 | range_to_highlight: TextRange, | 189 | range_to_highlight: TextRange, |
94 | syntactic_name_ref_highlighting: bool, | 190 | syntactic_name_ref_highlighting: bool, |
95 | ) { | 191 | ) { |
@@ -209,6 +305,7 @@ fn traverse( | |||
209 | 305 | ||
210 | if let Some((mut highlight, binding_hash)) = highlight::element( | 306 | if let Some((mut highlight, binding_hash)) = highlight::element( |
211 | &sema, | 307 | &sema, |
308 | krate, | ||
212 | &mut bindings_shadow_count, | 309 | &mut bindings_shadow_count, |
213 | syntactic_name_ref_highlighting, | 310 | syntactic_name_ref_highlighting, |
214 | element_to_highlight.clone(), | 311 | element_to_highlight.clone(), |