Commit 4049e5c6049f11370ff11c758d0a378cdd86e252

Michael Schmidt 2021-12-10T14:45:09

Rust: Improved `type-definition` and use standard tokens correctly (#3253)

diff --git a/components/prism-rust.js b/components/prism-rust.js
index 0f2f4b2..1e87336 100644
--- a/components/prism-rust.js
+++ b/components/prism-rust.js
@@ -27,8 +27,7 @@
 		},
 		'char': {
 			pattern: /b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,
-			greedy: true,
-			alias: 'string'
+			greedy: true
 		},
 		'attribute': {
 			pattern: /#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,
@@ -71,7 +70,7 @@
 			alias: 'function'
 		},
 		'type-definition': {
-			pattern: /(\b(?:enum|struct|union)\s+)\w+/,
+			pattern: /(\b(?:enum|struct|trait|type|union)\s+)\w+/,
 			lookbehind: true,
 			alias: 'class-name'
 		},
diff --git a/components/prism-rust.min.js b/components/prism-rust.min.js
index 9417424..52595ee 100644
--- a/components/prism-rust.min.js
+++ b/components/prism-rust.min.js
@@ -1 +1 @@
-!function(e){for(var a="/\\*(?:[^*/]|\\*(?!/)|/(?!\\*)|<self>)*\\*/",t=0;t<2;t++)a=a.replace(/<self>/g,function(){return a});a=a.replace(/<self>/g,function(){return"[^\\s\\S]"}),e.languages.rust={comment:[{pattern:RegExp("(^|[^\\\\])"+a),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0,alias:"string"},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<<?=?|>>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(Prism);
\ No newline at end of file
+!function(e){for(var a="/\\*(?:[^*/]|\\*(?!/)|/(?!\\*)|<self>)*\\*/",t=0;t<2;t++)a=a.replace(/<self>/g,function(){return a});a=a.replace(/<self>/g,function(){return"[^\\s\\S]"}),e.languages.rust={comment:[{pattern:RegExp("(^|[^\\\\])"+a),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<<?=?|>>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(Prism);
\ No newline at end of file
diff --git a/tests/languages/rust/class-name_feature.test b/tests/languages/rust/class-name_feature.test
index dfe34d7..8571bd8 100644
--- a/tests/languages/rust/class-name_feature.test
+++ b/tests/languages/rust/class-name_feature.test
@@ -16,6 +16,12 @@ enum Foo {
 	}
 }
 
+pub trait Summary {
+	fn summarize(&self) -> String;
+}
+
+type Point = (u8, u8);
+
 ----------------------------------------------------
 
 [
@@ -91,7 +97,34 @@ enum Foo {
 
 	["punctuation", "}"],
 
-	["punctuation", "}"]
+	["punctuation", "}"],
+
+	["keyword", "pub"],
+	["keyword", "trait"],
+	["type-definition", "Summary"],
+	["punctuation", "{"],
+
+	["keyword", "fn"],
+	["function-definition", "summarize"],
+	["punctuation", "("],
+	["operator", "&"],
+	["keyword", "self"],
+	["punctuation", ")"],
+	["punctuation", "->"],
+	["class-name", "String"],
+	["punctuation", ";"],
+
+	["punctuation", "}"],
+
+	["keyword", "type"],
+	["type-definition", "Point"],
+	["operator", "="],
+	["punctuation", "("],
+	["keyword", "u8"],
+	["punctuation", ","],
+	["keyword", "u8"],
+	["punctuation", ")"],
+	["punctuation", ";"]
 ]
 
 ----------------------------------------------------
diff --git a/tests/languages/rust/keyword_feature.test b/tests/languages/rust/keyword_feature.test
index a55ca38..0f45633 100644
--- a/tests/languages/rust/keyword_feature.test
+++ b/tests/languages/rust/keyword_feature.test
@@ -1,107 +1,107 @@
-abstract
-as
-async
-await
-become
-box
-break
-const
-continue
+abstract;
+as;
+async;
+await;
+become;
+box;
+break;
+const;
+continue;
 crate;
-do
-dyn
-else
+do;
+dyn;
+else;
 enum;
-extern
-final
+extern;
+final;
 fn;
-for
-if
-impl
-in
-let
-loop
-macro
-match
+for;
+if;
+impl;
+in;
+let;
+loop;
+macro;
+match;
 mod;
-move
-mut
-override
-priv
-pub
-ref
-return
-self
-Self
-static
+move;
+mut;
+override;
+priv;
+pub;
+ref;
+return;
+self;
+Self;
+static;
 struct;
-super
-trait
-try
-type
-typeof
+super;
+trait;
+try;
+type;
+typeof;
 union;
-unsafe
-unsized
-use
-virtual
-where
-while
-yield
+unsafe;
+unsized;
+use;
+virtual;
+where;
+while;
+yield;
 
 ----------------------------------------------------
 
 [
-	["keyword", "abstract"],
-	["keyword", "as"],
-	["keyword", "async"],
-	["keyword", "await"],
-	["keyword", "become"],
-	["keyword", "box"],
-	["keyword", "break"],
-	["keyword", "const"],
-	["keyword", "continue"],
+	["keyword", "abstract"], ["punctuation", ";"],
+	["keyword", "as"], ["punctuation", ";"],
+	["keyword", "async"], ["punctuation", ";"],
+	["keyword", "await"], ["punctuation", ";"],
+	["keyword", "become"], ["punctuation", ";"],
+	["keyword", "box"], ["punctuation", ";"],
+	["keyword", "break"], ["punctuation", ";"],
+	["keyword", "const"], ["punctuation", ";"],
+	["keyword", "continue"], ["punctuation", ";"],
 	["keyword", "crate"], ["punctuation", ";"],
-	["keyword", "do"],
-	["keyword", "dyn"],
-	["keyword", "else"],
+	["keyword", "do"], ["punctuation", ";"],
+	["keyword", "dyn"], ["punctuation", ";"],
+	["keyword", "else"], ["punctuation", ";"],
 	["keyword", "enum"], ["punctuation", ";"],
-	["keyword", "extern"],
-	["keyword", "final"],
+	["keyword", "extern"], ["punctuation", ";"],
+	["keyword", "final"], ["punctuation", ";"],
 	["keyword", "fn"], ["punctuation", ";"],
-	["keyword", "for"],
-	["keyword", "if"],
-	["keyword", "impl"],
-	["keyword", "in"],
-	["keyword", "let"],
-	["keyword", "loop"],
-	["keyword", "macro"],
-	["keyword", "match"],
+	["keyword", "for"], ["punctuation", ";"],
+	["keyword", "if"], ["punctuation", ";"],
+	["keyword", "impl"], ["punctuation", ";"],
+	["keyword", "in"], ["punctuation", ";"],
+	["keyword", "let"], ["punctuation", ";"],
+	["keyword", "loop"], ["punctuation", ";"],
+	["keyword", "macro"], ["punctuation", ";"],
+	["keyword", "match"], ["punctuation", ";"],
 	["keyword", "mod"], ["punctuation", ";"],
-	["keyword", "move"],
-	["keyword", "mut"],
-	["keyword", "override"],
-	["keyword", "priv"],
-	["keyword", "pub"],
-	["keyword", "ref"],
-	["keyword", "return"],
-	["keyword", "self"],
-	["keyword", "Self"],
-	["keyword", "static"],
+	["keyword", "move"], ["punctuation", ";"],
+	["keyword", "mut"], ["punctuation", ";"],
+	["keyword", "override"], ["punctuation", ";"],
+	["keyword", "priv"], ["punctuation", ";"],
+	["keyword", "pub"], ["punctuation", ";"],
+	["keyword", "ref"], ["punctuation", ";"],
+	["keyword", "return"], ["punctuation", ";"],
+	["keyword", "self"], ["punctuation", ";"],
+	["keyword", "Self"], ["punctuation", ";"],
+	["keyword", "static"], ["punctuation", ";"],
 	["keyword", "struct"], ["punctuation", ";"],
-	["keyword", "super"],
-	["keyword", "trait"],
-	["keyword", "try"],
-	["keyword", "type"],
-	["keyword", "typeof"],
+	["keyword", "super"], ["punctuation", ";"],
+	["keyword", "trait"], ["punctuation", ";"],
+	["keyword", "try"], ["punctuation", ";"],
+	["keyword", "type"], ["punctuation", ";"],
+	["keyword", "typeof"], ["punctuation", ";"],
 	["keyword", "union"], ["punctuation", ";"],
-	["keyword", "unsafe"],
-	["keyword", "unsized"],
-	["keyword", "use"],
-	["keyword", "virtual"],
-	["keyword", "where"],
-	["keyword", "while"],
-	["keyword", "yield"]
+	["keyword", "unsafe"], ["punctuation", ";"],
+	["keyword", "unsized"], ["punctuation", ";"],
+	["keyword", "use"], ["punctuation", ";"],
+	["keyword", "virtual"], ["punctuation", ";"],
+	["keyword", "where"], ["punctuation", ";"],
+	["keyword", "while"], ["punctuation", ";"],
+	["keyword", "yield"], ["punctuation", ";"]
 ]
 
 ----------------------------------------------------