aboutsummaryrefslogtreecommitdiff
path: root/crates/ide/src/syntax_highlighting
diff options
context:
space:
mode:
authorLukas Wirth <[email protected]>2021-03-18 14:22:27 +0000
committerLukas Wirth <[email protected]>2021-03-18 21:32:07 +0000
commit8c0f454d115a5ce5fa4a9a0aa7116eac99a292f9 (patch)
treecda6b85e9f08457f016490c551158fc5b59d8cb6 /crates/ide/src/syntax_highlighting
parent5e82d3172282e159e539569b80b3135c17b972f0 (diff)
Use a highlight modifier for intra doc links
Diffstat (limited to 'crates/ide/src/syntax_highlighting')
-rw-r--r--crates/ide/src/syntax_highlighting/html.rs2
-rw-r--r--crates/ide/src/syntax_highlighting/inject.rs44
-rw-r--r--crates/ide/src/syntax_highlighting/tags.rs14
-rw-r--r--crates/ide/src/syntax_highlighting/test_data/highlight_assoc_functions.html2
-rw-r--r--crates/ide/src/syntax_highlighting/test_data/highlight_doctest.html6
-rw-r--r--crates/ide/src/syntax_highlighting/test_data/highlight_extern_crate.html2
-rw-r--r--crates/ide/src/syntax_highlighting/test_data/highlight_injection.html2
-rw-r--r--crates/ide/src/syntax_highlighting/test_data/highlight_strings.html2
-rw-r--r--crates/ide/src/syntax_highlighting/test_data/highlight_unsafe.html2
-rw-r--r--crates/ide/src/syntax_highlighting/test_data/highlighting.html2
-rw-r--r--crates/ide/src/syntax_highlighting/test_data/injection.html2
-rw-r--r--crates/ide/src/syntax_highlighting/test_data/rainbow_highlighting.html2
12 files changed, 53 insertions, 29 deletions
diff --git a/crates/ide/src/syntax_highlighting/html.rs b/crates/ide/src/syntax_highlighting/html.rs
index 1d34731ab..5327af845 100644
--- a/crates/ide/src/syntax_highlighting/html.rs
+++ b/crates/ide/src/syntax_highlighting/html.rs
@@ -59,7 +59,7 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
59.label { color: #DFAF8F; font-style: italic; } 59.label { color: #DFAF8F; font-style: italic; }
60.comment { color: #7F9F7F; } 60.comment { color: #7F9F7F; }
61.documentation { color: #629755; } 61.documentation { color: #629755; }
62.intra_doc_link { color: #A9C577; } 62.intra_doc_link { font-style: italic; }
63.injected { opacity: 0.65 ; } 63.injected { opacity: 0.65 ; }
64.struct, .enum { color: #7CB8BB; } 64.struct, .enum { color: #7CB8BB; }
65.enum_variant { color: #BDE0F3; } 65.enum_variant { color: #BDE0F3; }
diff --git a/crates/ide/src/syntax_highlighting/inject.rs b/crates/ide/src/syntax_highlighting/inject.rs
index e6dbd307e..f359eacf2 100644
--- a/crates/ide/src/syntax_highlighting/inject.rs
+++ b/crates/ide/src/syntax_highlighting/inject.rs
@@ -4,7 +4,7 @@ use std::{mem, ops::Range};
4 4
5use either::Either; 5use either::Either;
6use hir::{HasAttrs, InFile, Semantics}; 6use hir::{HasAttrs, InFile, Semantics};
7use ide_db::{call_info::ActiveParameter, defs::Definition}; 7use ide_db::{call_info::ActiveParameter, defs::Definition, SymbolKind};
8use syntax::{ 8use syntax::{
9 ast::{self, AstNode, AttrsOwner, DocCommentsOwner}, 9 ast::{self, AstNode, AttrsOwner, DocCommentsOwner},
10 match_ast, AstToken, NodeOrToken, SyntaxNode, SyntaxToken, TextRange, TextSize, 10 match_ast, AstToken, NodeOrToken, SyntaxNode, SyntaxToken, TextRange, TextSize,
@@ -225,13 +225,16 @@ pub(super) fn doc_comment(
225 intra_doc_links.extend( 225 intra_doc_links.extend(
226 extract_definitions_from_markdown(line) 226 extract_definitions_from_markdown(line)
227 .into_iter() 227 .into_iter()
228 .filter(|(link, ns, _)| { 228 .filter_map(|(link, ns, range)| {
229 validate_intra_doc_link(sema.db, &def, link, *ns) 229 validate_intra_doc_link(sema.db, &def, &link, ns).zip(Some(range))
230 }) 230 })
231 .map(|(.., Range { start, end })| { 231 .map(|(def, Range { start, end })| {
232 TextRange::at( 232 (
233 prev_range_start + TextSize::from(start as u32), 233 def,
234 TextSize::from((end - start) as u32), 234 TextRange::at(
235 prev_range_start + TextSize::from(start as u32),
236 TextSize::from((end - start) as u32),
237 ),
235 ) 238 )
236 }), 239 }),
237 ); 240 );
@@ -255,10 +258,13 @@ pub(super) fn doc_comment(
255 } 258 }
256 } 259 }
257 260
258 for range in intra_doc_links { 261 for (def, range) in intra_doc_links {
259 hl.add(HlRange { 262 hl.add(HlRange {
260 range, 263 range,
261 highlight: HlTag::IntraDocLink | HlMod::Documentation, 264 highlight: module_def_to_hl_tag(def)
265 | HlMod::Documentation
266 | HlMod::Injected
267 | HlMod::IntraDocLink,
262 binding_hash: None, 268 binding_hash: None,
263 }); 269 });
264 } 270 }
@@ -317,7 +323,7 @@ fn validate_intra_doc_link(
317 def: &Definition, 323 def: &Definition,
318 link: &str, 324 link: &str,
319 ns: Option<hir::Namespace>, 325 ns: Option<hir::Namespace>,
320) -> bool { 326) -> Option<hir::ModuleDef> {
321 match def { 327 match def {
322 Definition::ModuleDef(def) => match def { 328 Definition::ModuleDef(def) => match def {
323 hir::ModuleDef::Module(it) => it.resolve_doc_path(db, &link, ns), 329 hir::ModuleDef::Module(it) => it.resolve_doc_path(db, &link, ns),
@@ -337,5 +343,21 @@ fn validate_intra_doc_link(
337 | Definition::GenericParam(_) 343 | Definition::GenericParam(_)
338 | Definition::Label(_) => None, 344 | Definition::Label(_) => None,
339 } 345 }
340 .is_some() 346}
347
348fn module_def_to_hl_tag(def: hir::ModuleDef) -> HlTag {
349 let symbol = match def {
350 hir::ModuleDef::Module(_) => SymbolKind::Module,
351 hir::ModuleDef::Function(_) => SymbolKind::Function,
352 hir::ModuleDef::Adt(hir::Adt::Struct(_)) => SymbolKind::Struct,
353 hir::ModuleDef::Adt(hir::Adt::Enum(_)) => SymbolKind::Enum,
354 hir::ModuleDef::Adt(hir::Adt::Union(_)) => SymbolKind::Union,
355 hir::ModuleDef::Variant(_) => SymbolKind::Variant,
356 hir::ModuleDef::Const(_) => SymbolKind::Const,
357 hir::ModuleDef::Static(_) => SymbolKind::Static,
358 hir::ModuleDef::Trait(_) => SymbolKind::Trait,
359 hir::ModuleDef::TypeAlias(_) => SymbolKind::TypeAlias,
360 hir::ModuleDef::BuiltinType(_) => return HlTag::BuiltinType,
361 };
362 HlTag::Symbol(symbol)
341} 363}
diff --git a/crates/ide/src/syntax_highlighting/tags.rs b/crates/ide/src/syntax_highlighting/tags.rs
index ce46e5127..93db79b89 100644
--- a/crates/ide/src/syntax_highlighting/tags.rs
+++ b/crates/ide/src/syntax_highlighting/tags.rs
@@ -26,7 +26,6 @@ pub enum HlTag {
26 Comment, 26 Comment,
27 EscapeSequence, 27 EscapeSequence,
28 FormatSpecifier, 28 FormatSpecifier,
29 IntraDocLink,
30 Keyword, 29 Keyword,
31 NumericLiteral, 30 NumericLiteral,
32 Operator, 31 Operator,
@@ -57,6 +56,8 @@ pub enum HlMod {
57 Static, 56 Static,
58 /// Used for items in impls&traits. 57 /// Used for items in impls&traits.
59 Associated, 58 Associated,
59 /// Used for intra doc links in doc injection.
60 IntraDocLink,
60 61
61 /// Keep this last! 62 /// Keep this last!
62 Unsafe, 63 Unsafe,
@@ -117,7 +118,6 @@ impl HlTag {
117 HlTag::Comment => "comment", 118 HlTag::Comment => "comment",
118 HlTag::EscapeSequence => "escape_sequence", 119 HlTag::EscapeSequence => "escape_sequence",
119 HlTag::FormatSpecifier => "format_specifier", 120 HlTag::FormatSpecifier => "format_specifier",
120 HlTag::IntraDocLink => "intra_doc_link",
121 HlTag::Keyword => "keyword", 121 HlTag::Keyword => "keyword",
122 HlTag::Punctuation(punct) => match punct { 122 HlTag::Punctuation(punct) => match punct {
123 HlPunct::Bracket => "bracket", 123 HlPunct::Bracket => "bracket",
@@ -151,6 +151,7 @@ impl HlMod {
151 HlMod::ControlFlow, 151 HlMod::ControlFlow,
152 HlMod::Definition, 152 HlMod::Definition,
153 HlMod::Documentation, 153 HlMod::Documentation,
154 HlMod::IntraDocLink,
154 HlMod::Injected, 155 HlMod::Injected,
155 HlMod::Mutable, 156 HlMod::Mutable,
156 HlMod::Consuming, 157 HlMod::Consuming,
@@ -162,17 +163,18 @@ impl HlMod {
162 163
163 fn as_str(self) -> &'static str { 164 fn as_str(self) -> &'static str {
164 match self { 165 match self {
166 HlMod::Associated => "associated",
165 HlMod::Attribute => "attribute", 167 HlMod::Attribute => "attribute",
168 HlMod::Callable => "callable",
169 HlMod::Consuming => "consuming",
166 HlMod::ControlFlow => "control", 170 HlMod::ControlFlow => "control",
167 HlMod::Definition => "declaration", 171 HlMod::Definition => "declaration",
168 HlMod::Documentation => "documentation", 172 HlMod::Documentation => "documentation",
169 HlMod::Injected => "injected", 173 HlMod::Injected => "injected",
174 HlMod::IntraDocLink => "intra_doc_link",
170 HlMod::Mutable => "mutable", 175 HlMod::Mutable => "mutable",
171 HlMod::Consuming => "consuming",
172 HlMod::Unsafe => "unsafe",
173 HlMod::Callable => "callable",
174 HlMod::Static => "static", 176 HlMod::Static => "static",
175 HlMod::Associated => "associated", 177 HlMod::Unsafe => "unsafe",
176 } 178 }
177 } 179 }
178 180
diff --git a/crates/ide/src/syntax_highlighting/test_data/highlight_assoc_functions.html b/crates/ide/src/syntax_highlighting/test_data/highlight_assoc_functions.html
index 60c7518af..4635ea927 100644
--- a/crates/ide/src/syntax_highlighting/test_data/highlight_assoc_functions.html
+++ b/crates/ide/src/syntax_highlighting/test_data/highlight_assoc_functions.html
@@ -7,7 +7,7 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
7.label { color: #DFAF8F; font-style: italic; } 7.label { color: #DFAF8F; font-style: italic; }
8.comment { color: #7F9F7F; } 8.comment { color: #7F9F7F; }
9.documentation { color: #629755; } 9.documentation { color: #629755; }
10.intra_doc_link { color: #A9C577; } 10.intra_doc_link { font-style: italic; }
11.injected { opacity: 0.65 ; } 11.injected { opacity: 0.65 ; }
12.struct, .enum { color: #7CB8BB; } 12.struct, .enum { color: #7CB8BB; }
13.enum_variant { color: #BDE0F3; } 13.enum_variant { color: #BDE0F3; }
diff --git a/crates/ide/src/syntax_highlighting/test_data/highlight_doctest.html b/crates/ide/src/syntax_highlighting/test_data/highlight_doctest.html
index 5d802a647..045162eb8 100644
--- a/crates/ide/src/syntax_highlighting/test_data/highlight_doctest.html
+++ b/crates/ide/src/syntax_highlighting/test_data/highlight_doctest.html
@@ -7,7 +7,7 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
7.label { color: #DFAF8F; font-style: italic; } 7.label { color: #DFAF8F; font-style: italic; }
8.comment { color: #7F9F7F; } 8.comment { color: #7F9F7F; }
9.documentation { color: #629755; } 9.documentation { color: #629755; }
10.intra_doc_link { color: #A9C577; } 10.intra_doc_link { font-style: italic; }
11.injected { opacity: 0.65 ; } 11.injected { opacity: 0.65 ; }
12.struct, .enum { color: #7CB8BB; } 12.struct, .enum { color: #7CB8BB; }
13.enum_variant { color: #BDE0F3; } 13.enum_variant { color: #BDE0F3; }
@@ -99,8 +99,8 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
99 <span class="brace">}</span> 99 <span class="brace">}</span>
100<span class="brace">}</span> 100<span class="brace">}</span>
101 101
102<span class="comment documentation">/// </span><span class="intra_doc_link documentation">[`Foo`](Foo)</span><span class="comment documentation"> is a struct</span> 102<span class="comment documentation">/// </span><span class="struct documentation intra_doc_link injected">[`Foo`](Foo)</span><span class="comment documentation"> is a struct</span>
103<span class="comment documentation">/// </span><span class="intra_doc_link documentation">[`all_the_links`](all_the_links)</span><span class="comment documentation"> is this function</span> 103<span class="comment documentation">/// </span><span class="function documentation intra_doc_link injected">[`all_the_links`](all_the_links)</span><span class="comment documentation"> is this function</span>
104<span class="comment documentation">/// [`noop`](noop) is a macro below</span> 104<span class="comment documentation">/// [`noop`](noop) is a macro below</span>
105<span class="keyword">pub</span> <span class="keyword">fn</span> <span class="function declaration">all_the_links</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span><span class="brace">}</span> 105<span class="keyword">pub</span> <span class="keyword">fn</span> <span class="function declaration">all_the_links</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span><span class="brace">}</span>
106 106
diff --git a/crates/ide/src/syntax_highlighting/test_data/highlight_extern_crate.html b/crates/ide/src/syntax_highlighting/test_data/highlight_extern_crate.html
index 4e312765c..ca9bb1e7d 100644
--- a/crates/ide/src/syntax_highlighting/test_data/highlight_extern_crate.html
+++ b/crates/ide/src/syntax_highlighting/test_data/highlight_extern_crate.html
@@ -7,7 +7,7 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
7.label { color: #DFAF8F; font-style: italic; } 7.label { color: #DFAF8F; font-style: italic; }
8.comment { color: #7F9F7F; } 8.comment { color: #7F9F7F; }
9.documentation { color: #629755; } 9.documentation { color: #629755; }
10.intra_doc_link { color: #A9C577; } 10.intra_doc_link { font-style: italic; }
11.injected { opacity: 0.65 ; } 11.injected { opacity: 0.65 ; }
12.struct, .enum { color: #7CB8BB; } 12.struct, .enum { color: #7CB8BB; }
13.enum_variant { color: #BDE0F3; } 13.enum_variant { color: #BDE0F3; }
diff --git a/crates/ide/src/syntax_highlighting/test_data/highlight_injection.html b/crates/ide/src/syntax_highlighting/test_data/highlight_injection.html
index 57dfe7509..9215ddd9e 100644
--- a/crates/ide/src/syntax_highlighting/test_data/highlight_injection.html
+++ b/crates/ide/src/syntax_highlighting/test_data/highlight_injection.html
@@ -7,7 +7,7 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
7.label { color: #DFAF8F; font-style: italic; } 7.label { color: #DFAF8F; font-style: italic; }
8.comment { color: #7F9F7F; } 8.comment { color: #7F9F7F; }
9.documentation { color: #629755; } 9.documentation { color: #629755; }
10.intra_doc_link { color: #A9C577; } 10.intra_doc_link { font-style: italic; }
11.injected { opacity: 0.65 ; } 11.injected { opacity: 0.65 ; }
12.struct, .enum { color: #7CB8BB; } 12.struct, .enum { color: #7CB8BB; }
13.enum_variant { color: #BDE0F3; } 13.enum_variant { color: #BDE0F3; }
diff --git a/crates/ide/src/syntax_highlighting/test_data/highlight_strings.html b/crates/ide/src/syntax_highlighting/test_data/highlight_strings.html
index 75dbd0f14..e860d713e 100644
--- a/crates/ide/src/syntax_highlighting/test_data/highlight_strings.html
+++ b/crates/ide/src/syntax_highlighting/test_data/highlight_strings.html
@@ -7,7 +7,7 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
7.label { color: #DFAF8F; font-style: italic; } 7.label { color: #DFAF8F; font-style: italic; }
8.comment { color: #7F9F7F; } 8.comment { color: #7F9F7F; }
9.documentation { color: #629755; } 9.documentation { color: #629755; }
10.intra_doc_link { color: #A9C577; } 10.intra_doc_link { font-style: italic; }
11.injected { opacity: 0.65 ; } 11.injected { opacity: 0.65 ; }
12.struct, .enum { color: #7CB8BB; } 12.struct, .enum { color: #7CB8BB; }
13.enum_variant { color: #BDE0F3; } 13.enum_variant { color: #BDE0F3; }
diff --git a/crates/ide/src/syntax_highlighting/test_data/highlight_unsafe.html b/crates/ide/src/syntax_highlighting/test_data/highlight_unsafe.html
index 423256a20..6a6555208 100644
--- a/crates/ide/src/syntax_highlighting/test_data/highlight_unsafe.html
+++ b/crates/ide/src/syntax_highlighting/test_data/highlight_unsafe.html
@@ -7,7 +7,7 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
7.label { color: #DFAF8F; font-style: italic; } 7.label { color: #DFAF8F; font-style: italic; }
8.comment { color: #7F9F7F; } 8.comment { color: #7F9F7F; }
9.documentation { color: #629755; } 9.documentation { color: #629755; }
10.intra_doc_link { color: #A9C577; } 10.intra_doc_link { font-style: italic; }
11.injected { opacity: 0.65 ; } 11.injected { opacity: 0.65 ; }
12.struct, .enum { color: #7CB8BB; } 12.struct, .enum { color: #7CB8BB; }
13.enum_variant { color: #BDE0F3; } 13.enum_variant { color: #BDE0F3; }
diff --git a/crates/ide/src/syntax_highlighting/test_data/highlighting.html b/crates/ide/src/syntax_highlighting/test_data/highlighting.html
index fffe8c0f5..8b2dd3b70 100644
--- a/crates/ide/src/syntax_highlighting/test_data/highlighting.html
+++ b/crates/ide/src/syntax_highlighting/test_data/highlighting.html
@@ -7,7 +7,7 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
7.label { color: #DFAF8F; font-style: italic; } 7.label { color: #DFAF8F; font-style: italic; }
8.comment { color: #7F9F7F; } 8.comment { color: #7F9F7F; }
9.documentation { color: #629755; } 9.documentation { color: #629755; }
10.intra_doc_link { color: #A9C577; } 10.intra_doc_link { font-style: italic; }
11.injected { opacity: 0.65 ; } 11.injected { opacity: 0.65 ; }
12.struct, .enum { color: #7CB8BB; } 12.struct, .enum { color: #7CB8BB; }
13.enum_variant { color: #BDE0F3; } 13.enum_variant { color: #BDE0F3; }
diff --git a/crates/ide/src/syntax_highlighting/test_data/injection.html b/crates/ide/src/syntax_highlighting/test_data/injection.html
index 34d8deb68..9ab46d05c 100644
--- a/crates/ide/src/syntax_highlighting/test_data/injection.html
+++ b/crates/ide/src/syntax_highlighting/test_data/injection.html
@@ -7,7 +7,7 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
7.label { color: #DFAF8F; font-style: italic; } 7.label { color: #DFAF8F; font-style: italic; }
8.comment { color: #7F9F7F; } 8.comment { color: #7F9F7F; }
9.documentation { color: #629755; } 9.documentation { color: #629755; }
10.intra_doc_link { color: #A9C577; } 10.intra_doc_link { font-style: italic; }
11.injected { opacity: 0.65 ; } 11.injected { opacity: 0.65 ; }
12.struct, .enum { color: #7CB8BB; } 12.struct, .enum { color: #7CB8BB; }
13.enum_variant { color: #BDE0F3; } 13.enum_variant { color: #BDE0F3; }
diff --git a/crates/ide/src/syntax_highlighting/test_data/rainbow_highlighting.html b/crates/ide/src/syntax_highlighting/test_data/rainbow_highlighting.html
index d9ca3a4c4..666b0b228 100644
--- a/crates/ide/src/syntax_highlighting/test_data/rainbow_highlighting.html
+++ b/crates/ide/src/syntax_highlighting/test_data/rainbow_highlighting.html
@@ -7,7 +7,7 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
7.label { color: #DFAF8F; font-style: italic; } 7.label { color: #DFAF8F; font-style: italic; }
8.comment { color: #7F9F7F; } 8.comment { color: #7F9F7F; }
9.documentation { color: #629755; } 9.documentation { color: #629755; }
10.intra_doc_link { color: #A9C577; } 10.intra_doc_link { font-style: italic; }
11.injected { opacity: 0.65 ; } 11.injected { opacity: 0.65 ; }
12.struct, .enum { color: #7CB8BB; } 12.struct, .enum { color: #7CB8BB; }
13.enum_variant { color: #BDE0F3; } 13.enum_variant { color: #BDE0F3; }