aboutsummaryrefslogtreecommitdiff
path: root/crates/ide/src/syntax_highlighting.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ide/src/syntax_highlighting.rs')
-rw-r--r--crates/ide/src/syntax_highlighting.rs101
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[]
54pub(crate) fn highlight( 148pub(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(),