Skip to content

Commit 351bba9

Browse files
committed
Add support for marking doctest items as distinct from normal code, add default tag to all doctest elements
1 parent 0c12c4f commit 351bba9

File tree

9 files changed

+47
-34
lines changed

9 files changed

+47
-34
lines changed

crates/ra_ide/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -443,13 +443,13 @@ impl Analysis {
443443

444444
/// Computes syntax highlighting for the given file
445445
pub fn highlight(&self, file_id: FileId) -> Cancelable<Vec<HighlightedRange>> {
446-
self.with_db(|db| syntax_highlighting::highlight(db, file_id, None, false))
446+
self.with_db(|db| syntax_highlighting::highlight(db, file_id, None, false, None))
447447
}
448448

449449
/// Computes syntax highlighting for the given file range.
450450
pub fn highlight_range(&self, frange: FileRange) -> Cancelable<Vec<HighlightedRange>> {
451451
self.with_db(|db| {
452-
syntax_highlighting::highlight(db, frange.file_id, Some(frange.range), false)
452+
syntax_highlighting::highlight(db, frange.file_id, Some(frange.range), false, None)
453453
})
454454
}
455455

crates/ra_ide/src/prime_caches.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ use crate::{FileId, RootDatabase};
77

88
pub(crate) fn prime_caches(db: &RootDatabase, files: Vec<FileId>) {
99
for file in files {
10-
let _ = crate::syntax_highlighting::highlight(db, file, None, false);
10+
let _ = crate::syntax_highlighting::highlight(db, file, None, false, None);
1111
}
1212
}

crates/ra_ide/src/snapshots/highlight_doctest.html

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,9 @@
4747
<span class="comment documentation">/// # Examples</span>
4848
<span class="comment documentation">///</span>
4949
<span class="comment documentation">/// ```</span>
50-
<span class="comment documentation">/// #</span> <span class="attribute">#![</span><span class="function attribute">allow</span><span class="attribute">(unused_mut)]</span>
51-
<span class="comment documentation">/// </span><span class="keyword">let</span> <span class="keyword">mut</span> <span class="variable declaration mutable">foo</span>: <span class="struct">Foo</span> = <span class="struct">Foo</span>::<span class="function">new</span>();
52-
<span class="comment documentation">/// ```</span>
50+
<span class="comment documentation">/// #</span> <span class="operator injected">#</span><span class="operator injected">!</span><span class="operator injected">[</span><span class="operator injected">allow</span><span class="operator injected">(</span><span class="operator injected">unused_mut</span><span class="operator injected">)</span><span class="operator injected">]</span><span class="operator injected">
51+
</span> <span class="comment documentation">/// </span><span class="keyword injected">let</span><span class="operator injected"> </span><span class="keyword injected">mut</span><span class="operator injected"> </span><span class="operator injected">foo</span><span class="operator injected">:</span><span class="operator injected"> </span><span class="operator injected">Foo</span><span class="operator injected"> </span><span class="operator injected">=</span><span class="operator injected"> </span><span class="operator injected">Foo</span><span class="operator injected">::</span><span class="operator injected">new</span><span class="operator injected">(</span><span class="operator injected">)</span><span class="operator injected">;</span><span class="operator injected">
52+
</span><span class="operator injected"> </span> <span class="comment documentation">/// ```</span>
5353
<span class="keyword">pub</span> <span class="keyword">const</span> <span class="keyword">fn</span> <span class="function declaration">new</span>() -&gt; <span class="struct">Foo</span> {
5454
<span class="struct">Foo</span> { <span class="field">bar</span>: <span class="bool_literal">true</span> }
5555
}
@@ -59,27 +59,27 @@
5959
<span class="comment documentation">/// # Examples</span>
6060
<span class="comment documentation">///</span>
6161
<span class="comment documentation">/// ```</span>
62-
<span class="comment documentation">/// </span><span class="keyword">use</span> <span class="module">x</span>::<span class="module">y</span>;
63-
<span class="comment documentation">///</span>
64-
<span class="comment documentation">/// </span><span class="keyword">let</span> <span class="variable declaration">foo</span> = <span class="struct">Foo</span>::<span class="function">new</span>();
65-
<span class="comment documentation">///</span>
66-
<span class="comment documentation">/// </span><span class="comment">// calls bar on foo</span>
67-
<span class="comment documentation">/// </span><span class="macro">assert!</span>(foo.bar());
68-
<span class="comment documentation">///</span>
69-
<span class="comment documentation">/// </span><span class="keyword">let</span> <span class="variable declaration">bar</span> = <span class="variable">foo</span>.<span class="field">bar</span> || <span class="struct">Foo</span>::<span class="constant">bar</span>;
70-
<span class="comment documentation">///</span>
71-
<span class="comment documentation">/// </span><span class="comment">/* multi-line
72-
</span><span class="comment documentation">/// </span><span class="comment"> comment */</span>
73-
<span class="comment documentation">///</span>
74-
<span class="comment documentation">/// </span><span class="keyword">let</span> <span class="variable declaration">multi_line_string</span> = <span class="string_literal">"Foo
75-
</span><span class="comment documentation">/// </span><span class="string_literal"> bar
76-
</span><span class="comment documentation">/// </span><span class="string_literal"> "</span>;
77-
<span class="comment documentation">///</span>
78-
<span class="comment documentation">/// ```</span>
62+
<span class="comment documentation">/// </span><span class="keyword injected">use</span><span class="operator injected"> </span><span class="operator injected">x</span><span class="operator injected">::</span><span class="operator injected">y</span><span class="operator injected">;</span><span class="operator injected">
63+
</span><span class="comment documentation">///</span><span class="operator injected">
64+
</span> <span class="comment documentation">/// </span><span class="keyword injected">let</span><span class="operator injected"> </span><span class="operator injected">foo</span><span class="operator injected"> </span><span class="operator injected">=</span><span class="operator injected"> </span><span class="operator injected">Foo</span><span class="operator injected">::</span><span class="operator injected">new</span><span class="operator injected">(</span><span class="operator injected">)</span><span class="operator injected">;</span><span class="operator injected">
65+
</span><span class="comment documentation">///</span><span class="operator injected">
66+
</span> <span class="comment documentation">/// </span><span class="comment injected">// calls bar on foo</span><span class="operator injected">
67+
</span> <span class="comment documentation">/// </span><span class="macro injected">assert!</span><span class="operator injected">(</span><span class="operator injected">foo</span><span class="operator injected">.</span><span class="operator injected">bar</span><span class="operator injected">(</span><span class="operator injected">)</span><span class="operator injected">)</span><span class="operator injected">;</span><span class="operator injected">
68+
</span><span class="comment documentation">///</span><span class="operator injected">
69+
</span> <span class="comment documentation">/// </span><span class="keyword injected">let</span><span class="operator injected"> </span><span class="operator injected">bar</span><span class="operator injected"> </span><span class="operator injected">=</span><span class="operator injected"> </span><span class="operator injected">foo</span><span class="operator injected">.</span><span class="operator injected">bar</span><span class="operator injected"> </span><span class="operator injected">||</span><span class="operator injected"> </span><span class="operator injected">Foo</span><span class="operator injected">::</span><span class="operator injected">bar</span><span class="operator injected">;</span><span class="operator injected">
70+
</span><span class="comment documentation">///</span><span class="operator injected">
71+
</span> <span class="comment documentation">/// </span><span class="comment injected">/* multi-line
72+
</span><span class="comment documentation">/// </span><span class="comment injected"> comment */</span><span class="operator injected">
73+
</span><span class="comment documentation">///</span><span class="operator injected">
74+
</span> <span class="comment documentation">/// </span><span class="keyword injected">let</span><span class="operator injected"> </span><span class="operator injected">multi_line_string</span><span class="operator injected"> </span><span class="operator injected">=</span><span class="operator injected"> </span><span class="string_literal injected">"Foo
75+
</span><span class="comment documentation">/// </span><span class="string_literal injected"> bar
76+
</span><span class="comment documentation">/// </span><span class="string_literal injected"> "</span><span class="operator injected">;</span><span class="operator injected">
77+
</span><span class="comment documentation">///</span><span class="operator injected">
78+
</span> <span class="comment documentation">/// ```</span>
7979
<span class="comment documentation">///</span>
8080
<span class="comment documentation">/// ```rust,no_run</span>
81-
<span class="comment documentation">/// </span><span class="keyword">let</span> <span class="variable declaration">foobar</span> = <span class="struct">Foo</span>::<span class="function">new</span>().<span class="function">bar</span>();
82-
<span class="comment documentation">/// ```</span>
81+
<span class="comment documentation">/// </span><span class="keyword injected">let</span><span class="operator injected"> </span><span class="operator injected">foobar</span><span class="operator injected"> </span><span class="operator injected">=</span><span class="operator injected"> </span><span class="operator injected">Foo</span><span class="operator injected">::</span><span class="operator injected">new</span><span class="operator injected">(</span><span class="operator injected">)</span><span class="operator injected">.</span><span class="operator injected">bar</span><span class="operator injected">(</span><span class="operator injected">)</span><span class="operator injected">;</span><span class="operator injected">
82+
</span><span class="operator injected"> </span> <span class="comment documentation">/// ```</span>
8383
<span class="comment documentation">///</span>
8484
<span class="comment documentation">/// ```sh</span>
8585
<span class="comment documentation">/// echo 1</span>

crates/ra_ide/src/syntax_highlighting.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ pub(crate) fn highlight(
4545
file_id: FileId,
4646
range_to_highlight: Option<TextRange>,
4747
syntactic_name_ref_highlighting: bool,
48+
default_tag: Option<HighlightTag>,
4849
) -> Vec<HighlightedRange> {
4950
let _p = profile("highlight");
5051
let sema = Semantics::new(db);
@@ -107,6 +108,7 @@ pub(crate) fn highlight(
107108
&mut bindings_shadow_count,
108109
syntactic_name_ref_highlighting,
109110
name.syntax().clone().into(),
111+
default_tag,
110112
) {
111113
stack.add(HighlightedRange {
112114
range: name.syntax().text_range(),
@@ -206,6 +208,7 @@ pub(crate) fn highlight(
206208
&mut bindings_shadow_count,
207209
syntactic_name_ref_highlighting,
208210
element_to_highlight.clone(),
211+
default_tag,
209212
) {
210213
stack.add(HighlightedRange { range, highlight, binding_hash });
211214
if let Some(string) =
@@ -430,13 +433,14 @@ fn highlight_element(
430433
bindings_shadow_count: &mut FxHashMap<Name, u32>,
431434
syntactic_name_ref_highlighting: bool,
432435
element: SyntaxElement,
436+
default_tag: Option<HighlightTag>,
433437
) -> Option<(Highlight, Option<u64>)> {
434438
let db = sema.db;
435439
let mut binding_hash = None;
436440
let highlight: Highlight = match element.kind() {
437441
FN_DEF => {
438442
bindings_shadow_count.clear();
439-
return None;
443+
default_tag?.into()
440444
}
441445

442446
// Highlight definitions depending on the "type" of the definition.
@@ -515,12 +519,12 @@ fn highlight_element(
515519
let expr = prefix_expr.expr()?;
516520
let ty = sema.type_of_expr(&expr)?;
517521
if !ty.is_raw_ptr() {
518-
return None;
522+
default_tag?.into()
523+
} else {
524+
let mut h = Highlight::new(HighlightTag::Operator);
525+
h |= HighlightModifier::Unsafe;
526+
h
519527
}
520-
521-
let mut h = Highlight::new(HighlightTag::Operator);
522-
h |= HighlightModifier::Unsafe;
523-
h
524528
}
525529
T![!] if element.parent().and_then(ast::MacroCall::cast).is_some() => {
526530
Highlight::new(HighlightTag::Macro)
@@ -546,7 +550,7 @@ fn highlight_element(
546550
}
547551
}
548552

549-
_ => return None,
553+
_ => default_tag?.into(),
550554
};
551555

552556
return Some((highlight, binding_hash));

crates/ra_ide/src/syntax_highlighting/html.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ pub(crate) fn highlight_as_html(db: &RootDatabase, file_id: FileId, rainbow: boo
1919
)
2020
}
2121

22-
let ranges = highlight(db, file_id, None, false);
22+
let ranges = highlight(db, file_id, None, false, None);
2323
let text = parse.tree().syntax().to_string();
2424
let mut prev_pos = TextSize::from(0);
2525
let mut buf = String::new();

crates/ra_ide/src/syntax_highlighting/injection.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,10 @@ pub(super) fn highlight_doc_comment(
150150
let (analysis, tmp_file_id) = Analysis::from_single_file(text);
151151

152152
stack.push();
153-
for mut h in analysis.with_db(|db| super::highlight(db, tmp_file_id, None, true)).unwrap() {
153+
for mut h in analysis
154+
.with_db(|db| super::highlight(db, tmp_file_id, None, true, Some(HighlightTag::Operator)))
155+
.unwrap()
156+
{
154157
// Determine start offset and end offset in case of multi-line ranges
155158
let mut start_offset = None;
156159
let mut end_offset = None;
@@ -172,6 +175,7 @@ pub(super) fn highlight_doc_comment(
172175
h.range.end() + end_offset.unwrap_or(start_offset) - h.range.start(),
173176
);
174177

178+
h.highlight |= HighlightModifier::Injected;
175179
stack.add(h);
176180
}
177181
}

crates/ra_ide/src/syntax_highlighting/tags.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ pub enum HighlightModifier {
5757
/// not.
5858
Definition,
5959
Documentation,
60+
Injected,
6061
Mutable,
6162
Unsafe,
6263
}
@@ -110,6 +111,7 @@ impl HighlightModifier {
110111
HighlightModifier::ControlFlow,
111112
HighlightModifier::Definition,
112113
HighlightModifier::Documentation,
114+
HighlightModifier::Injected,
113115
HighlightModifier::Mutable,
114116
HighlightModifier::Unsafe,
115117
];
@@ -120,6 +122,7 @@ impl HighlightModifier {
120122
HighlightModifier::ControlFlow => "control",
121123
HighlightModifier::Definition => "declaration",
122124
HighlightModifier::Documentation => "documentation",
125+
HighlightModifier::Injected => "injected",
123126
HighlightModifier::Mutable => "mutable",
124127
HighlightModifier::Unsafe => "unsafe",
125128
}

crates/rust-analyzer/src/semantic_tokens.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ macro_rules! define_semantic_token_modifiers {
6868
define_semantic_token_modifiers![
6969
(CONSTANT, "constant"),
7070
(CONTROL_FLOW, "controlFlow"),
71+
(INJECTED, "injected"),
7172
(MUTABLE, "mutable"),
7273
(UNSAFE, "unsafe"),
7374
(ATTRIBUTE_MODIFIER, "attribute"),

crates/rust-analyzer/src/to_proto.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,7 @@ fn semantic_token_type_and_modifiers(
331331
HighlightModifier::Attribute => semantic_tokens::ATTRIBUTE_MODIFIER,
332332
HighlightModifier::Definition => lsp_types::SemanticTokenModifier::DECLARATION,
333333
HighlightModifier::Documentation => lsp_types::SemanticTokenModifier::DOCUMENTATION,
334+
HighlightModifier::Injected => semantic_tokens::INJECTED,
334335
HighlightModifier::ControlFlow => semantic_tokens::CONTROL_FLOW,
335336
HighlightModifier::Mutable => semantic_tokens::MUTABLE,
336337
HighlightModifier::Unsafe => semantic_tokens::UNSAFE,

0 commit comments

Comments
 (0)