diff --git a/RustEnhanced.sublime-syntax b/RustEnhanced.sublime-syntax index 90473c16..199e3af6 100644 --- a/RustEnhanced.sublime-syntax +++ b/RustEnhanced.sublime-syntax @@ -7,7 +7,9 @@ file_extensions: scope: source.rust variables: non_raw_ident: '[[:alpha:]][_[:alnum:]]*|_[_[:alnum:]]+' - identifier: '(?:(?:r\#)?{{non_raw_ident}})' + # include a word boundary at the end to ensure all possible characters are + # consumed, to prevent catastrophic backtracking + identifier: '(?:(?:(?:r\#)?{{non_raw_ident}})\b)' camel_ident: '\b_*[A-Z][a-zA-Z0-9_]*[a-z][a-zA-Z0-9_]*\b' lifetime: '''(?:_|{{non_raw_ident}})(?!\'')\b' escaped_byte: '\\([nrt0\"''\\]|x\h{2})' @@ -29,6 +31,8 @@ contexts: scope: variable.other.rust statements: + # This isn't really just "statements", it also includes all types, + # expressions, items, etc. - include: visibility @@ -49,13 +53,14 @@ contexts: push: - meta_scope: meta.module.rust - match: ';' - set: after-operator + scope: punctuation.terminator.rust + pop: true - include: statements-block - match: '\b({{identifier}})\s*(=)\s*(?=\|)' captures: 1: entity.name.function.rust - 2: keyword.operator.rust + 2: keyword.operator.assignment.rust push: closure - match: '\b(fn)\s+(?={{identifier}})' @@ -77,7 +82,7 @@ contexts: 2: entity.name.type.rust push: - match: '=(?!=)' - scope: keyword.operator.rust + scope: keyword.operator.assignment.rust push: after-operator - match: '(?=\S)' pop: true @@ -127,6 +132,7 @@ contexts: 1: keyword.control.rust 2: entity.name.label.rust + - include: support-type - include: type - match: '\b(macro_rules!)\s+({{identifier}})\b' @@ -144,7 +150,7 @@ contexts: - match: '\b((?:format(?:_args)?|e?print(?:ln)?|panic|unreachable|unimplemented)!)\s*(\()' captures: 1: support.macro.rust - 2: meta.group.rust punctuation.definition.group.begin.rust + 2: meta.group.rust punctuation.section.group.begin.rust push: - meta_content_scope: meta.group.rust - include: comments @@ -157,7 +163,7 @@ contexts: - match: '\b((?:write(?:ln)?|(?:debug_)?assert)!)\s*(\()' captures: 1: support.macro.rust - 2: meta.group.rust punctuation.definition.group.begin.rust + 2: meta.group.rust punctuation.section.group.begin.rust push: - meta_scope: meta.group.rust - include: comments @@ -190,32 +196,41 @@ contexts: push: group - match: '\[' - scope: punctuation.definition.group.begin.rust + scope: punctuation.section.group.begin.rust push: - meta_scope: meta.group.rust - match: '\]' - scope: punctuation.definition.group.end.rust + scope: punctuation.section.group.end.rust pop: true + - match: ';' + scope: punctuation.separator.rust - include: statements - include: return-type - include: symbols - include: keywords + - match: ',' + scope: punctuation.separator.rust + push: after-operator + - match: '\b[[:lower:]_][[:lower:][:digit:]_]*(?=\()' scope: support.function.rust - match: '{{identifier}}' + - match: '\.' + scope: punctuation.accessor.dot.rust + visibility: - match: '\b(pub)\s*(\()' captures: 1: storage.modifier.rust - 2: punctuation.definition.group.begin.rust + 2: punctuation.section.group.begin.rust push: - include: comments - match: '\)' - scope: punctuation.definition.group.end.rust + scope: punctuation.section.group.end.rust pop: true - match: '(crate|in|self|super)' scope: keyword.other.rust @@ -227,20 +242,73 @@ contexts: scope: storage.modifier.rust attribute: - - match: '#!?\[' + - match: '(#)\s*(!?)\s*(\[)' + captures: + 1: punctuation.definition.annotation.rust + 2: punctuation.definition.annotation.rust + 3: punctuation.section.group.begin.rust push: # https://github.com/sublimehq/Packages/issues/709#issuecomment-266835130 - meta_scope: meta.annotation.rust - - include: statements + - match: '(?:{{identifier}}\s*::\s*)*({{identifier}})' + scope: meta.path.rust + captures: + 1: variable.annotation.rust + - match: '\(' + scope: meta.annotation.parameters.rust meta.group.rust punctuation.section.group.begin.rust + push: + - meta_content_scope: meta.annotation.parameters.rust meta.group.rust + - match: \) + scope: meta.annotation.parameters.rust meta.group.rust punctuation.section.group.end.rust + pop: true + - include: attribute-call + - match: '=' + scope: keyword.operator.assignment.rust + set: + - meta_content_scope: meta.annotation.rust + - include: strings + - include: chars + - include: numbers + - include: comments + - match: '\]' + scope: meta.annotation.rust punctuation.section.group.end.rust + pop: true + - match: '\]' + scope: punctuation.section.group.end.rust pop: true + - include: comments + + attribute-call: + - match: \) + scope: meta.function-call.rust meta.group.rust punctuation.section.group.end.rust + pop: true + - match: '({{identifier}})\s*(\()' + scope: meta.function-call.rust + captures: + 1: variable.function.rust + 2: meta.group.rust punctuation.section.group.begin.rust + push: + - meta_content_scope: meta.function-call.rust + - include: attribute-call + - match: ',' + scope: punctuation.separator.rust + - match: '=' + scope: keyword.operator.assignment.rust + - include: strings + - include: chars + - include: numbers + - include: comments + - include: lifetime + - include: keywords + - include: symbols block: - match: '\}' - scope: meta.block.rust punctuation.definition.block.end.rust + scope: meta.block.rust punctuation.section.block.end.rust pop: true - match: '\{' - scope: punctuation.definition.block.begin.rust + scope: punctuation.section.block.begin.rust push: [block-body, try-closure] block-body: @@ -252,10 +320,10 @@ contexts: group: - match: '\)' - scope: meta.group.rust punctuation.definition.group.end.rust + scope: meta.group.rust punctuation.section.group.end.rust pop: true - match: '\(' - scope: punctuation.definition.group.begin.rust + scope: punctuation.section.group.begin.rust push: [group-body, try-closure] group-body: @@ -267,11 +335,13 @@ contexts: group-tail: - meta_scope: meta.group.rust - match: '\)' - scope: punctuation.definition.group.end.rust + scope: punctuation.section.group.end.rust pop: true - include: statements after-operator: + # after-operator tries to handle ambiguous < and | symbols which can be + # either binary operators, or the start of a generic or closure. - match: '(?=<)' set: generic-angles - include: try-closure @@ -317,6 +387,7 @@ contexts: pop: true pattern-param: + # A pattern used in a function or closure parameter. - include: comments - match: '&' scope: keyword.operator.rust @@ -385,16 +456,19 @@ contexts: pop: true - include: type-any-identifier + - match: ',' + scope: punctuation.separator.rust + closure: - meta_content_scope: meta.function.closure.rust - match: '\|' - scope: punctuation.definition.parameters.begin.rust + scope: punctuation.section.parameters.begin.rust set: [closure-return, closure-parameters] closure-parameters: - meta_scope: meta.function.parameters.rust - match: '\|' - scope: punctuation.definition.parameters.end.rust + scope: punctuation.section.parameters.end.rust pop: true - include: pattern-param # If the user has just typed a |, exit the params @@ -425,6 +499,8 @@ contexts: - include: block type: + # A low-level type. Typically you want type-any-identifier for the full + # type grammar. - match: '{{identifier}}(?=<)' push: generic-angles - match: \b(Self|{{int_suffixes}}|{{float_suffixes}}|bool|char|str)\b @@ -446,42 +522,54 @@ contexts: generic-angles: - meta_scope: meta.generic.rust - # -> to cover https://doc.rust-lang.org/std/boxed/trait.FnBox.html - - include: support-type - match: '>' scope: punctuation.definition.generic.end.rust pop: true - match: '<' scope: punctuation.definition.generic.begin.rust push: generic-angles-contents - # Alert the user of a broken generic construct - match: '(?=\S)' - scope: invalid.illegal.rust pop: true generic-angles-contents: - include: comments - include: attribute - - include: type-slice + - include: type-slice-or-array - match: '(?=>)' pop: true - match: '<' scope: punctuation.definition.generic.begin.rust push: - match: '>' - scope: punctuation.definition.generic.begin.rust + scope: punctuation.definition.generic.end.rust pop: true - include: generic-angles-contents - include: type-any-identifier - match: '{{identifier}}' - match: ':|,' scope: punctuation.separator.rust - - match: '\+|\bas\b|=' + - match: '\+|=' scope: keyword.operator.rust - match: '(?=\S)' - scope: invalid.illegal.rust pop: true + constant-integer-expression: + - include: integers + - match: \( + scope: punctuation.section.group.begin.rust + push: + - meta_scope: meta.group.rust + - match: \) + scope: punctuation.section.group.end.rust + pop: true + - include: constant-integer-expression + - match: '{{identifier}}' + scope: variable.other.constant.rust + - match: '::' + scope: punctuation.accessor.double-colon.rust + - match: '[-+%/*]' + scope: keyword.operator.arithmetic.rust + type-any-identifier: - include: comments - include: support-type @@ -491,37 +579,48 @@ contexts: - include: raw-pointer - match: \b(mut|ref|const|unsafe)\b scope: storage.modifier.rust + - match: '\bas\b' + # This is for qualified type paths + scope: keyword.operator.rust - match: \b(fn)\b\s*(\() captures: 1: storage.type.function.rust - 2: meta.group.rust punctuation.definition.group.begin.rust + 2: meta.group.rust punctuation.section.group.begin.rust push: - meta_content_scope: meta.group.rust - match: \) - scope: meta.group.rust punctuation.definition.group.end.rust + scope: meta.group.rust punctuation.section.group.end.rust set: - include: return-type - match: '(?=\S)' pop: true - include: type-any-identifier - include: lifetime - - match: '\b([[:upper:]]|_*[[:upper:]][[:alnum:]_]*[[:lower:]][[:alnum:]_]*)\b::' + - match: '\b([[:upper:]]|_*[[:upper:]][[:alnum:]_]*[[:lower:]][[:alnum:]_]*)\b(::)' scope: meta.path.rust storage.type.rust captures: 1: storage.type.rust - - match: '{{identifier}}::' - scope: meta.path.rust - - match: '::(?={{identifier}})' + 2: punctuation.accessor.rust + - match: '{{identifier}}(::)' scope: meta.path.rust + captures: + 1: punctuation.accessor.rust + - match: '(::)(?={{identifier}})' + scope: meta.path.rust punctuation.accessor.rust - match: '(?=<)' push: generic-angles - match: '\(' - scope: punctuation.definition.type.begin.rust + scope: punctuation.section.group.begin.rust push: + - meta_scope: meta.group.rust - match: '\)' - scope: punctuation.definition.type.end.rust + scope: punctuation.section.group.end.rust pop: true + - match: ',' + scope: punctuation.separator.rust - include: type-any-identifier + - match: '\+' + scope: keyword.operator.rust - match: \bextern\b scope: keyword.other.rust push: @@ -530,7 +629,7 @@ contexts: pop: true - include: hrtb - include: type - - include: type-slice + - include: type-slice-or-array - match: '\b_\b' scope: keyword.operator.rust - match: '!' @@ -554,13 +653,20 @@ contexts: - match: '(?=\S)' pop: true - type-slice: + type-slice-or-array: - match: '\[' - scope: punctuation.definition.group.begin.rust + scope: punctuation.section.group.begin.rust push: - match: '\]' - scope: punctuation.definition.group.end.rust + scope: punctuation.section.group.end.rust pop: true + - match: ';' + scope: punctuation.separator.rust + set: + - match: '\]' + scope: punctuation.section.group.end.rust + pop: true + - include: constant-integer-expression - include: type-any-identifier struct-identifier: @@ -597,10 +703,10 @@ contexts: struct-tuple: - meta_scope: meta.struct.rust - match: '\)' - scope: punctuation.definition.group.end.rust + scope: punctuation.section.group.end.rust pop: true - match: '\(' - scope: punctuation.definition.group.begin.rust + scope: punctuation.section.group.begin.rust push: - match: '(?=\))' pop: true @@ -608,14 +714,16 @@ contexts: - include: comments - include: visibility - include: type-any-identifier + - match: ',' + scope: punctuation.separator.rust struct-classic: - meta_scope: meta.struct.rust - match: '\}' - scope: meta.block.rust punctuation.definition.block.end.rust + scope: meta.block.rust punctuation.section.block.end.rust pop: true - match: '\{' - scope: punctuation.definition.block.begin.rust + scope: punctuation.section.block.begin.rust push: struct-classic-body - match: '(?=\S)' # Abort for an invalid match. @@ -631,7 +739,10 @@ contexts: - match: '{{identifier}}(?=\s*:)' scope: variable.other.member.rust push: - - match: ',|(?=\})' + - match: ',' + scope: punctuation.separator.rust + pop: true + - match: '(?=\})' pop: true - include: comments - match: ':' @@ -662,10 +773,10 @@ contexts: - match: '(?=\bwhere\b)' push: impl-where - match: '\{' - scope: punctuation.definition.block.begin.rust + scope: punctuation.section.block.begin.rust push: struct-classic-body - match: '\}' - scope: meta.block.rust punctuation.definition.block.end.rust + scope: meta.block.rust punctuation.section.block.end.rust pop: true - match: '(?=;)' pop: true @@ -694,18 +805,18 @@ contexts: - match: '(?=\bwhere\b)' push: impl-where - match: '\{' - scope: punctuation.definition.block.begin.rust + scope: punctuation.section.block.begin.rust set: enum-body - match: '(?=\S)' # Abort on invalid character. pop: true enum-body: - - meta_scope: meta.enum.rust + - meta_scope: meta.block.rust meta.enum.rust - include: comments - include: attribute - match: '\}' - scope: punctuation.definition.block.end.rust + scope: punctuation.section.block.end.rust pop: true - match: '\b[[:upper:]_][[:upper:][:digit:]_]*\b' scope: constant.other.rust @@ -721,6 +832,7 @@ contexts: - match: '(?=\})' pop: true - match: ',' + scope: punctuation.separator.rust pop: true - match: '=' set: enum-discriminant @@ -850,7 +962,7 @@ contexts: - meta_include_prototype: false - match: '(\))\s*[^?*+]*\s*([?*+])' captures: - 1: punctuation.definition.group.end.rust + 1: punctuation.section.group.end.rust 2: keyword.operator.rust pop: true - include: macro-matchers @@ -1005,10 +1117,10 @@ contexts: fn-parameters: - meta_scope: meta.function.rust - match: '\)' - scope: meta.function.parameters.rust punctuation.definition.parameters.end.rust + scope: meta.function.parameters.rust punctuation.section.parameters.end.rust set: fn-return - match: '\(' - scope: punctuation.definition.parameters.begin.rust + scope: punctuation.section.parameters.begin.rust push: - meta_scope: meta.function.parameters.rust - include: comments @@ -1024,7 +1136,7 @@ contexts: - match: '(?=\bwhere\b)' set: fn-where - include: return-type - # Escape for incomplete expression + # Escape for incomplete expression, or ';' - match: '(?=\S)' pop: true @@ -1036,18 +1148,19 @@ contexts: - match: \bwhere\b scope: keyword.other.rust - include: type-any-identifier - - match: ':' + - match: '[:,]' scope: punctuation.separator.rust - - match: ';' + # Escape for incomplete expression, or ';' + - match: '(?=\S)' pop: true fn-body: - meta_scope: meta.function.rust - match: '\}' - scope: meta.block.rust punctuation.definition.block.end.rust + scope: meta.block.rust punctuation.section.block.end.rust pop: true - match: '\{' - scope: punctuation.definition.block.begin.rust + scope: punctuation.section.block.begin.rust push: - meta_scope: meta.block.rust - match: '(?=\})' @@ -1057,20 +1170,22 @@ contexts: statements-block: - include: comments - match: '\}' - scope: meta.block.rust punctuation.definition.block.end.rust + scope: meta.block.rust punctuation.section.block.end.rust pop: true - match: '\{' - scope: punctuation.definition.block.begin.rust + scope: punctuation.section.block.begin.rust push: [block-body, try-closure] comments: - include: block-comments - match: "//[!/]" + scope: punctuation.definition.comment.rust push: - meta_scope: comment.line.documentation.rust - match: $\n? pop: true - match: // + scope: punctuation.definition.comment.rust push: - meta_scope: comment.line.double-slash.rust - match: $\n? @@ -1078,15 +1193,23 @@ contexts: block-comments: - match: '/\*[!\*][^\*/]' + scope: punctuation.definition.comment.rust push: - meta_scope: comment.block.documentation.rust - match: \*/ + scope: punctuation.definition.comment.rust pop: true + # Javadoc style comment with leading * on each line. Helps with word-wrapping. + - match: ^\s*(\*)(?!/) + captures: + 1: punctuation.definition.comment.rust - include: block-comments - match: /\* + scope: punctuation.definition.comment.rust push: - meta_scope: comment.block.rust - match: \*/ + scope: punctuation.definition.comment.rust pop: true - include: block-comments @@ -1143,6 +1266,8 @@ contexts: pop: true - match: '{{escaped_byte}}' scope: constant.character.escape.rust + - match: '(\\)$' + scope: punctuation.separator.continuation.line.rust - match: '\\.' scope: invalid.illegal.character.escape.rust @@ -1202,16 +1327,18 @@ contexts: scope: punctuation.definition.string.end.rust pop: true - include: escaped-char + - match: '(\\)$' + scope: punctuation.separator.continuation.line.rust raw-string: - - match: (r)(#*)" + - match: (r)((#*)") captures: 1: storage.type.string.rust 2: punctuation.definition.string.begin.rust push: - meta_include_prototype: false - meta_scope: string.quoted.double.raw.rust - - match: '"\2' + - match: '"\3' scope: punctuation.definition.string.end.rust pop: true @@ -1226,6 +1353,8 @@ contexts: pop: true - include: escaped-char - include: format-escapes + - match: '(\\)$' + scope: punctuation.separator.continuation.line.rust format-raw-string: - match: (r)(#*)" @@ -1261,6 +1390,10 @@ contexts: scope: constant.other.placeholder.rust numbers: + - include: floats + - include: integers + + floats: - match: '\b({{dec_literal}}(?:\.{{dec_literal}})?(?:{{float_exponent}})?)({{float_suffixes}})' captures: 1: constant.numeric.float.rust @@ -1272,6 +1405,7 @@ contexts: - match: '\b{{dec_literal}}\.(?![A-Za-z._''])' scope: constant.numeric.float.rust + integers: - match: '\b({{dec_literal}})({{int_suffixes}})?\b' captures: 1: constant.numeric.integer.decimal.rust @@ -1305,9 +1439,12 @@ contexts: - meta_scope: meta.path.rust - include: no-path-identifiers - match: '::' + scope: punctuation.accessor.rust set: no-type-names - - match: '::(?={{identifier}})' + - match: '(::)(?={{identifier}})' scope: meta.path.rust + captures: + 1: punctuation.accessor.rust push: no-type-names - include: no-path-identifiers @@ -1334,34 +1471,35 @@ contexts: # match blocks containing just enums scope: keyword.operator.rust - - match: '=(?!=)' + - match: '<-|->' scope: keyword.operator.rust - - match: '[;,]' + - match: '\.\.\.|\.\.=|\.\.' + scope: keyword.operator.range.rust - - match: ':' - scope: punctuation.separator.rust + - match: '[!<>=]=' + scope: keyword.operator.comparison.rust - - match: '\.\.\.' - scope: keyword.operator.rust + - match: '(?:[-+%/*^&|]|<<|>>)?=' + scope: keyword.operator.assignment.rust - - match: '\.\.' - scope: keyword.operator.rust + - match: '&&|\|\||!' + scope: keyword.operator.logical.rust - - match: '<<=|>>=|<<|>>' - scope: keyword.operator.rust + - match: '[&|^]|<<|>>' + scope: keyword.operator.bitwise.rust - - match: '>=|<=|==|!=|&&|\|\|' - scope: keyword.operator.rust + - match: '[<>]' + scope: keyword.operator.comparison.rust - - match: '\*=|/=|\+=|-=|%=|\^=|&=|\|=' - scope: keyword.operator.rust + - match: '[-+%/*]' + scope: keyword.operator.arithmetic.rust - - match: '[-=<>&|!~@?+*/%^''#$]' + - match: '[@~?$#'']' scope: keyword.operator.rust - - match: '<-|->' - scope: keyword.operator.rust + - match: '[:;,]' + scope: punctuation.separator.rust keywords: # All keywords. Note in `statements` some of these are superseded by more diff --git a/tests/syntax-rust/syntax_test_attributes.rs b/tests/syntax-rust/syntax_test_attributes.rs index 08fd8381..0296f84d 100644 --- a/tests/syntax-rust/syntax_test_attributes.rs +++ b/tests/syntax-rust/syntax_test_attributes.rs @@ -1,27 +1,39 @@ // SYNTAX TEST "Packages/Rust Enhanced/RustEnhanced.sublime-syntax" #![warn(unused)] -// <- meta.annotation +// <- meta.annotation punctuation.definition.annotation //^^^^^^^^^^^^^^ meta.annotation -// ^^^^ support.function -// ^ meta.group punctuation.definition.group.begin -// ^^^^^^ meta.group -// ^ meta.group punctuation.definition.group.end +//^ punctuation.section.group.begin +// ^^^^ variable.annotation +// ^^^^^^^^ meta.annotation.parameters meta.group +// ^ punctuation.section.group.begin +// ^ punctuation.section.group.end +// ^ punctuation.section.group.end -#[macro_use] -// <- meta.annotation -//^^^^^^^^^^ meta.annotation + # [ macro_use ] +//^^^^^^^^^^^^^^^ meta.annotation +//^ punctuation.definition.annotation +// ^ punctuation.section.group.begin +// ^^^^^^^^^ variable.annotation +// ^ punctuation.section.group.end #[cfg(all(unix, not(target_os = "haiku")))] -// <- meta.annotation +// <- meta.annotation punctuation.definition.annotation //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.annotation -//^^^ support.function -// ^^^ meta.group support.function -// ^^^^^^ meta.group meta.group -// ^^^ meta.group meta.group support.function -// ^^^^^^^^^^ meta.group meta.group meta.group -// ^ meta.group meta.group meta.group keyword.operator -// ^^^^^^^ meta.group meta.group meta.group string.quoted.double +//^^^ variable.annotation +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.annotation.parameters meta.group +// ^ punctuation.section.group.begin +// ^^^ meta.function-call variable.function +// ^ meta.annotation.parameters meta.group meta.function-call meta.group punctuation.section.group.begin +// ^ punctuation.separator +// ^^^ meta.function-call meta.function-call variable.function +// ^ punctuation.section.group.begin +// ^ keyword.operator.assignment +// ^^^^^^^ string.quoted.double +// ^ punctuation.section.group.end +// ^ punctuation.section.group.end +// ^ punctuation.section.group.end +// ^ punctuation.section.group.end // Test highlighting/scope with struct field attributes // https://github.com/rust-lang/sublime-rust/issues/120 @@ -35,7 +47,7 @@ pub struct Claim { // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.annotation pub referring: Option, #[serde(skip_serializing_if="Option::is_none")] -// ^^^^^ support.function +// ^^^^^ variable.annotation // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.annotation pub drug: Option>, #[serde(skip_serializing_if="Option::is_none")] @@ -50,7 +62,7 @@ pub struct Claim { enum E { #[allow(dead_code)] // ^^^^^^^^^^^^^^^^^^^ meta.enum meta.annotation -// ^^^^^ support.function +// ^^^^^ variable.annotation A(i32), // ^^^ meta.enum meta.struct meta.group storage.type } @@ -59,3 +71,72 @@ enum E { unsafe impl<#[may_dangle] T: ?Sized> Drop for Box { } // ^^^^^^^^^^^^^ meta.annotation // ^^^^^^^^^^^^^^^^^^^^^^^^^ meta.impl meta.generic + + #[test = "foo ] bar"] +//^^^^^^^^^^^^^^^^^^^^^ meta.annotation +//^ punctuation.definition.annotation +// ^ punctuation.section.group.begin +// ^^^^ variable.annotation +// ^ keyword.operator.assignment +// ^^^^^^^^^^^ string.quoted.double +// ^ punctuation.section.group.end + +// All the things. + # ! [ +//^^^^^^ meta.annotation +//^ punctuation.definition.annotation +// ^ punctuation.definition.annotation +// ^ punctuation.section.group.begin + // comment +// ^^^^^^^^^^^ comment.line.double-slash + attr_name ( +// ^^^^^^^^^ variable.annotation +// ^ meta.annotation.parameters meta.group punctuation.section.group.begin + // comment +// ^^^^^^^^^^^ comment.line.double-slash + "string", +// ^^^^^^^^ string.quoted.double +// ^ punctuation.separator + r##"raw"##, +// ^^^^^^^^^^ string.quoted.double.raw + b"bytes", +// ^ storage.type.string +// ^^^^^^^^ string.quoted.double + br"raw byte", +// ^^^^^^^^^^^^ string.quoted.double.raw + 'c', +// ^^^ string.quoted.single + b'c', +// ^^^^ string.quoted.single + 1_000, +// ^^^^^ constant.numeric.integer.decimal + 1.618, +// ^^^^^ constant.numeric.float + true, +// ^^^^ constant.language + struct, +// ^^^^^^ storage.type.struct + 1 + 1, +// ^ constant.numeric.integer.decimal +// ^ keyword.operator.arithmetic +// ^ constant.numeric.integer.decimal + ) +// ^ punctuation.section.group.end + ] +//^ punctuation.section.group.end + +// quote! uses #var syntax +#[doc=#foo] +//^^^^^^^^^ meta.annotation +// ^ keyword.operator.assignment + +// Macros often use replacement. +#[doc = $doc] +//^^^^^^^^^^^ meta.annotation +// ^ punctuation.section.group.end +// ^ keyword.operator.assignment + +#[rustfmt::skip] +//^^^^^^^^^^^^^^ meta.annotation +//^^^^^^^^^^^^^ meta.path +// ^^^^ variable.annotation diff --git a/tests/syntax-rust/syntax_test_closures.rs b/tests/syntax-rust/syntax_test_closures.rs index 74fca101..e67e4468 100644 --- a/tests/syntax-rust/syntax_test_closures.rs +++ b/tests/syntax-rust/syntax_test_closures.rs @@ -4,28 +4,29 @@ let inferred_closure = |i, j: u32| i + 1; // ^^^^^^^^^^^^^^^^ entity.name.function // ^^^^^^^^^^^^^^^^^ meta.function.closure // ^^^^^^^^^^^ meta.function.parameters -// ^ punctuation.definition.parameters.begin +// ^ punctuation.section.parameters.begin // ^ variable.parameter +// ^ punctuation.separator // ^ variable.parameter // ^ punctuation.separator // ^^^ storage.type -// ^ punctuation.definition.parameters.end +// ^ punctuation.section.parameters.end let closure = || -> i32 { | | 1 + 2 }; // ^^^^^^^ entity.name.function // ^^^^^^^^^^^^^^^^^^^^^^^ meta.function.closure // ^^ meta.function.parameters -// ^ punctuation.definition.parameters.begin -// ^ punctuation.definition.parameters.end +// ^ punctuation.section.parameters.begin +// ^ punctuation.section.parameters.end // ^^^ storage.type // ^^^^^^^^^^^^^ meta.block -// ^ meta.block punctuation.definition.block.begin +// ^ meta.block punctuation.section.block.begin // ^ constant.numeric.integer.decimal // ^ constant.numeric.integer.decimal -// ^ meta.block punctuation.definition.block.end +// ^ meta.block punctuation.section.block.end // Make sure "or" is not confused with closure. let c = a | b; -// ^ keyword.operator +// ^ keyword.operator.bitwise call_func(|c| 1 + 2 + c); // ^^^^^^^^^^^^^ meta.function.closure @@ -33,18 +34,18 @@ call_func(|c| 1 + 2 + c); fn lambdas() { let c = |foo, -// ^ meta.function.closure meta.function.parameters punctuation.definition.parameters.begin +// ^ meta.function.closure meta.function.parameters punctuation.section.parameters.begin // ^^^ meta.function.parameters variable.parameter bar| {}; // ^^^ meta.function.parameters variable.parameter -// ^ meta.function.closure meta.function.parameters punctuation.definition.parameters.end +// ^ meta.function.closure meta.function.parameters punctuation.section.parameters.end let c = |foo, // weird, but should work -// ^ meta.function.closure meta.function.parameters punctuation.definition.parameters.begin +// ^ meta.function.closure meta.function.parameters punctuation.section.parameters.begin // ^^^ meta.function.parameters variable.parameter // ^^^^^^^^^^^^^^^^^^^^^^^^^ comment.line bar| {}; // ^^^ meta.function.parameters variable.parameter -// ^ meta.function.closure meta.function.parameters punctuation.definition.parameters.end +// ^ meta.function.closure meta.function.parameters punctuation.section.parameters.end } @@ -179,3 +180,20 @@ let x = |/*comment*/(/*c*/a, [b/*c*/], S{/*c*/f: c})| {}; // ^^^^^^^^^^^ meta.block // ^^^^^ comment.block // ^ variable.parameter + + let f = |(x, y): (u32, &mut u32)| { x + y }; + // ^ punctuation.section.parameters.begin + // ^^^^^^ meta.group + // ^ variable.parameter + // ^ punctuation.separator + // ^ variable.parameter + // ^ punctuation.section.group.end + // ^ punctuation.separator + // ^ punctuation.section.group.begin + // ^^^ storage.type + // ^ punctuation.separator + // ^ keyword.operator + // ^^^ storage.modifier + // ^^^ storage.type + // ^ punctuation.section.group.end + // ^ punctuation.section.parameters.end diff --git a/tests/syntax-rust/syntax_test_comments.rs b/tests/syntax-rust/syntax_test_comments.rs index 50262e11..e1a5025b 100644 --- a/tests/syntax-rust/syntax_test_comments.rs +++ b/tests/syntax-rust/syntax_test_comments.rs @@ -1,14 +1,17 @@ // SYNTAX TEST "Packages/Rust Enhanced/RustEnhanced.sublime-syntax" // Line comments -// <- comment.line.double-slash +// <- comment.line.double-slash punctuation.definition.comment // ^^^^^^^^^^^^^^ comment.line.double-slash + +// <- -comment + /// Line doc comments // <- comment.line.documentation // ^^^^^^^^^^^^^ comment.line.documentation /*! -// <- comment.block.documentation +// <- comment.block.documentation punctuation.definition.comment // <- comment.block.documentation //^ comment.block.documentation Block doc comments @@ -17,6 +20,11 @@ Block doc comments // ^^^^^^^^^^^^^^^^^^ comment.block.documentation comment.block */ +/** + * +// ^ comment.block.documentation punctuation.definition.comment +*/ + // Verify comment is cleared. mod a {} // ^^^^^ -comment diff --git a/tests/syntax-rust/syntax_test_control_flow.rs b/tests/syntax-rust/syntax_test_control_flow.rs index baeb9675..dd9b20ca 100644 --- a/tests/syntax-rust/syntax_test_control_flow.rs +++ b/tests/syntax-rust/syntax_test_control_flow.rs @@ -9,21 +9,21 @@ for i in 1..10 { // <- keyword.control // ^^ keyword.operator // ^ constant.numeric.integer.decimal -// ^^ keyword.operator +// ^^ keyword.operator.range // ^^ constant.numeric.integer.decimal println!("I: {}", i); // ^^^^^^^^^^^^^^^^^^^^^^ meta.block } -// <- meta.block punctuation.definition.block.end +// <- meta.block punctuation.section.block.end 'label_name: loop { // ^^^^^^^^ entity.name.label // ^ punctuation.separator // ^^^^ keyword.control -// ^ meta.block punctuation.definition.block.begin +// ^ meta.block punctuation.section.block.begin n += 1; if n / 2 == 5 { -// ^ keyword.operator +// ^ keyword.operator.arithmetic continue; // ^^^^^^^^ keyword.control } @@ -51,37 +51,38 @@ for i in 1..10 { } if n < 0 { -// ^ meta.block punctuation.definition.block.begin +// ^ meta.block punctuation.section.block.begin // <- keyword.control print!("{} is negative", n); +// ^ punctuation.terminator } else if n > 0 { -// <- meta.block punctuation.definition.block.end +// <- meta.block punctuation.section.block.end // ^^^ keyword.control -// ^ meta.block punctuation.definition.block.begin +// ^ meta.block punctuation.section.block.begin // ^^ keyword.control print!("{0} is positive", n); } else { -// <- meta.block punctuation.definition.block.end +// <- meta.block punctuation.section.block.end // ^^^ keyword.control -// ^ meta.block punctuation.definition.block.begin +// ^ meta.block punctuation.section.block.begin print!("{} is zero", n); // ^^^^^^^^^^^^^^^^^^^^^^^^^ meta.block } -// <- meta.block punctuation.definition.block.end +// <- meta.block punctuation.section.block.end if let BasicStruct(i) = j { // ^^^ storage.type -// ^ keyword.operator -// ^ meta.block punctuation.definition.block.begin +// ^ keyword.operator.assignment +// ^ meta.block punctuation.section.block.begin println!("Basic value: {}", i); } -// <- meta.block punctuation.definition.block.end +// <- meta.block punctuation.section.block.end while let BasicStruct(k) = j { //^^^ keyword.control // ^^^ storage.type -// ^ keyword.operator -// ^ meta.block punctuation.definition.block.begin +// ^ keyword.operator.assignment +// ^ meta.block punctuation.section.block.begin println!("Constructed example: {}", j) j = BasicStruct(j + 1); if k > 20 { @@ -89,7 +90,7 @@ while let BasicStruct(k) = j { //^^^ meta.block meta.block keyword.control } } -// <- meta.block punctuation.definition.block.end +// <- meta.block punctuation.section.block.end continue_running(); //^^^^^^^^^^^^^^ support.function diff --git a/tests/syntax-rust/syntax_test_enum.rs b/tests/syntax-rust/syntax_test_enum.rs index 6b0ab736..763ed1f6 100644 --- a/tests/syntax-rust/syntax_test_enum.rs +++ b/tests/syntax-rust/syntax_test_enum.rs @@ -5,7 +5,7 @@ enum OperatingSystem // ^^^^^^^^^^^^^^^^^ meta.enum // ^^^^^^^^^^^^^^^ entity.name.enum { -// <- meta.enum punctuation.definition.block.begin +// <- meta.block meta.enum punctuation.section.block.begin Osx, // ^^^ meta.enum storage.type.source Windows, @@ -13,12 +13,12 @@ enum OperatingSystem Bsd(String), // ^^^^^^ support.type Info { field: i32, value: str } - // ^ punctuation.definition.block.begin + // ^ punctuation.section.block.begin // ^^^ storage.type // ^^^ storage.type - // ^ meta.block punctuation.definition.block.end + // ^ meta.block punctuation.section.block.end } -// <- meta.enum punctuation.definition.block.end +// <- meta.block meta.enum punctuation.section.block.end let q = Message::Quit; // ^^^^^^^ storage.type.source @@ -51,7 +51,7 @@ enum Discriminant { // ^^ meta.enum constant.other // ^^^^^^ meta.enum meta.group // ^ constant.numeric.integer.decimal -// ^^ keyword.operator +// ^^ keyword.operator.bitwise // ^ constant.numeric.integer.decimal lowercase, // ^^^^^^^^^^^ meta.enum diff --git a/tests/syntax-rust/syntax_test_expr.rs b/tests/syntax-rust/syntax_test_expr.rs index cdebc415..a3c5d29e 100644 --- a/tests/syntax-rust/syntax_test_expr.rs +++ b/tests/syntax-rust/syntax_test_expr.rs @@ -3,114 +3,167 @@ // specific categories. let big_n = -// ^ keyword.operator +// ^ keyword.operator.assignment if n < 10 && n > -10 { -// ^ keyword.operator -// ^^ keyword.operator -// ^ keyword.operator -// ^ keyword.operator +// ^ keyword.operator.comparison +// ^^ keyword.operator.logical +// ^ keyword.operator.comparison +// ^ keyword.operator.arithmetic // ^^ constant.numeric.integer.decimal -// ^ meta.block punctuation.definition.block.begin +// ^ meta.block punctuation.section.block.begin 10 * n -// ^ meta.block keyword.operator +// ^ meta.block keyword.operator.arithmetic } else { -// ^ meta.block punctuation.definition.block.end -// ^ meta.block punctuation.definition.block.begin +// ^ meta.block punctuation.section.block.end +// ^ meta.block punctuation.section.block.begin n / 2 -// ^ meta.block keyword.operator +// ^ meta.block keyword.operator.arithmetic }; -// ^ meta.block punctuation.definition.block.end +// ^ meta.block punctuation.section.block.end let tuple = (1.0, 0i32, "Hello"); // ^^^^^^^^^^^^^^^^^^^^ meta.group -// ^ punctuation.definition.group.begin +// ^ punctuation.section.group.begin // ^^^ constant.numeric.float // ^ constant.numeric.integer.decimal // ^^^ storage.type // ^^^^^^^ string.quoted.double -// ^ punctuation.definition.group.end +// ^ punctuation.section.group.end // Tuple access. let x = tuple.1; -// ^ constant.numeric.integer.decimal.rust +// ^ constant.numeric.integer.decimal // Array access. let x = arr[1]; // ^^^ meta.group -// ^ punctuation.definition.group.begin +// ^ punctuation.section.group.begin +// ^ constant.numeric.integer.decimal +// ^ punctuation.section.group.end + +// Array expression. +let x = [1; 2]; +// ^^^^^^ meta.group +// ^ punctuation.section.group.begin +// ^ punctuation.separator // ^ constant.numeric.integer.decimal -// ^ punctuation.definition.group.end +// ^ punctuation.terminator +let x = [1; SOME_CONST]; +// ^^^^^^^^^^ constant.other +let _: Box<[[bool; (FOO + 1) / 2]; FOO * 3 % 12 - 1]>; +// ^ punctuation.separator +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.generic +// ^ punctuation.definition.generic.begin +// ^^ punctuation.section.group.begin +// ^^^^ storage.type +// ^ punctuation.separator +// ^ meta.group punctuation.section.group.begin +// ^^^ variable.other.constant +// ^ keyword.operator.arithmetic +// ^ constant.numeric.integer.decimal +// ^ punctuation.section.group.end +// ^ keyword.operator.arithmetic +// ^ constant.numeric.integer.decimal +// ^ punctuation.section.group.end +// ^ punctuation.separator +// ^^^ variable.other.constant +// ^ keyword.operator.arithmetic +// ^ constant.numeric.integer.decimal +// ^ keyword.operator.arithmetic +// ^^ constant.numeric.integer.decimal +// ^ keyword.operator.arithmetic +// ^ constant.numeric.integer.decimal +// ^ punctuation.section.group.end +// ^ punctuation.definition.generic.end +// ^ punctuation.terminator +let _: Box<[[u8; aa::COUNT - 1]; 5]>; +// ^ punctuation.definition.generic.begin +// ^ punctuation.section.group.begin +// ^ punctuation.section.group.begin +// ^^ storage.type +// ^ punctuation.separator +// ^^ variable.other.constant +// ^^ punctuation.accessor.double-colon +// ^^^^^ variable.other.constant +// ^ keyword.operator.arithmetic +// ^ constant.numeric.integer.decimal +// ^ punctuation.section.group.end +// ^ punctuation.separator +// ^ constant.numeric.integer.decimal +// ^ punctuation.section.group.end +// ^ punctuation.definition.generic.end +// ^ punctuation.terminator // Borrow expression. let xsl = &xs; // ^ keyword.operator let a = && 10; -// ^^ keyword.operator +// ^^ keyword.operator.logical let a = & & 10; -// ^ keyword.operator -// ^ keyword.operator +// ^ keyword.operator.bitwise +// ^ keyword.operator.bitwise let y = &mut 9; // ^ keyword.operator // ^^^ storage.modifier // Dereference. assert_eq!(*x, 7); -// ^ meta.group keyword.operator +// ^ meta.group keyword.operator.arithmetic *y = 11; -// ^ keyword.operator +// ^ keyword.operator.arithmetic // Block expression. let z = { -// ^ meta.block punctuation.definition.block.begin +// ^ meta.block punctuation.section.block.begin 2 * 5 // ^ constant.numeric.integer.decimal -// ^ keyword.operator +// ^ keyword.operator.arithmetic // ^ constant.numeric.integer.decimal }; -// <- meta.block punctuation.definition.block.end +// <- meta.block punctuation.section.block.end // Various operators. let x = !6; -// ^ keyword.operator +// ^ keyword.operator.logical // ^ constant.numeric.integer.decimal let a = 1 + 2 - 3 * 4 / 6 % 7 & 8 | 9 ^ a << b >> c; -// ^ keyword.operator -// ^ keyword.operator -// ^ keyword.operator -// ^ keyword.operator -// ^ keyword.operator -// ^ keyword.operator -// ^ keyword.operator -// ^ keyword.operator -// ^^ keyword.operator -// ^^ keyword.operator +// ^ keyword.operator.arithmetic +// ^ keyword.operator.arithmetic +// ^ keyword.operator.arithmetic +// ^ keyword.operator.arithmetic +// ^ keyword.operator.arithmetic +// ^ keyword.operator.bitwise +// ^ keyword.operator.bitwise +// ^ keyword.operator.bitwise +// ^^ keyword.operator.bitwise +// ^^ keyword.operator.bitwise a == b != c > d < e >= f <= g -// ^^ keyword.operator -// ^^ keyword.operator -// ^ keyword.operator -// ^ keyword.operator -// ^^ keyword.operator -// ^^ keyword.operator +// ^^ keyword.operator.comparison +// ^^ keyword.operator.comparison +// ^ keyword.operator.comparison +// ^ keyword.operator.comparison +// ^^ keyword.operator.comparison +// ^^ keyword.operator.comparison a || b && c -// ^^ keyword.operator -// ^^ keyword.operator +// ^^ keyword.operator.logical +// ^^ keyword.operator.logical a += b; -//^^ keyword.operator +//^^ keyword.operator.assignment a -= b; -//^^ keyword.operator +//^^ keyword.operator.assignment a *= b; -//^^ keyword.operator +//^^ keyword.operator.assignment a /= b; -//^^ keyword.operator +//^^ keyword.operator.assignment a %= b; -//^^ keyword.operator +//^^ keyword.operator.assignment a &= b; -//^^ keyword.operator +//^^ keyword.operator.assignment a |= b; -//^^ keyword.operator +//^^ keyword.operator.assignment a ^= b; -//^^ keyword.operator +//^^ keyword.operator.assignment a <<= b; -//^^^ keyword.operator +//^^^ keyword.operator.assignment a >>= b; -//^^^ keyword.operator +//^^^ keyword.operator.assignment diff --git a/tests/syntax-rust/syntax_test_functions.rs b/tests/syntax-rust/syntax_test_functions.rs index 259ae88b..6518e46f 100644 --- a/tests/syntax-rust/syntax_test_functions.rs +++ b/tests/syntax-rust/syntax_test_functions.rs @@ -4,15 +4,15 @@ fn my_func(x: i32) // <- storage.type.function // ^^^^^^^ entity.name.function // ^^^^^^^^ meta.function.parameters -// ^ punctuation.definition.parameters.begin +// ^ punctuation.section.parameters.begin // ^ variable.parameter // ^ punctuation.separator -// ^ punctuation.definition.parameters.end +// ^ punctuation.section.parameters.end { -// <- meta.function meta.block punctuation.definition.block.begin +// <- meta.function meta.block punctuation.section.block.begin } -// <- meta.function meta.block punctuation.definition.block.end +// <- meta.function meta.block punctuation.section.block.end fn foo(i: u32, b: i64) -> u32 { // <- storage.type.function @@ -21,10 +21,10 @@ fn foo(i: u32, b: i64) -> u32 { // ^ punctuation.definition.generic.end // ^^^^^^^^^^^^^^^^ meta.function.parameters // ^^^ storage.type -// ^ meta.block punctuation.definition.block.begin +// ^ meta.block punctuation.section.block.begin } -// <- meta.block punctuation.definition.block.end +// <- meta.block punctuation.section.block.end fn my_other_func(e: OperatingSystem) -> &'a f64 { @@ -55,15 +55,15 @@ pub unsafe extern "C" fn __sync_synchronize() { } // ^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.function // ^^ storage.type.function // ^^^^^^^^^^^^^^^^^^ entity.name.function -// ^ meta.function.parameters punctuation.definition.parameters.begin -// ^ meta.function.parameters punctuation.definition.parameters.end +// ^ meta.function.parameters punctuation.section.parameters.begin +// ^ meta.function.parameters punctuation.section.parameters.end let f: extern "C" fn () = mem::transmute(0xffff0fa0u32); // ^^^^^^ keyword.other // ^^^ string.quoted.double // ^^ storage.type.function // ^^ meta.group -// ^ keyword.operator +// ^ keyword.operator.assignment // ^^^^^^^^^^ meta.group constant.numeric.integer.hexadecimal // ^^^ meta.group storage.type.numeric @@ -130,3 +130,17 @@ fn foo(&'a self) {} // ^ keyword.operator // ^^ storage.modifier.lifetime // ^^^^ variable.parameter + +fn sum((x, y): (i32, i32)) -> i32 { +// ^^^^^^ meta.group +// ^ punctuation.section.group.begin +// ^ variable.parameter +// ^ punctuation.separator +// ^ variable.parameter +// ^ punctuation.section.group.end +// ^ punctuation.separator +// ^ punctuation.section.group.begin +// ^^^ storage.type +// ^ punctuation.separator +// ^^^ storage.type +// ^ punctuation.section.group.end diff --git a/tests/syntax-rust/syntax_test_generics.rs b/tests/syntax-rust/syntax_test_generics.rs index 87f04ca5..d9e07b9f 100644 --- a/tests/syntax-rust/syntax_test_generics.rs +++ b/tests/syntax-rust/syntax_test_generics.rs @@ -17,15 +17,15 @@ impl Thing for &'a mut A {} // Various tests on `where`. fn f<'b: 'a>(self) -> &'b mut [i32] where 'a: 'b { } // ^^^^^^^^^^^^^^ meta.function meta.function.return-type -// ^ meta.function meta.function.return-type punctuation.definition.group.begin +// ^ meta.function meta.function.return-type punctuation.section.group.begin // ^^^ meta.function meta.function.return-type storage.type -// ^ meta.function meta.function.return-type punctuation.definition.group.end +// ^ meta.function meta.function.return-type punctuation.section.group.end // ^^^^^ meta.function meta.where keyword.other // ^^ meta.function meta.where storage.modifier.lifetime // ^ meta.function meta.where punctuation.separator // ^^ meta.function meta.where storage.modifier.lifetime -// ^ meta.function meta.block punctuation.definition.block.begin -// ^ meta.function meta.block punctuation.definition.block.end +// ^ meta.function meta.block punctuation.section.block.begin +// ^ meta.function meta.block punctuation.section.block.end fn f(func: F) -> usize // ^^ meta.function meta.function.return-type punctuation.separator @@ -35,13 +35,13 @@ fn f(func: F) -> usize // ^^^^^^^^^^^^^^^^^^^^^ meta.function meta.where // ^ punctuation.separator // ^^ support.type -// ^ punctuation.definition.type.begin +// ^ punctuation.section.group.begin // ^^^^^ storage.type -// ^ punctuation.definition.type.end +// ^ punctuation.section.group.end // ^^ meta.function.return-type punctuation.separator // ^^^^^ meta.function.return-type storage.type -// ^ meta.function meta.block punctuation.definition.block.begin -// ^ meta.function meta.block punctuation.definition.block.end +// ^ meta.function meta.block punctuation.section.block.begin +// ^ meta.function meta.block punctuation.section.block.end fn f(lhs: L, rhs: R) where L: IntoIterator, @@ -50,41 +50,45 @@ fn f(lhs: L, rhs: R) // ^^^^^^^^^^^^ support.type // ^^^^^^^^^^^^^^^^^^^^^^^^^ meta.generic // ^ punctuation.definition.generic.begin -// ^ punctuation.definition.type.begin +// ^ punctuation.section.group.begin // ^ keyword.operator // ^^ storage.modifier.lifetime // ^^^ storage.type // ^ keyword.operator // ^^ storage.modifier.lifetime // ^^^ storage.type -// ^ punctuation.definition.type.end +// ^ punctuation.section.group.end // ^ punctuation.definition.generic.end R: IntoIterator, {} // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.function meta.where -// ^ meta.function meta.block punctuation.definition.block.begin -// ^ meta.function meta.block punctuation.definition.block.end +// ^ meta.function meta.block punctuation.section.block.begin +// ^ meta.function meta.block punctuation.section.block.end fn f usize>(func: f) {} // ^^^^^^^^^^^^^^^^^^^^^^^ meta.generic // ^ meta.generic punctuation.definition.generic.begin // ^ meta.generic punctuation.separator // ^^ meta.generic support.type -// ^ meta.generic punctuation.definition.type.begin +// ^ meta.generic punctuation.section.group.begin // ^^^^^ meta.generic storage.type -// ^ meta.generic punctuation.definition.type.end +// ^ meta.generic punctuation.section.group.end // ^^^^^ meta.generic meta.function.return-type storage.type // ^ meta.generic punctuation.definition.generic.end -// ^ meta.function meta.function.parameters punctuation.definition.parameters.begin +// ^ meta.function meta.function.parameters punctuation.section.parameters.begin // ^^^^ meta.function meta.function.parameters variable.parameter fn f>(lhs: L) {} // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.generic // ^ punctuation.definition.generic.begin // ^ punctuation.definition.generic.begin -// ^ punctuation.definition.type.begin +// ^ keyword.operator +// ^^^^^^^^^^^^^^^^^^ meta.group +// ^ punctuation.section.group.begin // ^^ storage.modifier.lifetime // ^^^ storage.type -// ^ punctuation.definition.generic.begin +// ^ punctuation.separator +// ^ punctuation.section.group.end +// ^ punctuation.definition.generic.end // ^ punctuation.definition.generic.end -// ^ meta.function meta.function.parameters punctuation.definition.parameters.begin +// ^ meta.function meta.function.parameters punctuation.section.parameters.begin struct A(T) where T: AsRef; //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.struct @@ -105,7 +109,7 @@ pub struct IterHolder where A: Number { // ^^^ meta.struct meta.generic // ^^^^^ meta.struct meta.where keyword.other // ^^^^^^ meta.struct meta.where -// ^ meta.struct punctuation.definition.block.begin +// ^ meta.struct punctuation.section.block.begin num: A } @@ -173,8 +177,8 @@ impl Iterator for Fibonacci } pub const FOO: Option<[i32; 1]> = Some([1]); -// ^ punctuation.definition.group.begin -// ^ punctuation.definition.group.end +// ^ punctuation.section.group.begin +// ^ punctuation.section.group.end #[derive(Clone)] pub struct GobletMiddleware { @@ -226,10 +230,23 @@ fn numbers() -> impl Iterator { fn collect_vec() { let _: Vec<(usize, usize)> = (0..10).enumerate().collect::>(); // ^^^^^^^^^^^^^^^^^^^ meta.generic -// ^ punctuation.definition.type.begin +// ^^^ support.type +// ^ punctuation.section.group.begin // ^^^^^ storage.type // ^^^^^ storage.type -// ^ punctuation.definition.type.end +// ^ punctuation.section.group.end +// ^ keyword.operator +// ^ punctuation.section.group.begin +// ^ constant.numeric.integer.decimal +// ^^ keyword.operator +// ^^ constant.numeric.integer.decimal +// ^ punctuation.section.group.end +// ^ punctuation.accessor.dot +// ^^^^^^^^^ support.function +// ^^ punctuation.section.group +// ^ punctuation.accessor.dot +// ^^ punctuation.accessor +// ^^^ support.type // ^^^^^^^^ meta.generic // ^^^^^^ meta.generic meta.generic // ^ keyword.operator @@ -239,6 +256,8 @@ fn collect_vec() { // ^^^^ support.macro let _: Vec<(usize, usize)> = vec![]; // ^^^^ support.macro + let _: Vec = vec![]; +// ^^^^^^ meta.generic support.type } @@ -317,3 +336,17 @@ fn f(a: for<'a, 'b> fn() -> String) {} // ^ meta.generic punctuation.separator // ^^ meta.generic storage.modifier.lifetime // ^ meta.function meta.function.parameters meta.generic punctuation.definition.generic.end + +// Function in type path with return type. +fn factory() -> Box i32> { +// <- storage.type.function +// ^^^^^^^ entity.name.function +// ^^^^^^^^^^^^^^^^ meta.generic +// ^^ support.type +// ^ punctuation.section.group.begin +// ^^^ storage.type +// ^ punctuation.section.group.end +// ^^ punctuation.separator +// ^^^ storage.type + Box::new(|x| x + 1) +} diff --git a/tests/syntax-rust/syntax_test_literals.rs b/tests/syntax-rust/syntax_test_literals.rs index c7ae52e2..f61d4b24 100644 --- a/tests/syntax-rust/syntax_test_literals.rs +++ b/tests/syntax-rust/syntax_test_literals.rs @@ -2,11 +2,11 @@ let c = 'c'; // <- storage.type -// ^ keyword.operator +// ^ keyword.operator.assignment // ^^^ string.quoted.single let b = b'c'; // <- storage.type -// ^ keyword.operator +// ^ keyword.operator.assignment // ^ storage.type // ^^^ string.quoted.single let ch = '∞'; @@ -14,7 +14,7 @@ let ch = '∞'; let s = "This is a string \x01_\u{007F}_\"_\'_\\_\r_\n_\t_\0"; // <- storage.type -// ^ keyword.operator +// ^ keyword.operator.assignment // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ string.quoted.double // ^^^^ constant.character.escape // ^^^^^^^^ constant.character.escape @@ -25,15 +25,29 @@ let s = "This is a string \x01_\u{007F}_\"_\'_\\_\r_\n_\t_\0"; // ^^ constant.character.escape // ^^ constant.character.escape // ^^ constant.character.escape -let r = r#"This is a raw string, no escapes! \x00 \0 \n"#; +let r = r##"This is a raw string, no escapes! \x00 \0 \n"##; // <- storage.type -// ^ keyword.operator +// ^ keyword.operator.assignment // ^ storage.type -// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ string.quoted.double - constant.character.escape +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ string.quoted.double.raw - constant.character.escape +// ^^^ punctuation.definition.string.begin.rust +// ^^^ punctuation.definition.string.end.rust +// ^ - string +let s = "\ +// ^ string.quoted.double punctuation.separator.continuation.line +continued \ +// ^ string.quoted.double punctuation.separator.continuation.line +line"; +let b = b"\ +// ^ punctuation.separator.continuation.line +"; +println!("Continuation in format \ +// ^ punctuation.separator.continuation.line +"); let bytes = b"This won't escape unicode \u{0123}, but will do \x01_\"_\'_\\_\r_\n_\t_\0"; // <- storage.type -// ^ keyword.operator +// ^ keyword.operator.assignment // ^ storage.type // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ string.quoted.double // ^^^^ constant.character.escape @@ -47,7 +61,7 @@ let bytes = b"This won't escape unicode \u{0123}, but will do \x01_\"_\'_\\_\r_\ let raw_bytes = br#"This won't escape anything either \x01 \""#; // <- storage.type -// ^ keyword.operator +// ^ keyword.operator.assignment // ^^ storage.type // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ string.quoted.double - constant.character.escape @@ -237,5 +251,5 @@ let s_uni_esc_extra = "\u{1234567}"; let logical: bool = true; // ^ punctuation.separator // ^^^^ storage.type -// ^ keyword.operator +// ^ keyword.operator.assignment // ^^^^ constant.language diff --git a/tests/syntax-rust/syntax_test_macros.rs b/tests/syntax-rust/syntax_test_macros.rs index d3b7ea1f..ebfb0153 100644 --- a/tests/syntax-rust/syntax_test_macros.rs +++ b/tests/syntax-rust/syntax_test_macros.rs @@ -2,22 +2,22 @@ String my_var = format!("Hello {0}", "World"); // ^^^ support.type -// ^ keyword.operator +// ^ keyword.operator.assignment // ^^^^^^^ support.macro -// ^ punctuation.definition.group.begin +// ^ punctuation.section.group.begin // ^^^^^^^^^^^^^^^^^^^^^^ meta.group // ^^^^^^^^^^^ string.quoted.double // ^^^ constant.other.placeholder -// ^ punctuation.definition.group.end +// ^ punctuation.section.group.end pub fn macro_tests() { println!(); // ^^^^^^^^ support.macro println!("Example"); // ^^^^^^^^ support.macro -// ^ punctuation.definition.group.begin +// ^ punctuation.section.group.begin // ^^^^^^^^^ string.quoted.double -// ^ punctuation.definition.group.end +// ^ punctuation.section.group.end println!("Example {} {message}", "test", message="hi"); // ^^ constant.other.placeholder // ^^^^^^^^^ constant.other.placeholder @@ -25,9 +25,9 @@ pub fn macro_tests() { // ^^^^^^ support.macro panic!("Example"); // ^^^^^^ support.macro -// ^ punctuation.definition.group.begin +// ^ punctuation.section.group.begin // ^^^^^^^^^ string.quoted.double -// ^ punctuation.definition.group.end +// ^ punctuation.section.group.end panic!("Example {} {message}", "test", message="hi"); // ^^ constant.other.placeholder // ^^^^^^^^^ constant.other.placeholder @@ -44,25 +44,27 @@ pub fn macro_tests() { } my_var = format!("Hello {name}, how are you?", -// ^ keyword.operator +// ^ keyword.operator.assignment // ^^^^^^^ support.macro -// ^ punctuation.definition.group.begin +// ^ punctuation.section.group.begin // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.group // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ string.quoted.double // ^^^^^^ constant.other.placeholder name="John"); // ^^^^^^^^^^^^^ meta.group -// ^ keyword.operator +// ^ keyword.operator.assignment // ^^^^^^ string.quoted.double -// ^ punctuation.definition.group.end +// ^ punctuation.section.group.end write!(f, "{}", self.0) // ^^^^^^ support.macro // ^^^^^^^^^^^^^^^^^ meta.group -// ^ punctuation.definition.group.begin +// ^ punctuation.section.group.begin // ^^^^ string.quoted.double // ^^ constant.other.placeholder -// ^ punctuation.definition.group.end +// ^^^^ variable.language +// ^ punctuation.accessor.dot +// ^ punctuation.section.group.end write!(f, "{:10}", self.0) // ^^^^^ constant.other.placeholder eprint!("{:^10}", self.0) @@ -86,18 +88,18 @@ my_var = format!("Hello {name}, how are you?", // ^^^^ string.quoted.double // ^^ constant.other.placeholder // ^^^^ string.quoted.double -// ^ punctuation.definition.group.begin -// ^ punctuation.definition.group.end +// ^ punctuation.section.group.begin +// ^ punctuation.section.group.end writeln!(w) // ^^^^^^^^ support.macro // ^^^ meta.group -// ^ punctuation.definition.group.begin -// ^ punctuation.definition.group.end +// ^ punctuation.section.group.begin +// ^ punctuation.section.group.end println!() // ^^^^^^^^ support.macro // ^^ meta.group -// ^ punctuation.definition.group.begin -// ^ punctuation.definition.group.end +// ^ punctuation.section.group.begin +// ^ punctuation.section.group.end /*******************************************************************/ // The outer brackets can be any type. @@ -209,9 +211,10 @@ macro_rules! forward_ref_binop [ // ^ keyword.operator // ^^ storage.modifier.lifetime // ^^ variable.other -// ^ meta.macro meta.macro.transcribers meta.impl meta.block punctuation.definition.block.begin +// ^ meta.macro meta.macro.transcribers meta.impl meta.block punctuation.section.block.begin type Output = <$t as $imp<$u>>::Output; // ^^^^^^^^^^^^^^^^ meta.generic +// ^^ keyword.operator // ^^ meta.path #[inline] @@ -225,8 +228,9 @@ macro_rules! forward_ref_binop [ // ^^ variable.other // ^^ punctuation.separator // ^^^^^^^^^^^^^^^^ meta.generic +// ^^ keyword.operator // ^^ meta.path -// ^ meta.macro meta.macro.transcribers meta.impl meta.block meta.block punctuation.definition.block.begin +// ^ meta.macro meta.macro.transcribers meta.impl meta.block meta.block punctuation.section.block.begin $imp::$method(*self, *other) // ^^^^ variable.other // ^^^^^^^ variable.other @@ -248,7 +252,7 @@ macro_rules! kleene_star { // ^^^^ variable.parameter // ^ punctuation.separator // ^^ storage.type -// ^ punctuation.definition.group.end +// ^ punctuation.section.group.end // ^ keyword.operator // ^ punctuation.section.block.end // ^^ meta.macro keyword.operator @@ -292,7 +296,7 @@ macro_rules! kleene_star { // ^^^^^ variable.parameter // ^ punctuation.separator // ^^ storage.type -// ^ punctuation.definition.group.end +// ^ punctuation.section.group.end // ^ keyword.operator // ^ punctuation.section.block.end // ^^ meta.macro keyword.operator diff --git a/tests/syntax-rust/syntax_test_match.rs b/tests/syntax-rust/syntax_test_match.rs index a4c98d05..e1f3b917 100644 --- a/tests/syntax-rust/syntax_test_match.rs +++ b/tests/syntax-rust/syntax_test_match.rs @@ -12,7 +12,7 @@ let o = match n { // ^^^^^ string.quoted.double 3...5 => "a few", // ^ constant.numeric.integer.decimal -// ^^^ keyword.operator +// ^^^ keyword.operator.range // ^ constant.numeric.integer.decimal // ^^ keyword.operator // ^^^^^^^ string.quoted.double @@ -26,12 +26,12 @@ match n { // <- keyword.control a if n > 5 => println!("Big: {}", a), // ^^ keyword.control -// ^ keyword.operator +// ^ keyword.operator.comparison // ^^ keyword.operator // ^^^^^^^^ support.macro b if n <= 5 => println!("Small: {}", b), // ^^ keyword.control -// ^^ keyword.operator +// ^^ keyword.operator.comparison // ^^ keyword.operator // ^^^^^^^^ support.macro // ^^ constant.other.placeholder @@ -41,17 +41,17 @@ match n { match my_func() { // ^^ keyword.control // ^^^^^^^ support.function -// ^ meta.block punctuation.definition.block.begin +// ^ meta.block punctuation.section.block.begin 0 => println!("None"), // ^ constant.numeric.integer.decimal // ^^ keyword.operator // ^^^^^^^^ support.macro res @ 1...9 => println!("Digit: {}", res), // ^ keyword.operator -// ^^^ keyword.operator +// ^^^ keyword.operator.range // ^^ constant.other.placeholder _ => println!("Full number"), // ^ source // ^^ keyword.operator } -// <- meta.block punctuation.definition.block.end +// <- meta.block punctuation.section.block.end diff --git a/tests/syntax-rust/syntax_test_misc.rs b/tests/syntax-rust/syntax_test_misc.rs index 1ba473f0..3261aebd 100644 --- a/tests/syntax-rust/syntax_test_misc.rs +++ b/tests/syntax-rust/syntax_test_misc.rs @@ -56,3 +56,8 @@ let y = future.await; // try keyword in 2018 edition let x = try {} // ^^^ keyword.control.rust + +// Performance test for catastrophic backtracking. +impl ApplicationPreferenceseeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee { +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ entity.name.impl +} diff --git a/tests/syntax-rust/syntax_test_modules.rs b/tests/syntax-rust/syntax_test_modules.rs index 0a833135..d8a875de 100644 --- a/tests/syntax-rust/syntax_test_modules.rs +++ b/tests/syntax-rust/syntax_test_modules.rs @@ -19,73 +19,79 @@ mod bar; // <- meta.module storage.type.module //^^^^^^ meta.module // ^^^ entity.name.module +// ^ punctuation.terminator pub mod my_mod { // ^^^^^^^^^^^^ meta.module // <- storage.modifier // ^^^ storage.type.module // ^^^^^^ entity.name.module -// ^ meta.block punctuation.definition.block.begin +// ^ meta.block punctuation.section.block.begin } -// <- meta.module meta.block punctuation.definition.block.end +// <- meta.module meta.block punctuation.section.block.end pub use self::trafile::*; // <- storage.modifier // ^^^ keyword.other // ^^^^ variable.language // ^^^^^^^^^^^^^^^ meta.path +// ^^ punctuation.accessor // ^ keyword.operator // ^ punctuation.terminator use std::fmt; // <- keyword.other // ^^^^^ meta.path +// ^^ punctuation.accessor // ^^^ - meta.path // ^ punctuation.terminator use foo::i32; // ^^^^^ meta.path +// ^^ punctuation.accessor // ^^^ - meta.path storage.type use foo::Bar; // ^^^^^ meta.path +// ^^ punctuation.accessor // ^^^ storage.type.source use foo::{Baz, QUX, quux}; // ^^^^^ meta.path +// ^^ punctuation.accessor.rust // ^^^^^^^^^^^^^^^^ meta.block -// ^ punctuation.definition.block.begin +// ^ punctuation.section.block.begin // ^^^ storage.type.source // ^^^ constant.other // ^^^^ meta.block -// ^ punctuation.definition.block.end +// ^ punctuation.section.block.end // ^ punctuation.terminator use std::{ // <- keyword.other // ^^^^^ meta.path -// ^ meta.block punctuation.definition.block.begin +// ^ meta.block punctuation.section.block.begin fs::{self, read_dir}, // ^^^^ meta.block meta.path -// ^ meta.block meta.block punctuation.definition.block.begin +// ^ meta.block meta.block punctuation.section.block.begin // ^^^^ meta.block meta.block variable.language // ^^^^^^^^ meta.block meta.block -// ^ meta.block meta.block punctuation.definition.block.end +// ^ meta.block meta.block punctuation.section.block.end path::{Path, PathBuf}, // ^^^^^^ meta.block meta.path -// ^ meta.block meta.block punctuation.definition.block.begin +// ^ meta.block meta.block punctuation.section.block.begin // ^^^^ meta.block meta.block storage.type.source // ^^^^^^^ meta.block meta.block storage.type.source -// ^ meta.block meta.block punctuation.definition.block.end +// ^ meta.block meta.block punctuation.section.block.end }; -// ^ meta.block punctuation.definition.block.end +// ^ meta.block punctuation.section.block.end // ^ punctuation.terminator extern { // <- keyword.other //^^^^ keyword.other -// ^ meta.block punctuation.definition.block.begin +// ^ meta.block punctuation.section.block.begin fn foo(x: i32, ...); } -// <- meta.block punctuation.definition.block.end +// <- meta.block punctuation.section.block.end extern "stdcall" { } // <- keyword.other diff --git a/tests/syntax-rust/syntax_test_punct.rs b/tests/syntax-rust/syntax_test_punct.rs new file mode 100644 index 00000000..364a5162 --- /dev/null +++ b/tests/syntax-rust/syntax_test_punct.rs @@ -0,0 +1,182 @@ +// SYNTAX TEST "Packages/Rust Enhanced/RustEnhanced.sublime-syntax" +// Various usages of punctuation. + +/************* semicolon *************/ +; +// <- punctuation.terminator +let x = 1; +// ^ punctuation.terminator +[12; 34] +// ^ punctuation.separator +type T = [i32; 3]; +// ^ punctuation.separator +const X: i32 = 1; +// ^ punctuation.terminator +static Y: i32 = 1; +// ^ punctuation.terminator +extern "C" { + fn f(); +// ^ punctuation.terminator + static S: i32 = 1; +// ^ punctuation.terminator +} +trait T { + fn f(); +// ^ punctuation.terminator + const C: i32; +// ^ punctuation.terminator + type T; +// ^ punctuation.terminator +} +extern crate name; +// ^ punctuation.terminator +mod m; +// ^ punctuation.terminator +struct S; +// ^ punctuation.terminator +type T = i32; +// ^ punctuation.terminator +use foo; +// ^ punctuation.terminator + + +/************* colon *************/ +match v { + Point{x: 10, y: 20} => {} +// ^ punctuation.separator +// ^ punctuation.separator +} +let x: i32 = 1; +// ^ punctuation.separator +let c = |a: i32| {} +// ^ punctuation.separator +let s = Foo{x: 50}; +// ^ punctuation.separator +struct S { + f1: 1, +// ^ punctuation.separator +} +enum E { + Foo{x: i32}, +// ^ punctuation.separator +} +'label: +// ^ punctuation.separator +fn f<'a: 'b>(x: i32) where T: Bound {} +// ^ punctuation.separator +// ^ punctuation.separator +// ^ punctuation.separator +// See syntax_test_generics for more generics tests (all separator). +trait T: Bound { +// ^ punctuation.separator + type T: Bound; +// ^ punctuation.separator + const C: i32; +// ^ punctuation.separator + fn f(x: i32); +// ^ punctuation.separator +} +static S: i32 = 1; +// ^ punctuation.separator +const C: i32 = 1; +// ^ punctuation.separator +type T = fn(a: i32); +// ^ punctuation.separator + + +/************* comma *************/ +#[cfg(a, b)] +// ^ punctuation.separator +fn f() where A: B, C: D {} +// ^ punctuation.separator +// ^ punctuation.separator +X +// ^ punctuation.separator +type T = Box; +// ^ punctuation.separator +type T = fn(i32, i32); +// ^ punctuation.separator +type T = (i32, i32); +// ^ punctuation.separator +let S{f1, f2} = a; +// ^ punctuation.separator +let (a, b) = c; +// ^ punctuation.separator +let [a, b] = c; +// ^ punctuation.separator +let a = [1, 2]; +// ^ punctuation.separator +let x = (a, b); +// ^ punctuation.separator +foo(1, 2); +// ^ punctuation.separator +let a = |a, b| {}; +// ^ punctuation.separator +fn f(a: i32, b: i32) {} +// ^ punctuation.separator +struct S { + f1: i32, +// ^ punctuation.separator +} +struct S(i32, i32); +// ^ punctuation.separator +enum E { + Variant1, +// ^ punctuation.separator + Variant2{f1: i32,}, +// ^ punctuation.separator +// ^ punctuation.separator + Variant3(i32, i32), +// ^ punctuation.separator +// ^ punctuation.separator +} +Foo{f1: a,}; +// ^ punctuation.separator +Foo(a, b); +// ^ punctuation.separator +match a { + x => 1, +// ^ punctuation.separator +} +use a::{a,b}; +// ^ punctuation.separator + + +/************* ligatures *************/ +// This is mostly for visual inspection. +foo!{<- -> =>} // emplacement token (unused in language) +// ^^ keyword.operator +// ^^ punctuation.separator +// ^^ keyword.operator +fn f() -> i32 {1} +// ^^ punctuation.separator + a && b || c; +// ^^ keyword.operator.logical +// ^^ keyword.operator.logical + 1 << 2 >> 3; +// ^^ keyword.operator.bitwise +// ^^ keyword.operator.bitwise + a += 1; b -= 1; c *= 1; d /= 1; e %= 1; f ^= 1; g &= 1; h |= 1; +// ^^ keyword.operator.assignment +// ^^ keyword.operator.assignment +// ^^ keyword.operator.assignment +// ^^ keyword.operator.assignment +// ^^ keyword.operator.assignment +// ^^ keyword.operator.assignment +// ^^ keyword.operator.assignment +// ^^ keyword.operator.assignment + a <<= 1; b >>= 2; +// ^^^ keyword.operator.assignment +// ^^^ keyword.operator.assignment + x == y; x != y; +// ^^ keyword.operator.comparison +// ^^ keyword.operator.comparison + a >= b; a <= b; +// ^^ keyword.operator.comparison +// ^^ keyword.operator.comparison + 1..2; 1...2; 1..=2; +//^^ keyword.operator.range +// ^^^ keyword.operator.range +// ^^^ keyword.operator.range +match x { a => {}} +// ^^ meta.block keyword.operator diff --git a/tests/syntax-rust/syntax_test_struct.rs b/tests/syntax-rust/syntax_test_struct.rs index 6ecb1929..df73d68f 100644 --- a/tests/syntax-rust/syntax_test_struct.rs +++ b/tests/syntax-rust/syntax_test_struct.rs @@ -5,21 +5,22 @@ struct BasicStruct(i32); // <- storage.type.struct //^^^^ storage.type.struct // ^^^^^^^^^^^ entity.name.struct -// ^ punctuation.definition.group.begin +// ^ punctuation.section.group.begin // ^^^ storage.type -// ^ punctuation.definition.group.end +// ^ punctuation.section.group.end struct PrintableStruct(Box); // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.struct // <- storage.type.struct //^^^^ storage.type.struct // ^^^^^^^^^^^^^^^ entity.name.struct -// ^ punctuation.definition.group.begin +// ^ punctuation.section.group.begin // ^^^^^^^^ meta.generic +// ^^^ support.type // ^ punctuation.definition.generic.begin // ^^^ storage.type // ^ punctuation.definition.generic.end -// ^ punctuation.definition.group.end +// ^ punctuation.section.group.end struct Nil; // ^^^^^^^ meta.struct @@ -37,7 +38,7 @@ struct /*comment*/ Comments {} struct Point // ^^^^^^^^^ meta.struct { -// <- meta.struct meta.block punctuation.definition.block.begin +// <- meta.struct meta.block punctuation.section.block.begin x: i32, // ^ variable.other.member // ^ punctuation.separator @@ -47,12 +48,12 @@ struct Point // ^ punctuation.separator // ^^^ storage.type } -// <- meta.block punctuation.definition.block.end +// <- meta.block punctuation.section.block.end impl Point //^^^^^^^^ meta.impl { -// <- meta.impl meta.block punctuation.definition.block.begin +// <- meta.impl meta.block punctuation.section.block.begin fn new(x: i32, y: i32) -> Point // <- storage.type.function // ^^^ entity.name.function @@ -64,6 +65,9 @@ impl Point fn double(&mut self) { // ^^^^^^ entity.name.function self.x *= 2; + // ^^^^ variable.language + // ^ punctuation.accessor.dot + // ^^ keyword.operator.assignment self.y *= 2; } } @@ -73,9 +77,9 @@ struct Val (f64,); //^^^^^^^^^^^^^^^ meta.struct // ^^^ entity.name.struct // ^^^^^ meta.group -// ^ punctuation.definition.group.begin +// ^ punctuation.section.group.begin // ^^^ storage.type -// ^ punctuation.definition.group.end +// ^ punctuation.section.group.end // ^ punctuation.terminator struct F { @@ -105,10 +109,10 @@ let mut j = BasicStruct(10); let p = Point {x: 10.0, y: 20.0}; // ^^^^^ storage.type.source // ^^^^^^^^^^^^^^^^^^ meta.block -// ^ punctuation.definition.block.begin +// ^ punctuation.section.block.begin // ^ punctuation.separator // ^^^^ constant.numeric.float -// ^ punctuation.definition.block.end +// ^ punctuation.section.block.end let n = NothingInMe {}; // ^^^^^^^^^^^ storage.type.source // ^^ meta.block diff --git a/tests/syntax-rust/syntax_test_traits.rs b/tests/syntax-rust/syntax_test_traits.rs index c7ba70fb..54228f60 100644 --- a/tests/syntax-rust/syntax_test_traits.rs +++ b/tests/syntax-rust/syntax_test_traits.rs @@ -3,12 +3,24 @@ pub trait Animal { // <- storage.modifier // ^^^^^^^^^^^^^^ meta.trait -// ^ meta.block punctuation.definition.block.begin +// ^ meta.block punctuation.section.block.begin fn noise(quiet: bool) { // Comment } + + // Some tests for no-body functions. + fn bare_semi(); +// ^^^^^^^^^^^^^^ meta.function +// ^ punctuation.terminator + fn where_semi() where X: Ord + PartialOrd; +// ^^^^^^^^^^^^^^^^^^^^^^^^^ meta.function meta.where +// ^ keyword.operator.rust +// ^ punctuation.terminator + fn return_semi() -> bool; +// ^^^^^^^ meta.function meta.function.return-type +// ^ punctuation.terminator } -// <- meta.trait meta.block punctuation.definition.block.end +// <- meta.trait meta.block punctuation.section.block.end impl<'a, T: MyTrait + OtherTrait> PrintInOption for T where // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.impl @@ -32,16 +44,17 @@ impl fmt::Display for PrintableStruct { // <- storage.type.impl //^^ storage.type.impl // ^^^^^ meta.path +// ^^ punctuation.accessor // ^^^ keyword.other // ^^^^^^^^^^^^^^^ entity.name.impl -// ^ meta.block punctuation.definition.block.begin +// ^ meta.block punctuation.section.block.begin fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.impl // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.function // ^^ storage.type.function // ^^^ entity.name.function // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.function.parameters -// ^ punctuation.definition.parameters.begin +// ^ punctuation.section.parameters.begin // ^ keyword.operator // ^^^^ variable.parameter // ^ variable.parameter @@ -49,15 +62,15 @@ impl fmt::Display for PrintableStruct { // ^ keyword.operator // ^^^ storage.modifier // ^^^^^ meta.path -// ^ punctuation.definition.parameters.end +// ^ punctuation.section.parameters.end // ^^ punctuation.separator // ^^^^^ meta.path -// ^ meta.block punctuation.definition.block.begin +// ^ meta.block punctuation.section.block.begin } // ^^ meta.function meta.block -// ^ punctuation.definition.block.end +// ^ punctuation.section.block.end } -// <- meta.block punctuation.definition.block.end +// <- meta.block punctuation.section.block.end impl !Send for Point {} //^^^^^^^^^^^^^^^^^^^^^ meta.impl diff --git a/tests/syntax-rust/syntax_test_types.rs b/tests/syntax-rust/syntax_test_types.rs index 26b8d462..bd144a0b 100644 --- a/tests/syntax-rust/syntax_test_types.rs +++ b/tests/syntax-rust/syntax_test_types.rs @@ -36,7 +36,7 @@ const ZERO: u64 = 0; // ^^^^ entity.name.constant // ^ punctuation.separator // ^^^ storage.type -// ^ keyword.operator +// ^ keyword.operator.assignment // ^ constant.numeric.integer.decimal static NAME: &'static str = "John"; // <- storage.type @@ -44,7 +44,7 @@ static NAME: &'static str = "John"; // ^ keyword.operator // ^^^^^^^ storage.modifier.lifetime // ^^^ storage.type -// ^ keyword.operator +// ^ keyword.operator.assignment // ^^^^^^ string.quoted.double static mut BRAVO: u32 = 0; // <- storage.type @@ -79,14 +79,14 @@ type Pair<'a> = (i32, &'a str); // ^ keyword.operator // ^^ storage.modifier.lifetime // ^ keyword.operator -// ^ keyword.operator +// ^ keyword.operator.assignment // ^^^^^^^^^^^^^^ meta.group -// ^ punctuation.definition.group.begin +// ^ punctuation.section.group.begin // ^^^ storage.type // ^ keyword.operator // ^^ storage.modifier.lifetime // ^^^ storage.type -// ^ punctuation.definition.group.end +// ^ punctuation.section.group.end // ^ punctuation.terminator let p: Pair<'static> = (10, "ten"); // <- storage.type @@ -95,32 +95,40 @@ let p: Pair<'static> = (10, "ten"); // ^ punctuation.definition.generic.begin // ^^^^^^^ storage.modifier.lifetime // ^ punctuation.definition.generic.end -// ^ keyword.operator +// ^ keyword.operator.assignment // ^^^^^^^^^^^ meta.group -// ^ punctuation.definition.group.begin +// ^ punctuation.section.group.begin // ^^ constant.numeric.integer.decimal // ^^^^^ string.quoted.double -// ^ punctuation.definition.group.end +// ^ punctuation.section.group.end // ^ punctuation.terminator +fn tuple(x: (u32, u32)) {} +// ^^^^^^^^^^ meta.group +// ^ meta.group punctuation.section.group.begin +// ^^^ storage.type +// ^ punctuation.separator +// ^^^ storage.type +// ^ meta.group punctuation.section.group.end // Array types. let xs: [i32; 5] = [1, 2, 3, 4, 5]; // ^ punctuation.separator // ^^^^^^^^ meta.group -// ^ punctuation.definition.group.begin +// ^ punctuation.section.group.begin // ^^^ storage.type +// ^ punctuation.separator // ^ constant.numeric.integer.decimal -// ^ punctuation.definition.group.end +// ^ punctuation.section.group.end // ^^^^^^^^^^^^^^^ meta.group -// ^ punctuation.definition.group.begin -// ^ punctuation.definition.group.end +// ^ punctuation.section.group.begin +// ^ punctuation.section.group.end // Slice types. let slice: &[i32]; // ^ keyword.operator // ^^^^^ meta.group -// ^ punctuation.definition.group.begin -// ^ punctuation.definition.group.end +// ^ punctuation.section.group.begin +// ^ punctuation.section.group.end // ^^^ storage.type @@ -157,3 +165,12 @@ fn f(string: &str) -> StrWrap<'_> { } // Never type. fn from_str() -> Result {} // ^ meta.function meta.function.return-type meta.generic keyword.operator + +// Qualified path with type. +// Note: This isn't actually a generics, but that gets reused for this purpose. +type Item = ::Item; +// ^^^^^^^^^^^^^^^ meta.generic +// ^^ keyword.operator +// ^^^^^^^^ support.type +// ^^ punctuation.accessor +// ^^^^ storage.type.source diff --git a/tests/syntax-rust/syntax_test_union.rs b/tests/syntax-rust/syntax_test_union.rs index d8e4be11..e9987087 100644 --- a/tests/syntax-rust/syntax_test_union.rs +++ b/tests/syntax-rust/syntax_test_union.rs @@ -4,13 +4,13 @@ union Union { //^^^ meta.union storage.type.union //^^^^^^^^^^^ meta.union // ^^^^^ entity.name.union -// ^ meta.block punctuation.definition.block.begin +// ^ meta.block punctuation.section.block.begin f: u32, // ^ meta.union meta.block variable.other.member // ^ meta.union meta.block punctuation.separator // ^^^ meta.union meta.block storage.type } -// <- meta.union meta.block punctuation.definition.block.end +// <- meta.union meta.block punctuation.section.block.end pub union Foo<'a, Y: Baz> // <- storage.modifier @@ -25,11 +25,11 @@ pub union Foo<'a, Y: Baz> // ^ meta.union meta.where punctuation.separator // ^^^^^^^^^^ meta.union meta.where { -// <- meta.union meta.block punctuation.definition.block.begin +// <- meta.union meta.block punctuation.section.block.begin f: SomeType, // Comment beside a field // ^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.union meta.block comment.line.double-slash } -// <- meta.union meta.block punctuation.definition.block.end +// <- meta.union meta.block punctuation.section.block.end // Union was implemented in such a way that `union` is not a keyword. Verify // that we don't accidentally interpret it as a keyword. diff --git a/tests/syntax-rust/syntax_test_visibility.rs b/tests/syntax-rust/syntax_test_visibility.rs index 5564efcd..74b74bfd 100644 --- a/tests/syntax-rust/syntax_test_visibility.rs +++ b/tests/syntax-rust/syntax_test_visibility.rs @@ -2,23 +2,23 @@ pub ( crate ) struct S {} // <- storage.modifier -// ^ punctuation.definition.group.begin +// ^ punctuation.section.group.begin // ^^^^^ keyword.other -// ^ punctuation.definition.group.end +// ^ punctuation.section.group.end // ^^^^^^^^^^^ meta.struct pub ( in foo::bar ) union U {} -// ^ punctuation.definition.group.begin +// ^ punctuation.section.group.begin // ^^ keyword.other // ^^^^^^^^ meta.path -// ^ punctuation.definition.group.end +// ^ punctuation.section.group.end // ^^^^^^^^^^ meta.union pub ( in foo :: bar ) type T = i32; -// ^ punctuation.definition.group.begin +// ^ punctuation.section.group.begin // ^^ keyword.other // ^^^ meta.path // ^^ meta.path // ^^^ meta.path -// ^ punctuation.definition.group.end +// ^ punctuation.section.group.end // ^^^^ storage.type.type pub ( in ::foo ) fn f() {} // ^^^^^ meta.path @@ -50,17 +50,17 @@ struct S { // ^^ meta.struct variable.other.member pub(crate) f2: i32, // ^^^ meta.struct storage.modifier -// ^ meta.struct punctuation.definition.group.begin +// ^ meta.struct punctuation.section.group.begin // ^^^^^ meta.struct keyword.other -// ^ meta.struct punctuation.definition.group.end +// ^ meta.struct punctuation.section.group.end // ^^ meta.struct variable.other.member pub(in super::foo) f3: i32, // ^^^ meta.struct storage.modifier -// ^ meta.struct punctuation.definition.group.begin +// ^ meta.struct punctuation.section.group.begin // ^^ meta.struct keyword.other // ^^^^^ meta.struct keyword.other // ^^^^^ meta.struct meta.path -// ^ meta.struct punctuation.definition.group.end +// ^ meta.struct punctuation.section.group.end // ^^ meta.struct variable.other.member } @@ -70,15 +70,15 @@ struct S ( // ^^^ meta.struct storage.type pub(crate) i32, // ^^^ meta.struct storage.modifier -// ^ meta.struct punctuation.definition.group.begin +// ^ meta.struct punctuation.section.group.begin // ^^^^^ meta.struct keyword.other -// ^ meta.struct punctuation.definition.group.end +// ^ meta.struct punctuation.section.group.end // ^^^ meta.struct storage.type pub(in super) i32, // ^^^ meta.struct storage.modifier -// ^ meta.struct punctuation.definition.group.begin +// ^ meta.struct punctuation.section.group.begin // ^^ meta.struct keyword.other // ^^^^^ meta.struct keyword.other -// ^ meta.struct punctuation.definition.group.end +// ^ meta.struct punctuation.section.group.end // ^^^ meta.struct storage.type );