Skip to content

Commit

Permalink
Syntax: Support dyn traits.
Browse files Browse the repository at this point in the history
  • Loading branch information
ehuss committed Jun 25, 2018
1 parent 7943659 commit 554a850
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 1 deletion.
2 changes: 2 additions & 0 deletions RustEnhanced.sublime-syntax
Original file line number Diff line number Diff line change
Expand Up @@ -411,6 +411,8 @@ contexts:
push: generic-angles
- match: \b(Self|{{int_suffixes}}|{{float_suffixes}}|bool|char|str)\b
scope: storage.type.rust
- match: '\bdyn\b(?!\s*::)(?=\s*(?:\(|''?{{identifier}}))'
scope: storage.type.trait.rust

generic-angles:
- meta_scope: meta.generic.rust
Expand Down
46 changes: 45 additions & 1 deletion syntax_test_rust.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ extern extern crate simd_rng_derive;*/
// This one is just to visually confirm the testing comments don't intefere
#[macro_use]
extern crate std_web;
/*#[macro_use]
/*#[macro_use]
extern extern crate simd_rng_derive;*/

let c = 'c';
Expand Down Expand Up @@ -1221,3 +1221,47 @@ pub union Foo<'a, Y: Baz>
// that we don't accidentally interpret it as a keyword.
fn union() {}
// ^^^^^ meta.function entity.name.function

// dyn trait
fn f(x: dyn T, y: Box<dyn T + 'static>, z: &dyn T,
// ^^^ meta.function.parameters storage.type.trait
// ^^^ meta.function.parameters meta.generic storage.type.trait
// ^^^ meta.function.parameters storage.type.trait
f: &dyn Fn(CrateNum) -> bool) -> dyn T {
// ^^^ meta.function.parameters storage.type.trait
// ^^^ meta.function.return-type storage.type.trait
let x: &(dyn 'static + Display) = &BYTE;
// ^^^ meta.group storage.type.trait
let y: Box<dyn Display + 'static> = Box::new(BYTE);
// ^^^ meta.generic storage.type.trait
let _: &dyn (Display) = &BYTE;
// ^^^ storage.type.trait
let _: &dyn (::std::fmt::Display) = &BYTE;
// ^^^ storage.type.trait
const DT: &'static dyn C = &V;
// ^^^ storage.type.trait
struct S {
f: dyn T
// ^^^ meta.struct storage.type.trait
}
type D4 = dyn (::module::Trait);
// ^^^ storage.type.trait
}

// dyn is not a keyword in all situations (a "weak" keyword).
type A0 = dyn;
// ^^^ -storage.type.trait
type A1 = dyn::dyn;
// ^^^^^ meta.path -storage.type.trait
// ^^^ -storage.type.trait
type A2 = dyn<dyn, dyn>;
// ^^^ meta.generic -storage.type.trait
// ^^^ meta.generic -storage.type.trait
// ^^^ meta.generic -storage.type.trait
// This is incorrect. `identifier` should not match on the keyword `as`.
// However, avoiding keywords is a little complicated and slow.
type A3 = dyn<<dyn as dyn>::dyn>;
// ^^^ meta.generic -storage.type.trait
// ^^^ meta.generic storage.type.trait
// ^^^ meta.generic -storage.type.trait
// ^^^ meta.generic -storage.type.trait

0 comments on commit 554a850

Please sign in to comment.