Skip to content

Commit 77607ab

Browse files
committed
More precise highlighting rules for constant modifier
1 parent 640c8b7 commit 77607ab

22 files changed

+87
-6
lines changed

crates/ide/src/syntax_highlighting/highlight.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,23 @@ fn keyword(
178178
T![do] | T![yeet] if parent_matches::<ast::YeetExpr>(&token) => h | HlMod::ControlFlow,
179179
T![for] if parent_matches::<ast::ForExpr>(&token) => h | HlMod::ControlFlow,
180180
T![unsafe] => h | HlMod::Unsafe,
181-
T![const] if !parent_matches::<ast::PtrType>(&token) => h | HlMod::Const,
181+
T![const]
182+
if token.parent().map_or(false, |it| {
183+
matches!(
184+
it.kind(),
185+
SyntaxKind::CONST
186+
| SyntaxKind::FN
187+
| SyntaxKind::IMPL
188+
| SyntaxKind::BLOCK_EXPR
189+
| SyntaxKind::CLOSURE_EXPR
190+
| SyntaxKind::FN_PTR_TYPE
191+
| SyntaxKind::TYPE_BOUND
192+
| SyntaxKind::CONST_BLOCK_PAT
193+
)
194+
}) =>
195+
{
196+
h | HlMod::Const
197+
}
182198
T![true] | T![false] => HlTag::BoolLiteral.into(),
183199
// crate is handled just as a token if it's in an `extern crate`
184200
T![crate] if parent_matches::<ast::ExternCrate>(&token) => h,

crates/ide/src/syntax_highlighting/html.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
109109
.keyword { color: #F0DFAF; font-weight: bold; }
110110
.control { font-style: italic; }
111111
.reference { font-style: italic; font-weight: bold; }
112+
.const { font-weight: bolder; }
112113
113114
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
114115
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }

crates/ide/src/syntax_highlighting/test_data/highlight_assoc_functions.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
.keyword { color: #F0DFAF; font-weight: bold; }
4141
.control { font-style: italic; }
4242
.reference { font-style: italic; font-weight: bold; }
43+
.const { font-weight: bolder; }
4344

4445
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
4546
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }

crates/ide/src/syntax_highlighting/test_data/highlight_attributes.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
.keyword { color: #F0DFAF; font-weight: bold; }
4141
.control { font-style: italic; }
4242
.reference { font-style: italic; font-weight: bold; }
43+
.const { font-weight: bolder; }
4344

4445
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
4546
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }

crates/ide/src/syntax_highlighting/test_data/highlight_block_mod_items.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
.keyword { color: #F0DFAF; font-weight: bold; }
4141
.control { font-style: italic; }
4242
.reference { font-style: italic; font-weight: bold; }
43+
.const { font-weight: bolder; }
4344

4445
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
4546
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
@@ -58,7 +59,7 @@
5859
<span class="unresolved_reference">foo</span><span class="macro_bang">!</span><span class="parenthesis macro">(</span><span class="none macro">Bar</span><span class="parenthesis macro">)</span><span class="semicolon">;</span>
5960
<span class="keyword">fn</span> <span class="function declaration">func</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span>
6061
<span class="keyword">mod</span> <span class="module declaration">inner</span> <span class="brace">{</span>
61-
<span class="keyword">struct</span> <span class="struct declaration">Innerest</span><span class="angle">&lt;</span><span class="keyword const">const</span> <span class="const_param const declaration">C</span><span class="colon">:</span> <span class="unresolved_reference">usize</span><span class="angle">&gt;</span> <span class="brace">{</span> <span class="field declaration">field</span><span class="colon">:</span> <span class="bracket">[</span><span class="parenthesis">(</span><span class="parenthesis">)</span><span class="semicolon">;</span> <span class="brace">{</span><span class="const_param const">C</span><span class="brace">}</span><span class="bracket">]</span> <span class="brace">}</span>
62+
<span class="keyword">struct</span> <span class="struct declaration">Innerest</span><span class="angle">&lt;</span><span class="keyword">const</span> <span class="const_param const declaration">C</span><span class="colon">:</span> <span class="unresolved_reference">usize</span><span class="angle">&gt;</span> <span class="brace">{</span> <span class="field declaration">field</span><span class="colon">:</span> <span class="bracket">[</span><span class="parenthesis">(</span><span class="parenthesis">)</span><span class="semicolon">;</span> <span class="brace">{</span><span class="const_param const">C</span><span class="brace">}</span><span class="bracket">]</span> <span class="brace">}</span>
6263
<span class="brace">}</span>
6364
<span class="brace">}</span>
6465
<span class="brace">}</span>

