]> git.lizzy.rs Git - rust.git/commitdiff
Correctly flag 'lifetime definitions as definitions
authorAleksey Kladov <aleksey.kladov@gmail.com>
Fri, 28 Feb 2020 15:49:46 +0000 (16:49 +0100)
committerAleksey Kladov <aleksey.kladov@gmail.com>
Fri, 28 Feb 2020 15:53:12 +0000 (16:53 +0100)
crates/ra_ide/src/snapshots/highlighting.html
crates/ra_ide/src/snapshots/rainbow_highlighting.html
crates/ra_ide/src/syntax_highlighting.rs
crates/ra_ide/src/syntax_highlighting/html.rs
crates/ra_ide/src/syntax_highlighting/tags.rs
crates/ra_ide/src/syntax_highlighting/tests.rs

index cb4097e05f77f0b6222bc34f1dea762c619f424f..495b07f690e74deb917a52621f0a821312269aae 100644 (file)
@@ -3,7 +3,7 @@
 body                { margin: 0; }
 pre                 { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padding: 0.4em; }
 
-
+.lifetime           { color: #DFAF8F; font-style: italic; }
 .comment            { color: #7F9F7F; }
 .struct, .enum      { color: #7CB8BB; }
 .enum_variant       { color: #BDE0F3; }
@@ -27,14 +27,13 @@ pre                 { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
 .control            { font-style: italic; }
 </style>
 <pre><code><span class="attribute">#</span><span class="attribute">[</span><span class="attribute">derive</span><span class="attribute">(</span><span class="attribute">Clone</span><span class="attribute">,</span><span class="attribute"> </span><span class="attribute">Debug</span><span class="attribute">)</span><span class="attribute">]</span>
-<span class="keyword">struct</span> <span class="struct">Foo</span> {
-    <span class="keyword">pub</span> <span class="field">x</span>: <span class="builtin_type">i32</span>,
-    <span class="keyword">pub</span> <span class="field">y</span>: <span class="builtin_type">i32</span>,
+<span class="keyword">struct</span> <span class="struct declaration">Foo</span> {
+    <span class="keyword">pub</span> <span class="field declaration">x</span>: <span class="builtin_type">i32</span>,
+    <span class="keyword">pub</span> <span class="field declaration">y</span>: <span class="builtin_type">i32</span>,
 }
 
-<span class="keyword">fn</span> <span class="function">foo</span>&lt;<span class="type_param">T</span>&gt;() -&gt; <span class="type_param">T</span> {
-    <span class="macro">unimplemented</span><span class="macro">!</span>();
-    <span class="function">foo</span>::&lt;<span class="builtin_type">i32</span>&gt;();
+<span class="keyword">fn</span> <span class="function declaration">foo</span>&lt;<span class="lifetime declaration">'a</span>, <span class="type_param declaration">T</span>&gt;() -&gt; <span class="type_param">T</span> {
+    <span class="function">foo</span>::&lt;<span class="lifetime">'a</span>, <span class="builtin_type">i32</span>&gt;()
 }
 
 <span class="macro">macro_rules</span><span class="macro">!</span> def_fn {
@@ -42,40 +41,40 @@ pre                 { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
 }
 
 <span class="macro">def_fn</span><span class="macro">!</span> {
-    <span class="keyword">fn</span> <span class="function">bar</span>() -&gt; <span class="builtin_type">u32</span> {
+    <span class="keyword">fn</span> <span class="function declaration">bar</span>() -&gt; <span class="builtin_type">u32</span> {
         <span class="numeric_literal">100</span>
     }
 }
 
 <span class="comment">// comment</span>
-<span class="keyword">fn</span> <span class="function">main</span>() {
+<span class="keyword">fn</span> <span class="function declaration">main</span>() {
     <span class="macro">println</span><span class="macro">!</span>(<span class="string_literal">"Hello, {}!"</span>, <span class="numeric_literal">92</span>);
 
-    <span class="keyword">let</span> <span class="keyword">mut</span> <span class="variable mutable">vec</span> = Vec::new();
+    <span class="keyword">let</span> <span class="keyword">mut</span> <span class="variable declaration mutable">vec</span> = Vec::new();
     <span class="keyword control">if</span> <span class="keyword">true</span> {
-        <span class="keyword">let</span> <span class="variable">x</span> = <span class="numeric_literal">92</span>;
+        <span class="keyword">let</span> <span class="variable declaration">x</span> = <span class="numeric_literal">92</span>;
         <span class="variable mutable">vec</span>.push(<span class="struct">Foo</span> { <span class="field">x</span>, <span class="field">y</span>: <span class="numeric_literal">1</span> });
     }
     <span class="keyword unsafe">unsafe</span> { <span class="variable mutable">vec</span>.set_len(<span class="numeric_literal">0</span>); }
 
-    <span class="keyword">let</span> <span class="keyword">mut</span> <span class="variable mutable">x</span> = <span class="numeric_literal">42</span>;
-    <span class="keyword">let</span> <span class="variable mutable">y</span> = &<span class="keyword">mut</span> <span class="variable mutable">x</span>;
-    <span class="keyword">let</span> <span class="variable">z</span> = &<span class="variable mutable">y</span>;
+    <span class="keyword">let</span> <span class="keyword">mut</span> <span class="variable declaration mutable">x</span> = <span class="numeric_literal">42</span>;
+    <span class="keyword">let</span> <span class="variable declaration mutable">y</span> = &<span class="keyword">mut</span> <span class="variable mutable">x</span>;
+    <span class="keyword">let</span> <span class="variable declaration">z</span> = &<span class="variable mutable">y</span>;
 
     <span class="variable mutable">y</span>;
 }
 
-<span class="keyword">enum</span> <span class="enum">Option</span>&lt;<span class="type_param">T</span>&gt; {
-    <span class="enum_variant">Some</span>(<span class="type_param">T</span>),
-    <span class="enum_variant">None</span>,
+<span class="keyword">enum</span> <span class="enum declaration">Option</span>&lt;<span class="type_param declaration">T</span>&gt; {
+    <span class="enum_variant declaration">Some</span>(<span class="type_param">T</span>),
+    <span class="enum_variant declaration">None</span>,
 }
 <span class="keyword">use</span> <span class="enum">Option</span>::*;
 
-<span class="keyword">impl</span>&lt;<span class="type_param">T</span>&gt; <span class="enum">Option</span>&lt;<span class="type_param">T</span>&gt; {
-    <span class="keyword">fn</span> <span class="function">and</span>&lt;<span class="type_param">U</span>&gt;(<span class="keyword">self</span>, <span class="variable">other</span>: <span class="enum">Option</span>&lt;<span class="type_param">U</span>&gt;) -&gt; <span class="enum">Option</span>&lt;(<span class="type_param">T</span>, <span class="type_param">U</span>)&gt; {
+<span class="keyword">impl</span>&lt;<span class="type_param declaration">T</span>&gt; <span class="enum">Option</span>&lt;<span class="type_param">T</span>&gt; {
+    <span class="keyword">fn</span> <span class="function declaration">and</span>&lt;<span class="type_param declaration">U</span>&gt;(<span class="keyword">self</span>, <span class="variable declaration">other</span>: <span class="enum">Option</span>&lt;<span class="type_param">U</span>&gt;) -&gt; <span class="enum">Option</span>&lt;(<span class="type_param">T</span>, <span class="type_param">U</span>)&gt; {
         <span class="keyword control">match</span> <span class="variable">other</span> {
-            <span class="enum_variant">None</span> =&gt; <span class="macro">todo</span><span class="macro">!</span>(),
-            <span class="variable">Nope</span> =&gt; <span class="variable">Nope</span>,
+            <span class="enum_variant">None</span> =&gt; <span class="macro">unimplemented</span><span class="macro">!</span>(),
+            <span class="variable declaration">Nope</span> =&gt; <span class="variable">Nope</span>,
         }
     }
 }</code></pre>
\ No newline at end of file
index f63e64b6d1f7791ca19808e4d1b04628e5aaca10..dddbfc0dd69ab70cd6b5bd91b40abd6e812dcbb0 100644 (file)
@@ -3,7 +3,7 @@
 body                { margin: 0; }
 pre                 { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padding: 0.4em; }
 
-
+.lifetime           { color: #DFAF8F; font-style: italic; }
 .comment            { color: #7F9F7F; }
 .struct, .enum      { color: #7CB8BB; }
 .enum_variant       { color: #BDE0F3; }
@@ -26,15 +26,15 @@ pre                 { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
 .keyword.unsafe     { color: #BC8383; font-weight: bold; }
 .control            { font-style: italic; }
 </style>
-<pre><code><span class="keyword">fn</span> <span class="function">main</span>() {
-    <span class="keyword">let</span> <span class="variable" data-binding-hash="8121853618659664005" style="color: hsl(261,57%,61%);">hello</span> = <span class="string_literal">"hello"</span>;
-    <span class="keyword">let</span> <span class="variable" data-binding-hash="2705725358298919760" style="color: hsl(17,51%,74%);">x</span> = <span class="variable" data-binding-hash="8121853618659664005" style="color: hsl(261,57%,61%);">hello</span>.to_string();
-    <span class="keyword">let</span> <span class="variable" data-binding-hash="3365759661443752373" style="color: hsl(127,76%,66%);">y</span> = <span class="variable" data-binding-hash="8121853618659664005" style="color: hsl(261,57%,61%);">hello</span>.to_string();
+<pre><code><span class="keyword">fn</span> <span class="function declaration">main</span>() {
+    <span class="keyword">let</span> <span class="variable declaration" data-binding-hash="8121853618659664005" style="color: hsl(261,57%,61%);">hello</span> = <span class="string_literal">"hello"</span>;
+    <span class="keyword">let</span> <span class="variable declaration" data-binding-hash="2705725358298919760" style="color: hsl(17,51%,74%);">x</span> = <span class="variable" data-binding-hash="8121853618659664005" style="color: hsl(261,57%,61%);">hello</span>.to_string();
+    <span class="keyword">let</span> <span class="variable declaration" data-binding-hash="3365759661443752373" style="color: hsl(127,76%,66%);">y</span> = <span class="variable" data-binding-hash="8121853618659664005" style="color: hsl(261,57%,61%);">hello</span>.to_string();
 
-    <span class="keyword">let</span> <span class="variable" data-binding-hash="794745962933817518" style="color: hsl(19,74%,76%);">x</span> = <span class="string_literal">"other color please!"</span>;
-    <span class="keyword">let</span> <span class="variable" data-binding-hash="6717528807933952652" style="color: hsl(85,49%,84%);">y</span> = <span class="variable" data-binding-hash="794745962933817518" style="color: hsl(19,74%,76%);">x</span>.to_string();
+    <span class="keyword">let</span> <span class="variable declaration" data-binding-hash="794745962933817518" style="color: hsl(19,74%,76%);">x</span> = <span class="string_literal">"other color please!"</span>;
+    <span class="keyword">let</span> <span class="variable declaration" data-binding-hash="6717528807933952652" style="color: hsl(85,49%,84%);">y</span> = <span class="variable" data-binding-hash="794745962933817518" style="color: hsl(19,74%,76%);">x</span>.to_string();
 }
 
-<span class="keyword">fn</span> <span class="function">bar</span>() {
-    <span class="keyword">let</span> <span class="keyword">mut</span> <span class="variable mutable" data-binding-hash="8121853618659664005" style="color: hsl(261,57%,61%);">hello</span> = <span class="string_literal">"hello"</span>;
+<span class="keyword">fn</span> <span class="function declaration">bar</span>() {
+    <span class="keyword">let</span> <span class="keyword">mut</span> <span class="variable declaration mutable" data-binding-hash="8121853618659664005" style="color: hsl(261,57%,61%);">hello</span> = <span class="string_literal">"hello"</span>;
 }</code></pre>
\ No newline at end of file
index 6312bcb836c9659a89276fbfae40ad2103a5e96a..b94b6a0224d5a4588ed746e277a5a77d776d039b 100644 (file)
@@ -214,8 +214,13 @@ fn highlight_element(
         INT_NUMBER | FLOAT_NUMBER => HighlightTag::NumericLiteral.into(),
         BYTE => HighlightTag::ByteLiteral.into(),
         CHAR => HighlightTag::CharLiteral.into(),
-        // FIXME: set Declaration for decls
-        LIFETIME => HighlightTag::Lifetime.into(),
+        LIFETIME => {
+            let h = Highlight::new(HighlightTag::Lifetime);
+            dbg!(match element.parent().map(|it| it.kind()) {
+                Some(LIFETIME_PARAM) | Some(LABEL) => h | HighlightModifier::Definition,
+                _ => h,
+            })
+        }
 
         k if k.is_keyword() => {
             let h = Highlight::new(HighlightTag::Keyword);
index 54678c278dff547add2a5ac8c09744366bd64f48..e13766c9da437d55a47290c07e9cff0ea4c87a07 100644 (file)
@@ -80,7 +80,7 @@ fn html_escape(text: &str) -> String {
 body                { margin: 0; }
 pre                 { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padding: 0.4em; }
 
-
+.lifetime           { color: #DFAF8F; font-style: italic; }
 .comment            { color: #7F9F7F; }
 .struct, .enum      { color: #7CB8BB; }
 .enum_variant       { color: #BDE0F3; }
index 9da80823cc5d4f8106b257e2a5229537cf3ddc76..8835a5de214ff6d04e261db6b939e764fc60c2ab 100644 (file)
@@ -90,8 +90,12 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
 }
 
 impl HighlightModifier {
-    const ALL: &'static [HighlightModifier] =
-        &[HighlightModifier::Mutable, HighlightModifier::Unsafe, HighlightModifier::Control];
+    const ALL: &'static [HighlightModifier] = &[
+        HighlightModifier::Control,
+        HighlightModifier::Definition,
+        HighlightModifier::Mutable,
+        HighlightModifier::Unsafe,
+    ];
 
     fn as_str(self) -> &'static str {
         match self {
index 21c4dd81816e6453549363bfea4a7b065b47cf97..98c030791736800187c02d37dc17090613dc23a4 100644 (file)
@@ -17,9 +17,8 @@ struct Foo {
     pub y: i32,
 }
 
-fn foo<T>() -> T {
-    unimplemented!();
-    foo::<i32>();
+fn foo<'a, T>() -> T {
+    foo::<'a, i32>()
 }
 
 macro_rules! def_fn {
@@ -59,7 +58,7 @@ enum Option<T> {
 impl<T> Option<T> {
     fn and<U>(self, other: Option<U>) -> Option<(T, U)> {
         match other {
-            None => todo!(),
+            None => unimplemented!(),
             Nope => Nope,
         }
     }
@@ -130,5 +129,5 @@ struct Foo {
         .highlight_range(FileRange { file_id, range: TextRange::offset_len(82.into(), 1.into()) })
         .unwrap();
 
-    assert_eq!(&highlights[0].highlight.to_string(), "field");
+    assert_eq!(&highlights[0].highlight.to_string(), "field.declaration");
 }