From b01b50bf0baed6eed6f1ba503175e206770908b5 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Sun, 24 Jun 2018 17:49:02 -0700 Subject: [PATCH] Syntax: Support `dyn` traits. cc #284 --- RustEnhanced.sublime-syntax | 2 ++ syntax_test_rust.rs | 44 +++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/RustEnhanced.sublime-syntax b/RustEnhanced.sublime-syntax index b403abf6..2f623607 100644 --- a/RustEnhanced.sublime-syntax +++ b/RustEnhanced.sublime-syntax @@ -437,6 +437,8 @@ contexts: __m(?:64|128|256)[di]? # __m512 should come later )\b scope: storage.type.rust + - match: '\bdyn\b(?!\s*::)(?=\s*(?:\(|''?{{identifier}}))' + scope: storage.type.trait.rust generic-angles: - meta_scope: meta.generic.rust diff --git a/syntax_test_rust.rs b/syntax_test_rust.rs index d522a471..4a49799e 100644 --- a/syntax_test_rust.rs +++ b/syntax_test_rust.rs @@ -1442,3 +1442,47 @@ struct S ( // ^ meta.struct punctuation.definition.group.end // ^^^ meta.struct storage.type ); + +// dyn trait +fn f(x: dyn T, y: Box, 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 = 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; +// ^^^ 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>; +// ^^^ meta.generic -storage.type.trait +// ^^^ meta.generic storage.type.trait +// ^^^ meta.generic -storage.type.trait +// ^^^ meta.generic -storage.type.trait