crates/ide/src/syntax_highlighting/test_data/highlight_crate_root.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
.keyword { color: #F0DFAF; font-weight: bold; }
4141
.control { font-style: italic; }
4242
.reference { font-style: italic; font-weight: bold; }
43+
.const { font-weight: bolder; }
4344

4445
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
4546
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }

crates/ide/src/syntax_highlighting/test_data/highlight_default_library.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
.keyword { color: #F0DFAF; font-weight: bold; }
4141
.control { font-style: italic; }
4242
.reference { font-style: italic; font-weight: bold; }
43+
.const { font-weight: bolder; }
4344

4445
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
4546
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }

crates/ide/src/syntax_highlighting/test_data/highlight_doctest.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
.keyword { color: #F0DFAF; font-weight: bold; }
4141
.control { font-style: italic; }
4242
.reference { font-style: italic; font-weight: bold; }
43+
.const { font-weight: bolder; }
4344

4445
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
4546
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
@@ -119,7 +120,7 @@
119120
<span class="comment documentation">///</span>
120121
<span class="comment documentation">/// ```</span>
121122
<span class="comment documentation">///</span><span class="comment documentation"> </span><span class="comment injected">// functions</span>
122-
<span class="comment documentation">///</span><span class="comment documentation"> </span><span class="keyword injected">fn</span><span class="none injected"> </span><span class="function declaration injected">foo</span><span class="angle injected">&lt;</span><span class="type_param declaration injected">T</span><span class="comma injected">,</span><span class="none injected"> </span><span class="keyword const injected">const</span><span class="none injected"> </span><span class="const_param const declaration injected">X</span><span class="colon injected">:</span><span class="none injected"> </span><span class="builtin_type injected">usize</span><span class="angle injected">&gt;</span><span class="parenthesis injected">(</span><span class="value_param declaration injected">arg</span><span class="colon injected">:</span><span class="none injected"> </span><span class="builtin_type injected">i32</span><span class="parenthesis injected">)</span><span class="none injected"> </span><span class="brace injected">{</span>
123+
<span class="comment documentation">///</span><span class="comment documentation"> </span><span class="keyword injected">fn</span><span class="none injected"> </span><span class="function declaration injected">foo</span><span class="angle injected">&lt;</span><span class="type_param declaration injected">T</span><span class="comma injected">,</span><span class="none injected"> </span><span class="keyword injected">const</span><span class="none injected"> </span><span class="const_param const declaration injected">X</span><span class="colon injected">:</span><span class="none injected"> </span><span class="builtin_type injected">usize</span><span class="angle injected">&gt;</span><span class="parenthesis injected">(</span><span class="value_param declaration injected">arg</span><span class="colon injected">:</span><span class="none injected"> </span><span class="builtin_type injected">i32</span><span class="parenthesis injected">)</span><span class="none injected"> </span><span class="brace injected">{</span>
123124
<span class="comment documentation">///</span><span class="comment documentation"> </span><span class="none injected"> </span><span class="keyword injected">let</span><span class="none injected"> </span><span class="variable declaration injected">x</span><span class="colon injected">:</span><span class="none injected"> </span><span class="type_param injected">T</span><span class="none injected"> </span><span class="operator injected">=</span><span class="none injected"> </span><span class="const_param const injected">X</span><span class="semicolon injected">;</span>
124125
<span class="comment documentation">///</span><span class="comment documentation"> </span><span class="brace injected">}</span>
125126
<span class="comment documentation">/// ```</span>

crates/ide/src/syntax_highlighting/test_data/highlight_extern_crate.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
.keyword { color: #F0DFAF; font-weight: bold; }
4141
.control { font-style: italic; }
4242
.reference { font-style: italic; font-weight: bold; }
43+
.const { font-weight: bolder; }
4344

4445
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
4546
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }

crates/ide/src/syntax_highlighting/test_data/highlight_general.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
.keyword { color: #F0DFAF; font-weight: bold; }
4141
.control { font-style: italic; }
4242
.reference { font-style: italic; font-weight: bold; }
43+
.const { font-weight: bolder; }
4344

4445
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
4546
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
@@ -119,7 +120,7 @@
119120
<span class="keyword control">loop</span> <span class="brace">{</span><span class="brace">}</span>
120121
<span class="brace">}</span>
121122

122-
<span class="keyword">fn</span> <span class="function declaration">const_param</span><span class="angle">&lt;</span><span class="keyword const">const</span> <span class="const_param const declaration">FOO</span><span class="colon">:</span> <span class="builtin_type">usize</span><span class="angle">&gt;</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="operator">-&gt;</span> <span class="builtin_type">usize</span> <span class="brace">{</span>
123+
<span class="keyword">fn</span> <span class="function declaration">const_param</span><span class="angle">&lt;</span><span class="keyword">const</span> <span class="const_param const declaration">FOO</span><span class="colon">:</span> <span class="builtin_type">usize</span><span class="angle">&gt;</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="operator">-&gt;</span> <span class="builtin_type">usize</span> <span class="brace">{</span>
123124
<span class="function">const_param</span><span class="operator">::</span><span class="angle">&lt;</span><span class="brace">{</span> <span class="const_param const">FOO</span> <span class="brace">}</span><span class="angle">&gt;</span><span class="parenthesis">(</span><span class="parenthesis">)</span><span class="semicolon">;</span>
124125
<span class="const_param const">FOO</span>
125126
<span class="brace">}</span>

crates/ide/src/syntax_highlighting/test_data/highlight_injection.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
.keyword { color: #F0DFAF; font-weight: bold; }
4141
.control { font-style: italic; }
4242
.reference { font-style: italic; font-weight: bold; }
43+
.const { font-weight: bolder; }
4344

4445
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
4546
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }

crates/ide/src/syntax_highlighting/test_data/highlight_keywords.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
.keyword { color: #F0DFAF; font-weight: bold; }
4141
.control { font-style: italic; }
4242
.reference { font-style: italic; font-weight: bold; }
43+
.const { font-weight: bolder; }
4344

4445
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
4546
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }

crates/ide/src/syntax_highlighting/test_data/highlight_lifetimes.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
.keyword { color: #F0DFAF; font-weight: bold; }
4141
.control { font-style: italic; }
4242
.reference { font-style: italic; font-weight: bold; }
43+
.const { font-weight: bolder; }
4344

4445
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
4546
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }

crates/ide/src/syntax_highlighting/test_data/highlight_macros.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
.keyword { color: #F0DFAF; font-weight: bold; }
4141
.control { font-style: italic; }
4242
.reference { font-style: italic; font-weight: bold; }
43+
.const { font-weight: bolder; }
4344

4445
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
4546
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }

crates/ide/src/syntax_highlighting/test_data/highlight_module_docs_inline.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
.keyword { color: #F0DFAF; font-weight: bold; }
4141
.control { font-style: italic; }
4242
.reference { font-style: italic; font-weight: bold; }
43+
.const { font-weight: bolder; }
4344

4445
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
4546
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }

crates/ide/src/syntax_highlighting/test_data/highlight_module_docs_outline.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
.keyword { color: #F0DFAF; font-weight: bold; }
4141
.control { font-style: italic; }
4242
.reference { font-style: italic; font-weight: bold; }
43+
.const { font-weight: bolder; }
4344

4445
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
4546
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }

crates/ide/src/syntax_highlighting/test_data/highlight_operators.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
.keyword { color: #F0DFAF; font-weight: bold; }
4141
.control { font-style: italic; }
4242
.reference { font-style: italic; font-weight: bold; }
43+
.const { font-weight: bolder; }
4344

4445
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
4546
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }

crates/ide/src/syntax_highlighting/test_data/highlight_rainbow.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
.keyword { color: #F0DFAF; font-weight: bold; }
4141
.control { font-style: italic; }
4242
.reference { font-style: italic; font-weight: bold; }
43+
.const { font-weight: bolder; }
4344

4445
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
4546
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }

crates/ide/src/syntax_highlighting/test_data/highlight_strings.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
.keyword { color: #F0DFAF; font-weight: bold; }
4141
.control { font-style: italic; }
4242
.reference { font-style: italic; font-weight: bold; }
43+
.const { font-weight: bolder; }
4344

4445
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
4546
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }

crates/ide/src/syntax_highlighting/test_data/highlight_unsafe.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
.keyword { color: #F0DFAF; font-weight: bold; }
4141
.control { font-style: italic; }
4242
.reference { font-style: italic; font-weight: bold; }
43+
.const { font-weight: bolder; }
4344

4445
.invalid_escape_sequence { color: #FC5555; text-decoration: wavy underline; }
4546
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
@@ -51,7 +52,7 @@
5152
<span class="brace">}</span>
5253
<span class="keyword">macro_rules</span><span class="macro_bang">!</span> <span class="macro declaration">unsafe_deref</span> <span class="brace">{</span>
5354
<span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="operator">=</span><span class="angle">&gt;</span> <span class="brace">{</span>
54-
<span class="punctuation">*</span><span class="parenthesis">(</span><span class="punctuation">&</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="keyword">as</span> <span class="punctuation">*</span><span class="keyword const">const</span> <span class="parenthesis">(</span><span class="parenthesis">)</span><span class="parenthesis">)</span>
55+
<span class="punctuation">*</span><span class="parenthesis">(</span><span class="punctuation">&</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="keyword">as</span> <span class="punctuation">*</span><span class="keyword">const</span> <span class="parenthesis">(</span><span class="parenthesis">)</span><span class="parenthesis">)</span>
5556
<span class="brace">}</span><span class="semicolon">;</span>
5657
<span class="brace">}</span>
5758
<span class="keyword">static</span> <span class="keyword">mut</span> <span class="static declaration mutable unsafe">MUT_GLOBAL</span><span class="colon">:</span> <span class="struct">Struct</span> <span class="operator">=</span> <span class="struct">Struct</span> <span class="brace">{</span> <span class="field">field</span><span class="colon">:</span> <span class="numeric_literal">0</span> <span class="brace">}</span><span class="semicolon">;</span>

crates/ide/src/syntax_highlighting/tests.rs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -629,6 +629,52 @@ fn main() {
629629
);
630630
}
631631

632+
#[test]
633+
fn test_const_highlighting() {
634+
check_highlighting(
635+
r#"
636+
macro_rules! id {
637+
($($tt:tt)*) => {
638+
$($tt)*
639+
};
640+
}
641+
const CONST_ITEM: *const () = &raw const ();
642+
const fn const_fn<const CONST_PARAM: ()>(const {}: const fn()) where (): const ConstTrait {
643+
CONST_ITEM;
644+
CONST_PARAM;
645+
const {
646+
const || {}
647+
}
648+
id!(
649+
CONST_ITEM;
650+
CONST_PARAM;
651+
const {
652+
const || {}
653+
};
654+
&raw const ();
655+
const
656+
);
657+
}
658+
trait ConstTrait {
659+
const ASSOC_CONST: () = ();
660+
const fn assoc_const_fn() {}
661+
}
662+
impl const ConstTrait for () {
663+
const ASSOC_CONST: () = ();
664+
const fn assoc_const_fn() {}
665+
}
666+
667+
macro_rules! unsafe_deref {
668+
() => {
669+
*(&() as *const ())
670+
};
671+
}
672+
"#,
673+
expect_file!["./test_data/highlight_const.html"],
674+
false,
675+
);
676+
}
677+
632678
#[test]
633679
fn test_highlight_doc_comment() {
634680
check_highlighting(

crates/syntax/rust.ungram

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,7 @@ StmtList =
414414
'}'
415415

416416
RefExpr =
417-
Attr* '&' ('raw' | 'mut' | 'const') Expr
417+
Attr* '&' (('raw' 'const'?)| ('raw'? 'mut') ) Expr
418418

419419
TryExpr =
420420
Attr* Expr '?'

0 commit comments

Comments
 (0)