]> git.lizzy.rs Git - rust.git/commitdiff
Merge #5684
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>
Sat, 8 Aug 2020 16:45:37 +0000 (16:45 +0000)
committerGitHub <noreply@github.com>
Sat, 8 Aug 2020 16:45:37 +0000 (16:45 +0000)
5684: Semantic highlighting for unsafe union field access r=jonas-schievink a=Nashenas88

This change adds support for unions in inference and lowering, then extends on that to add the unsafe semantic modifier on field access only. The `is_possibly_unsafe` function in `syntax_highlighting.rs` could be extended to support fns and static muts so that their definitions are not highlighted as unsafe, but only their usage.

Also, each commit of this PR updates the tests. By reviewing the files by commit, it's easy to see how the changes in the code affected the tests.

Co-authored-by: Paul Daniel Faria <Nashenas88@users.noreply.github.com>
1  2 
crates/ra_ide/src/syntax_highlighting.rs
crates/ra_ide/src/syntax_highlighting/tests.rs
crates/ra_ide/test_data/highlight_unsafe.html

index b9b35802234e76982e3a94e8c30e5fdf7bc0ac8e,a09422da350745c41e225f1c683116e9ae44d25d..730efff0de1f891d04ea38e6c09918dda8222fa5
@@@ -281,16 -286,16 +286,22 @@@ impl HasUnsafeFn 
      unsafe fn unsafe_method(&self) {}
  }
  
 +struct TypeForStaticMut {
 +    a: u8
 +}
 +
 +static mut global_mut: TypeForStaticMut = TypeForStaticMut { a: 0 };
 +
  fn main() {
      let x = &5 as *const usize;
+     let u = Union { b: 0 };
      unsafe {
          unsafe_fn();
+         let b = u.b;
+         match u {
+             Union { b: 0 } => (),
+             Union { a } => (),
+         }
          HasUnsafeFn.unsafe_method();
          let y = *(x);
          let z = -x;
index 87d8c15568547db52256ca2138f4fe14a23ca5ce,cfc872832ae3d71a37a0b2dd874ad1dad93bad65..79409fe816b2cb8fefe4e47d2f9055f5d2cbfc11
@@@ -43,16 -48,16 +48,22 @@@ pre                 { color: #DCDCCC; b
      <span class="keyword unsafe">unsafe</span> <span class="keyword">fn</span> <span class="function declaration unsafe">unsafe_method</span><span class="punctuation">(</span><span class="operator">&</span><span class="self_keyword">self</span><span class="punctuation">)</span> <span class="punctuation">{</span><span class="punctuation">}</span>
  <span class="punctuation">}</span>
  
 +<span class="keyword">struct</span> <span class="struct declaration">TypeForStaticMut</span> <span class="punctuation">{</span>
 +    <span class="field declaration">a</span><span class="punctuation">:</span> <span class="builtin_type">u8</span>
 +<span class="punctuation">}</span>
 +
 +<span class="keyword">static</span> <span class="keyword">mut</span> <span class="static declaration mutable unsafe">global_mut</span><span class="punctuation">:</span> <span class="struct">TypeForStaticMut</span> <span class="operator">=</span> <span class="struct">TypeForStaticMut</span> <span class="punctuation">{</span> <span class="field">a</span><span class="punctuation">:</span> <span class="numeric_literal">0</span> <span class="punctuation">}</span><span class="punctuation">;</span>
 +
  <span class="keyword">fn</span> <span class="function declaration">main</span><span class="punctuation">(</span><span class="punctuation">)</span> <span class="punctuation">{</span>
      <span class="keyword">let</span> <span class="variable declaration">x</span> <span class="operator">=</span> <span class="operator">&</span><span class="numeric_literal">5</span> <span class="keyword">as</span> <span class="keyword">*</span><span class="keyword">const</span> <span class="builtin_type">usize</span><span class="punctuation">;</span>
+     <span class="keyword">let</span> <span class="variable declaration">u</span> <span class="operator">=</span> <span class="union">Union</span> <span class="punctuation">{</span> <span class="field">b</span><span class="punctuation">:</span> <span class="numeric_literal">0</span> <span class="punctuation">}</span><span class="punctuation">;</span>
      <span class="keyword unsafe">unsafe</span> <span class="punctuation">{</span>
          <span class="function unsafe">unsafe_fn</span><span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">;</span>
+         <span class="keyword">let</span> <span class="variable declaration">b</span> <span class="operator">=</span> <span class="variable">u</span><span class="punctuation">.</span><span class="field unsafe">b</span><span class="punctuation">;</span>
+         <span class="keyword control">match</span> <span class="variable">u</span> <span class="punctuation">{</span>
+             <span class="union">Union</span> <span class="punctuation">{</span> <span class="field unsafe">b</span><span class="punctuation">:</span> <span class="numeric_literal">0</span> <span class="punctuation">}</span> <span class="operator">=&gt;</span> <span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">,</span>
+             <span class="union">Union</span> <span class="punctuation">{</span> <span class="field unsafe">a</span> <span class="punctuation">}</span> <span class="operator">=&gt;</span> <span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">,</span>
+         <span class="punctuation">}</span>
          <span class="struct">HasUnsafeFn</span><span class="punctuation">.</span><span class="function unsafe">unsafe_method</span><span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">;</span>
          <span class="keyword">let</span> <span class="variable declaration">y</span> <span class="operator">=</span> <span class="operator unsafe">*</span><span class="punctuation">(</span><span class="variable">x</span><span class="punctuation">)</span><span class="punctuation">;</span>
          <span class="keyword">let</span> <span class="variable declaration">z</span> <span class="operator">=</span> <span class="numeric_literal">-</span><span class="variable">x</span><span class="punctuation">;</span>