From 469d5cf0150ff85d5b4c8e3f95e9b1e51395540b Mon Sep 17 00:00:00 2001 From: Phil Scott Date: Sun, 1 Jun 2025 23:40:06 -0400 Subject: [PATCH] updating razor grammar --- .../razor/syntaxes/cshtml.tmLanguage.json | 1946 +++++++++++++++-- 1 file changed, 1761 insertions(+), 185 deletions(-) diff --git a/src/TextMateSharp.Grammars/Resources/Grammars/razor/syntaxes/cshtml.tmLanguage.json b/src/TextMateSharp.Grammars/Resources/Grammars/razor/syntaxes/cshtml.tmLanguage.json index c662cee..27f953e 100644 --- a/src/TextMateSharp.Grammars/Resources/Grammars/razor/syntaxes/cshtml.tmLanguage.json +++ b/src/TextMateSharp.Grammars/Resources/Grammars/razor/syntaxes/cshtml.tmLanguage.json @@ -1,341 +1,1917 @@ { "information_for_contributors": [ - "This file has been converted from https://github.com/demyte/language-cshtml/blob/master/grammars/cshtml.json", + "This file has been converted from https://github.com/dotnet/razor/blob/master/src/Razor/src/Microsoft.VisualStudio.RazorExtension/EmbeddedGrammars/aspnetcorerazor.tmLanguage.json", "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/demyte/language-cshtml/commit/e6e54d5a86a28cc1e44609a32aaa10a244cd3f81", + "version": "https://github.com/dotnet/razor/commit/9b1e979b6c3fe7cfbe30f595b9b0994d20bd482c", "name": "ASP.NET Razor", "scopeName": "text.html.cshtml", - "patterns": [ - { - "include": "#razor-directives" + "injections": { + "string.quoted.double.html": { + "patterns": [ + { + "include": "#explicit-razor-expression" + }, + { + "include": "#implicit-expression" + } + ] }, + "string.quoted.single.html": { + "patterns": [ + { + "include": "#explicit-razor-expression" + }, + { + "include": "#implicit-expression" + } + ] + } + }, + "patterns": [ { - "include": "#razor-code-block" + "include": "#razor-control-structures" }, { - "include": "#razor-else-if" + "include": "text.html.basic" + } + ], + "repository": { + "razor-control-structures": { + "patterns": [ + { + "include": "#razor-comment" + }, + { + "include": "#razor-codeblock" + }, + { + "include": "#explicit-razor-expression" + }, + { + "include": "#escaped-transition" + }, + { + "include": "#directives" + }, + { + "include": "#transitioned-csharp-control-structures" + }, + { + "include": "#implicit-expression" + } + ] }, - { - "include": "#razor-if" + "optionally-transitioned-razor-control-structures": { + "patterns": [ + { + "include": "#razor-comment" + }, + { + "include": "#razor-codeblock" + }, + { + "include": "#explicit-razor-expression" + }, + { + "include": "#escaped-transition" + }, + { + "include": "#directives" + }, + { + "include": "#optionally-transitioned-csharp-control-structures" + }, + { + "include": "#implicit-expression" + } + ] }, - { - "include": "#razor-else" + "escaped-transition": { + "name": "constant.character.escape.razor.transition", + "match": "@@" }, - { - "include": "#razor-foreach" + "transition": { + "match": "@", + "name": "keyword.control.cshtml.transition" }, - { - "include": "#explicit-razor-expression" + "razor-codeblock": { + "name": "meta.structure.razor.codeblock", + "begin": "(@)(\\{)", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.razor.directive.codeblock.open" + } + }, + "contentName": "source.cs", + "patterns": [ + { + "include": "#razor-codeblock-body" + } + ], + "end": "(\\})", + "endCaptures": { + "1": { + "name": "keyword.control.razor.directive.codeblock.close" + } + } }, - { - "include": "#implicit-razor-expression" + "razor-codeblock-body": { + "patterns": [ + { + "include": "#text-tag" + }, + { + "include": "#wellformed-html" + }, + { + "include": "#razor-single-line-markup" + }, + { + "include": "#optionally-transitioned-razor-control-structures" + }, + { + "include": "source.cs" + } + ] }, - { - "include": "text.html.basic" - } - ], - "repository": { - "comments": { - "begin": "@\\*", + "razor-single-line-markup": { + "match": "(\\@\\:)([^$]*)$", "captures": { + "1": { + "name": "keyword.control.razor.singleLineMarkup" + }, + "2": { + "patterns": [ + { + "include": "#razor-control-structures" + }, + { + "include": "text.html.basic" + } + ] + } + } + }, + "text-tag": { + "begin": "()", + "beginCaptures": { + "1": { + "name": "keyword.control.cshtml.transition.textTag.open" + } + }, + "patterns": [ + { + "include": "#wellformed-html" + }, + { + "include": "$self" + } + ], + "end": "()", + "endCaptures": { + "1": { + "name": "keyword.control.cshtml.transition.textTag.close" + } + } + }, + "razor-comment": { + "name": "meta.comment.razor", + "begin": "(@)(\\*)", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.razor.comment.star" + } + }, + "contentName": "comment.block.razor", + "end": "(\\*)(@)", + "endCaptures": { + "1": { + "name": "keyword.control.razor.comment.star" + }, + "2": { + "patterns": [ + { + "include": "#transition" + } + ] + } + } + }, + "wellformed-html": { + "patterns": [ + { + "include": "#void-tag" + }, + { + "include": "#non-void-tag" + } + ] + }, + "void-tag": { + "name": "meta.tag.structure.$3.void.html", + "begin": "(?i)(<)(!)?(area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)(?=\\s|/?>)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.begin.html" + }, + "2": { + "name": "constant.character.escape.razor.tagHelperOptOut" + }, + "3": { + "name": "entity.name.tag.html" + } + }, + "patterns": [ + { + "include": "text.html.basic#attribute" + } + ], + "end": "/?>", + "endCaptures": { + "0": { + "name": "punctuation.definition.tag.end.html" + } + } + }, + "non-void-tag": { + "begin": "(?=<(!)?([^/\\s>]+)(\\s|/?>))", + "end": "()|(/>)", + "endCaptures": { + "1": { + "name": "punctuation.definition.tag.begin.html" + }, + "2": { + "name": "entity.name.tag.html" + }, + "3": { + "name": "punctuation.definition.tag.end.html" + }, + "4": { + "name": "punctuation.definition.tag.end.html" + } + }, + "patterns": [ + { + "begin": "(<)(!)?([^/\\s>]+)(?=\\s|/?>)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.begin.html" + }, + "2": { + "name": "constant.character.escape.razor.tagHelperOptOut" + }, + "3": { + "name": "entity.name.tag.html" + } + }, + "end": "(?=/?>)", + "patterns": [ + { + "include": "#razor-control-structures" + }, + { + "include": "text.html.basic#attribute" + } + ] + }, + { + "begin": ">", + "beginCaptures": { + "0": { + "name": "punctuation.definition.tag.end.html" + } + }, + "end": "(?=\\{\\}\\)\\]'\"])" + }, + "implicit-expression-body": { + "patterns": [ + { + "include": "#implicit-expression-invocation-start" + }, + { + "include": "#implicit-expression-accessor-start" + } + ], + "end": "(?=[\\s<>\\{\\}\\)\\]'\"])" + }, + "implicit-expression-invocation-start": { + "begin": "([_[:alpha:]][_[:alnum:]]*)(?=\\()", + "beginCaptures": { + "1": { + "name": "entity.name.function.cs" + } + }, + "patterns": [ + { + "include": "#implicit-expression-continuation" + } + ], + "end": "(?=[\\s<>\\{\\}\\)\\]'\"])" + }, + "implicit-expression-accessor-start": { + "begin": "([_[:alpha:]][_[:alnum:]]*)", + "beginCaptures": { + "1": { + "name": "variable.other.object.cs" + } + }, + "patterns": [ + { + "include": "#implicit-expression-continuation" + } + ], + "end": "(?=[\\s<>\\{\\}\\)\\]'\"])" + }, + "implicit-expression-continuation": { + "patterns": [ + { + "include": "#balanced-parenthesis-csharp" + }, + { + "include": "#balanced-brackets-csharp" + }, + { + "include": "#implicit-expression-invocation" + }, + { + "include": "#implicit-expression-accessor" + }, + { + "include": "#implicit-expression-extension" + } + ], + "end": "(?=[\\s<>\\{\\}\\)\\]'\"])" + }, + "implicit-expression-accessor": { + "match": "(?<=\\.)[_[:alpha:]][_[:alnum:]]*", + "name": "variable.other.object.property.cs" + }, + "implicit-expression-invocation": { + "match": "(?<=\\.)[_[:alpha:]][_[:alnum:]]*(?=\\()", + "name": "entity.name.function.cs" + }, + "implicit-expression-operator": { + "patterns": [ + { + "include": "#implicit-expression-dot-operator" + }, + { + "include": "#implicit-expression-null-conditional-operator" + }, + { + "include": "#implicit-expression-null-forgiveness-operator" + } + ] + }, + "implicit-expression-dot-operator": { + "match": "(\\.)(?=[_[:alpha:]][_[:alnum:]]*)", + "captures": { + "1": { + "name": "punctuation.accessor.cs" + } + } + }, + "implicit-expression-null-conditional-operator": { + "match": "(\\?)(?=[.\\[])", + "captures": { + "1": { + "name": "keyword.operator.null-conditional.cs" + } + } + }, + "implicit-expression-null-forgiveness-operator": { + "match": "(\\!)(?=(?:\\.[_[:alpha:]][_[:alnum:]]*)|\\?|[\\[\\(])", + "captures": { + "1": { + "name": "keyword.operator.logical.cs" + } + } + }, + "balanced-parenthesis-csharp": { + "begin": "(\\()", + "beginCaptures": { + "1": { + "name": "punctuation.parenthesis.open.cs" + } + }, + "name": "razor.test.balanced.parenthesis", + "patterns": [ + { + "include": "source.cs" + } + ], + "end": "(\\))", + "endCaptures": { + "1": { + "name": "punctuation.parenthesis.close.cs" + } + } + }, + "balanced-brackets-csharp": { + "begin": "(\\[)", + "beginCaptures": { + "1": { + "name": "punctuation.squarebracket.open.cs" + } + }, + "name": "razor.test.balanced.brackets", + "patterns": [ + { + "include": "source.cs" + } + ], + "end": "(\\])", + "endCaptures": { + "1": { + "name": "punctuation.squarebracket.close.cs" + } + } + }, + "directives": { + "patterns": [ + { + "include": "#code-directive" + }, + { + "include": "#functions-directive" + }, + { + "include": "#page-directive" + }, + { + "include": "#addTagHelper-directive" + }, + { + "include": "#removeTagHelper-directive" + }, + { + "include": "#tagHelperPrefix-directive" + }, + { + "include": "#model-directive" + }, + { + "include": "#inherits-directive" + }, + { + "include": "#implements-directive" + }, + { + "include": "#namespace-directive" + }, + { + "include": "#inject-directive" + }, + { + "include": "#attribute-directive" + }, + { + "include": "#section-directive" + }, + { + "include": "#layout-directive" + }, + { + "include": "#using-directive" + }, + { + "include": "#rendermode-directive" + }, + { + "include": "#preservewhitespace-directive" + }, + { + "include": "#typeparam-directive" + } + ] + }, + "code-directive": { + "begin": "(@)(code)((?=\\{)|\\s+)", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.razor.directive.code" + } + }, + "patterns": [ + { + "include": "#directive-codeblock" + } + ], + "end": "(?<=})|\\s" + }, + "functions-directive": { + "begin": "(@)(functions)((?=\\{)|\\s+)", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.razor.directive.functions" + } + }, + "patterns": [ + { + "include": "#directive-codeblock" + } + ], + "end": "(?<=})|\\s" + }, + "directive-codeblock": { + "begin": "(\\{)", + "beginCaptures": { + "1": { + "name": "keyword.control.razor.directive.codeblock.open" + } + }, + "name": "meta.structure.razor.directive.codeblock", + "contentName": "source.cs", + "patterns": [ + { + "include": "source.cs#class-or-struct-members" + } + ], + "end": "(\\})", + "endCaptures": { + "1": { + "name": "keyword.control.razor.directive.codeblock.close" + } + } + }, + "page-directive": { + "name": "meta.directive", + "match": "(@)(page)\\s+([^$]+)?", + "captures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.razor.directive.page" + }, + "3": { + "patterns": [ + { + "include": "source.cs#string-literal" + } + ] + } + } + }, + "addTagHelper-directive": { + "name": "meta.directive", + "match": "(@)(addTagHelper)\\s+([^$]+)?", + "captures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.razor.directive.addTagHelper" + }, + "3": { + "patterns": [ + { + "include": "#tagHelper-directive-argument" + } + ] + } + } + }, + "removeTagHelper-directive": { + "name": "meta.directive", + "match": "(@)(removeTagHelper)\\s+([^$]+)?", + "captures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.razor.directive.removeTagHelper" + }, + "3": { + "patterns": [ + { + "include": "#tagHelper-directive-argument" + } + ] + } + } + }, + "tagHelperPrefix-directive": { + "name": "meta.directive", + "match": "(@)(tagHelperPrefix)\\s+([^$]+)?", + "captures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.razor.directive.tagHelperPrefix" + }, + "3": { + "patterns": [ + { + "include": "#tagHelper-directive-argument" + } + ] + } + } + }, + "tagHelper-directive-argument": { + "patterns": [ + { + "include": "source.cs#string-literal" + }, + { + "include": "#unquoted-string-argument" + } + ] + }, + "unquoted-string-argument": { + "name": "string.quoted.double.cs", + "match": "[^$]+" + }, + "model-directive": { + "name": "meta.directive", + "match": "(@)(model)\\s+([^$]+)?", + "captures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.razor.directive.model" + }, + "3": { + "patterns": [ + { + "include": "source.cs#type" + } + ] + } + } + }, + "inherits-directive": { + "name": "meta.directive", + "match": "(@)(inherits)\\s+([^$]+)?", + "captures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.razor.directive.inherits" + }, + "3": { + "patterns": [ + { + "include": "source.cs#type" + } + ] + } + } + }, + "implements-directive": { + "name": "meta.directive", + "match": "(@)(implements)\\s+([^$]+)?", + "captures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.razor.directive.implements" + }, + "3": { + "patterns": [ + { + "include": "source.cs#type" + } + ] + } + } + }, + "layout-directive": { + "name": "meta.directive", + "match": "(@)(layout)\\s+([^$]+)?", + "captures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.razor.directive.layout" + }, + "3": { + "patterns": [ + { + "include": "source.cs#type" + } + ] + } + } + }, + "namespace-directive": { + "name": "meta.directive", + "match": "(@)(namespace)\\s+([^\\s]+)?", + "captures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.razor.directive.namespace" + }, + "3": { + "patterns": [ + { + "include": "#namespace-directive-argument" + } + ] + } + } + }, + "namespace-directive-argument": { + "match": "([_[:alpha:]][_[:alnum:]]*)(\\.)?", + "captures": { + "1": { + "name": "entity.name.type.namespace.cs" + }, + "2": { + "name": "punctuation.accessor.cs" + } + } + }, + "inject-directive": { + "name": "meta.directive", + "match": "(@)(inject)\\s*([\\S\\s]+?)?\\s*([_[:alpha:]][_[:alnum:]]*)?\\s*(?=$)", + "captures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.razor.directive.inject" + }, + "3": { + "patterns": [ + { + "include": "source.cs#type" + } + ] + }, + "4": { + "name": "entity.name.variable.property.cs" + } + } + }, + "rendermode-directive": { + "name": "meta.directive", + "match": "(@)(rendermode)\\s+([^$]+)?", + "captures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.razor.directive.rendermode" + }, + "3": { + "patterns": [ + { + "include": "source.cs#type" + } + ] + } + } + }, + "preservewhitespace-directive": { + "name": "meta.directive", + "match": "(@)(preservewhitespace)\\s+([^$]+)?", + "captures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.razor.directive.preservewhitespace" + }, + "3": { + "patterns": [ + { + "include": "source.cs#boolean-literal" + } + ] + } + } + }, + "typeparam-directive": { + "name": "meta.directive", + "match": "(@)(typeparam)\\s+([^$]+)?", + "captures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.razor.directive.typeparam" + }, + "3": { + "patterns": [ + { + "include": "source.cs#type" + } + ] + } + } + }, + "attribute-directive": { + "name": "meta.directive", + "begin": "(@)(attribute)\\b\\s+", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.razor.directive.attribute" + } + }, + "patterns": [ + { + "include": "source.cs#attribute-section" + } + ], + "end": "(?<=\\])|$" + }, + "section-directive": { + "name": "meta.directive.block", + "begin": "(@)(section)\\b\\s+([_[:alpha:]][_[:alnum:]]*)?", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.razor.directive.section" + }, + "3": { + "name": "variable.other.razor.directive.sectionName" + } + }, + "patterns": [ + { + "include": "#directive-markupblock" + } + ], + "end": "(?<=})" + }, + "directive-markupblock": { + "name": "meta.structure.razor.directive.markblock", + "begin": "(\\{)", + "beginCaptures": { + "1": { + "name": "keyword.control.razor.directive.codeblock.open" + } + }, + "patterns": [ + { + "include": "$self" + } + ], + "end": "(\\})", + "endCaptures": { + "1": { + "name": "keyword.control.razor.directive.codeblock.close" + } + } + }, + "using-directive": { + "name": "meta.directive", + "match": "(@)(using)\\b\\s+(?!\\(|\\s)(.+?)?(;)?$", + "captures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.other.using.cs" + }, + "3": { + "patterns": [ + { + "include": "#using-static-directive" + }, + { + "include": "#using-alias-directive" + }, + { + "include": "#using-standard-directive" + } + ] + }, + "4": { + "name": "keyword.control.razor.optionalSemicolon" + } + } + }, + "using-static-directive": { + "match": "(static)\\b\\s+(.+)", + "captures": { + "1": { + "name": "keyword.other.static.cs" + }, + "2": { + "patterns": [ + { + "include": "source.cs#type" + } + ] + } + } + }, + "using-alias-directive": { + "match": "([_[:alpha:]][_[:alnum:]]*)\\b\\s*(=)\\s*(.+)\\s*", + "captures": { + "1": { + "name": "entity.name.type.alias.cs" + }, + "2": { + "name": "keyword.operator.assignment.cs" + }, + "3": { + "patterns": [ + { + "include": "source.cs#type" + } + ] + } + } + }, + "using-standard-directive": { + "match": "([_[:alpha:]][_[:alnum:]]*)\\s*", + "captures": { + "1": { + "name": "entity.name.type.namespace.cs" + } + } + }, + "optionally-transitioned-csharp-control-structures": { + "patterns": [ + { + "include": "#using-statement-with-optional-transition" + }, + { + "include": "#if-statement-with-optional-transition" + }, + { + "include": "#else-part" + }, + { + "include": "#foreach-statement-with-optional-transition" + }, + { + "include": "#for-statement-with-optional-transition" + }, + { + "include": "#while-statement" + }, + { + "include": "#switch-statement-with-optional-transition" + }, + { + "include": "#lock-statement-with-optional-transition" + }, + { + "include": "#do-statement-with-optional-transition" + }, + { + "include": "#try-statement-with-optional-transition" + } + ] + }, + "transitioned-csharp-control-structures": { + "patterns": [ + { + "include": "#using-statement" + }, + { + "include": "#if-statement" + }, + { + "include": "#else-part" + }, + { + "include": "#foreach-statement" + }, + { + "include": "#for-statement" + }, + { + "include": "#while-statement" + }, + { + "include": "#switch-statement" + }, + { + "include": "#lock-statement" + }, + { + "include": "#do-statement" + }, + { + "include": "#try-statement" + } + ] + }, + "using-statement": { + "name": "meta.statement.using.razor", + "begin": "(?:(@))(using)\\b\\s*(?=\\()", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.other.using.cs" + } + }, + "patterns": [ + { + "include": "#csharp-condition" + }, + { + "include": "#csharp-code-block" + }, + { + "include": "#razor-codeblock-body" + } + ], + "end": "(?<=})" + }, + "using-statement-with-optional-transition": { + "name": "meta.statement.using.razor", + "begin": "(?:^\\s*|(@))(using)\\b\\s*(?=\\()", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.other.using.cs" + } + }, + "patterns": [ + { + "include": "#csharp-condition" + }, + { + "include": "#csharp-code-block" + }, + { + "include": "#razor-codeblock-body" + } + ], + "end": "(?<=})" + }, + "if-statement": { + "name": "meta.statement.if.razor", + "begin": "(?:(@))(if)\\b\\s*(?=\\()", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.conditional.if.cs" + } + }, + "patterns": [ + { + "include": "#csharp-condition" + }, + { + "include": "#csharp-code-block" + }, + { + "include": "#razor-codeblock-body" + } + ], + "end": "(?<=})" + }, + "if-statement-with-optional-transition": { + "name": "meta.statement.if.razor", + "begin": "(?:^\\s*|(@))(if)\\b\\s*(?=\\()", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.conditional.if.cs" + } + }, + "patterns": [ + { + "include": "#csharp-condition" + }, + { + "include": "#csharp-code-block" + }, + { + "include": "#razor-codeblock-body" + } + ], + "end": "(?<=})" + }, + "else-part": { + "name": "meta.statement.else.razor", + "begin": "(?:^|(?<=}))\\s*(else)\\b\\s*?(?: (if))?\\s*?(?=[\\n\\(\\{])", + "beginCaptures": { + "1": { + "name": "keyword.control.conditional.else.cs" + }, + "2": { + "name": "keyword.control.conditional.if.cs" + } + }, + "patterns": [ + { + "include": "#csharp-condition" + }, + { + "include": "#csharp-code-block" + }, + { + "include": "#razor-codeblock-body" + } + ], + "end": "(?<=})" + }, + "for-statement": { + "name": "meta.statement.for.razor", + "begin": "(?:(@))(for)\\b\\s*(?=\\()", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.loop.for.cs" } }, - "end": "\\*@", - "name": "comment.block.cshtml" - }, - "razor-directives": { - "name": "meta.directive.cshtml", "patterns": [ { - "include": "#using-directive" + "include": "#csharp-condition" }, { - "include": "#model-directive" + "include": "#csharp-code-block" }, { - "include": "#inherits-directive" + "include": "#razor-codeblock-body" + } + ], + "end": "(?<=})" + }, + "for-statement-with-optional-transition": { + "name": "meta.statement.for.razor", + "begin": "(?:^\\s*|(@))(for)\\b\\s*(?=\\()", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] }, + "2": { + "name": "keyword.control.loop.for.cs" + } + }, + "patterns": [ { - "include": "#inject-directive" + "include": "#csharp-condition" }, { - "include": "#implements-directive" + "include": "#csharp-code-block" }, { - "include": "#layout-directive" + "include": "#razor-codeblock-body" + } + ], + "end": "(?<=})" + }, + "foreach-statement": { + "name": "meta.statement.foreach.razor", + "begin": "(?:(@)(await\\s+)?)(foreach)\\b\\s*(?=\\()", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "patterns": [ + { + "include": "#await-prefix" + } + ] + }, + "3": { + "name": "keyword.control.loop.foreach.cs" + } + }, + "patterns": [ + { + "include": "#foreach-condition" }, { - "include": "#page-directive" + "include": "#csharp-code-block" }, { - "include": "#functions-directive" + "include": "#razor-codeblock-body" } - ] + ], + "end": "(?<=})" }, - "explicit-razor-expression": { - "name": "meta.expression.explicit.cshtml", - "begin": "(@)\\(", - "captures": { - "0": { - "name": "keyword.control.cshtml" + "foreach-statement-with-optional-transition": { + "name": "meta.statement.foreach.razor", + "begin": "(?:^\\s*|(@)(await\\s+)?)(foreach)\\b\\s*(?=\\()", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "patterns": [ + { + "include": "#await-prefix" + } + ] + }, + "3": { + "name": "keyword.control.loop.foreach.cs" } }, "patterns": [ { - "include": "source.cs" + "include": "#foreach-condition" + }, + { + "include": "#csharp-code-block" + }, + { + "include": "#razor-codeblock-body" } ], - "end": "\\)" + "end": "(?<=})" }, - "implicit-razor-expression": { - "name": "meta.expression.implicit.cshtml", - "begin": "(@)([a-zA-Z0-9\\.\\_\\(\\)]+)", - "captures": { + "foreach-condition": { + "begin": "\\(", + "beginCaptures": { "0": { - "name": "keyword.control.cshtml" + "name": "punctuation.parenthesis.open.cs" } }, - "end": "$" - }, - "using-directive": { - "name": "meta.directive.using.cshtml", - "begin": "(@using)\\s+", - "captures": { + "end": "\\)", + "endCaptures": { "0": { - "name": "keyword.control.cshtml" + "name": "punctuation.parenthesis.close.cs" } }, "patterns": [ { - "include": "#csharp-namespace-identifier" + "match": "(?x)\n(?:\n (\\bvar\\b)|\n (?\n (?:\n (?:\n (?:(?@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (? # identifier + type arguments (if any)\n \\g\\s*\n (?\\s*<(?:[^<>]|\\g)+>\\s*)?\n )\n (?:\\s*\\.\\s*\\g)* | # Are there any more names being dotted into?\n (?\\s*\\((?:[^\\(\\)]|\\g)+\\))\n )\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n )\n)\\s+\n(\\g)\\s+\n\\b(in)\\b", + "captures": { + "1": { + "name": "keyword.other.var.cs" + }, + "2": { + "patterns": [ + { + "include": "source.cs#type" + } + ] + }, + "7": { + "name": "entity.name.variable.local.cs" + }, + "8": { + "name": "keyword.control.loop.in.cs" + } + } + }, + { + "match": "(?x) # match foreach (var (x, y) in ...)\n(?:\\b(var)\\b\\s*)?\n(?\\((?:[^\\(\\)]|\\g)+\\))\\s+\n\\b(in)\\b", + "captures": { + "1": { + "name": "keyword.other.var.cs" + }, + "2": { + "patterns": [ + { + "include": "source.cs#tuple-declaration-deconstruction-element-list" + } + ] + }, + "3": { + "name": "keyword.control.loop.in.cs" + } + } + }, + { + "include": "source.cs#expression" } - ], - "end": "$" + ] }, - "model-directive": { - "name": "meta.directive.model.cshtml", - "begin": "(@model)\\s+", - "captures": { - "0": { - "name": "keyword.control.cshtml" + "do-statement": { + "name": "meta.statement.do.razor", + "begin": "(?:(@))(do)\\b\\s", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.loop.do.cs" } }, "patterns": [ { - "include": "#csharp-type-name" + "include": "#csharp-condition" + }, + { + "include": "#csharp-code-block" + }, + { + "include": "#razor-codeblock-body" } ], - "end": "$" + "end": "(?<=})" }, - "inherits-directive": { - "name": "meta.directive.inherits.cshtml", - "begin": "(@inherits)\\s+", - "captures": { - "0": { - "name": "keyword.control.cshtml" + "do-statement-with-optional-transition": { + "name": "meta.statement.do.razor", + "begin": "(?:^\\s*|(@))(do)\\b\\s", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.loop.do.cs" } }, "patterns": [ { - "include": "#csharp-type-name" + "include": "#csharp-condition" + }, + { + "include": "#csharp-code-block" + }, + { + "include": "#razor-codeblock-body" } ], - "end": "$" + "end": "(?<=})" }, - "inject-directive": { - "name": "meta.directive.inject.cshtml", - "begin": "(@inject)\\s+", - "captures": { - "0": { - "name": "keyword.control.cshtml" + "while-statement": { + "name": "meta.statement.while.razor", + "begin": "(?:(@)|^\\s*|(?<=})\\s*)(while)\\b\\s*(?=\\()", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.loop.while.cs" } }, "patterns": [ { - "include": "#csharp-type-name" + "include": "#csharp-condition" + }, + { + "include": "#csharp-code-block" + }, + { + "include": "#razor-codeblock-body" } ], - "end": "$" + "end": "(?<=})|(;)", + "endCaptures": { + "1": { + "name": "punctuation.terminator.statement.cs" + } + } }, - "implements-directive": { - "name": "meta.directive.implements.cshtml", - "begin": "(@implements)\\s+", - "captures": { - "0": { - "name": "keyword.control.cshtml" + "switch-statement": { + "name": "meta.statement.switch.razor", + "begin": "(?:(@))(switch)\\b\\s*(?=\\()", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.switch.cs" } }, "patterns": [ { - "include": "#csharp-type-name" + "include": "#csharp-condition" + }, + { + "include": "#switch-code-block" + }, + { + "include": "#razor-codeblock-body" } ], - "end": "$" + "end": "(?<=})" }, - "layout-directive": { - "name": "meta.directive.layout.cshtml", - "begin": "(@layout)\\s+", - "captures": { - "0": { - "name": "keyword.control.cshtml" + "switch-statement-with-optional-transition": { + "name": "meta.statement.switch.razor", + "begin": "(?:^\\s*|(@))(switch)\\b\\s*(?=\\()", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.switch.cs" } }, "patterns": [ { - "include": "#csharp-type-name" + "include": "#csharp-condition" + }, + { + "include": "#switch-code-block" + }, + { + "include": "#razor-codeblock-body" } ], - "end": "$" + "end": "(?<=})" }, - "page-directive": { - "name": "meta.directive.page.cshtml", - "begin": "(@page)\\s+", - "captures": { - "0": { - "name": "keyword.control.cshtml" + "switch-code-block": { + "name": "meta.structure.razor.csharp.codeblock.switch", + "begin": "(\\{)", + "beginCaptures": { + "1": { + "name": "punctuation.curlybrace.open.cs" } }, "patterns": [ { - "include": "source.cs" + "include": "source.cs#switch-label" + }, + { + "include": "#csharp-code-block" + }, + { + "include": "#razor-codeblock-body" } ], - "end": "$" - }, - "functions-directive": { - "name": "meta.directive.functions.cshtml", - "match": "(@functions)", - "captures": { - "0": { - "name": "keyword.control.cshtml" + "end": "(\\})", + "endCaptures": { + "1": { + "name": "punctuation.curlybrace.close.cs" } } }, - "razor-if": { - "begin": "(@if)", - "captures": { - "0": { - "name": "keyword.control.cshtml" + "lock-statement": { + "name": "meta.statement.lock.razor", + "begin": "(?:(@))(lock)\\b\\s*(?=\\()", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.other.lock.cs" } }, "patterns": [ { - "include": "source.cs" + "include": "#csharp-condition" + }, + { + "include": "#csharp-code-block" + }, + { + "include": "#razor-codeblock-body" } ], - "end": "$" + "end": "(?<=})" }, - "razor-else": { - "begin": "(else)", - "captures": { - "0": { - "name": "keyword.control.cshtml" + "lock-statement-with-optional-transition": { + "name": "meta.statement.lock.razor", + "begin": "(?:^\\s*|(@))(lock)\\b\\s*(?=\\()", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.other.lock.cs" } }, "patterns": [ { - "include": "source.cs" + "include": "#csharp-condition" + }, + { + "include": "#csharp-code-block" + }, + { + "include": "#razor-codeblock-body" } ], - "end": "$" + "end": "(?<=})" }, - "razor-else-if": { - "begin": "(else\\s+if)", - "captures": { - "0": { - "name": "keyword.control.cshtml" + "try-statement": { + "patterns": [ + { + "include": "#try-block" + }, + { + "include": "#catch-clause" + }, + { + "include": "#finally-clause" } - }, + ] + }, + "try-statement-with-optional-transition": { "patterns": [ { - "include": "source.cs" + "include": "#try-block-with-optional-transition" + }, + { + "include": "#catch-clause" + }, + { + "include": "#finally-clause" } - ], - "end": "$" + ] }, - "razor-foreach": { - "begin": "(@foreach)\\s+\\(", - "captures": { - "0": { - "name": "keyword.control.cshtml" + "try-block": { + "name": "meta.statement.try.razor", + "begin": "(?:(@))(try)\\b\\s*", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.try.cs" } }, "patterns": [ { - "include": "source.cs" + "include": "#csharp-condition" + }, + { + "include": "#csharp-code-block" + }, + { + "include": "#razor-codeblock-body" } ], - "end": "\\)" + "end": "(?<=})" }, - "razor-code-block": { - "begin": "@?\\{", - "captures": { - "0": { - "name": "keyword.control.cshtml" + "try-block-with-optional-transition": { + "name": "meta.statement.try.razor", + "begin": "(?:^\\s*|(@))(try)\\b\\s*", + "beginCaptures": { + "1": { + "patterns": [ + { + "include": "#transition" + } + ] + }, + "2": { + "name": "keyword.control.try.cs" } }, "patterns": [ { - "include": "text.html.cshtml" + "include": "#csharp-condition" }, { - "include": "source.cs" + "include": "#csharp-code-block" + }, + { + "include": "#razor-codeblock-body" } ], - "end": "\\}" + "end": "(?<=})" }, - "csharp-namespace-identifier": { + "catch-clause": { + "name": "meta.statement.catch.razor", + "begin": "(?:^|(?<=}))\\s*(catch)\\b\\s*?(?=[\\n\\(\\{])", + "beginCaptures": { + "1": { + "name": "keyword.control.try.catch.cs" + } + }, "patterns": [ { - "name": "entity.name.type.namespace.cs", - "match": "[_[:alpha:]][_[:alnum:]]*" + "include": "#catch-condition" + }, + { + "include": "source.cs#when-clause" + }, + { + "include": "#csharp-code-block" + }, + { + "include": "#razor-codeblock-body" } - ] + ], + "end": "(?<=})" }, - "csharp-type-name": { + "catch-condition": { + "begin": "\\(", + "beginCaptures": { + "0": { + "name": "punctuation.parenthesis.open.cs" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.parenthesis.close.cs" + } + }, "patterns": [ { - "match": "([_[:alpha:]][_[:alnum:]]*)\\s*(\\:\\:)", + "match": "(?x)\n(?\n (?:\n (?:\n (?:(?@?[_[:alpha:]][_[:alnum:]]*)\\s*\\:\\:\\s*)? # alias-qualification\n (? # identifier + type arguments (if any)\n \\g\\s*\n (?\\s*<(?:[^<>]|\\g)+>\\s*)?\n )\n (?:\\s*\\.\\s*\\g)* | # Are there any more names being dotted into?\n (?\\s*\\((?:[^\\(\\)]|\\g)+\\))\n )\n (?:\\s*\\?\\s*)? # nullable suffix?\n (?:\\s*\\[(?:\\s*,\\s*)*\\]\\s*)* # array suffix?\n )\n)\\s*\n(?:(\\g)\\b)?", "captures": { "1": { - "name": "entity.name.type.alias.cs" + "patterns": [ + { + "include": "source.cs#type" + } + ] }, - "2": { - "name": "punctuation.separator.coloncolon.cs" + "6": { + "name": "entity.name.variable.local.cs" } } + } + ] + }, + "finally-clause": { + "name": "meta.statement.finally.razor", + "begin": "(?:^|(?<=}))\\s*(finally)\\b\\s*?(?=[\\n\\{])", + "beginCaptures": { + "1": { + "name": "keyword.control.try.finally.cs" + } + }, + "patterns": [ + { + "include": "#csharp-code-block" }, { - "match": "([_[:alpha:]][_[:alnum:]]*)\\s*(\\.)", - "captures": { - "1": { - "name": "storage.type.cs" - }, - "2": { - "name": "punctuation.accessor.cs" - } - } + "include": "#razor-codeblock-body" + } + ], + "end": "(?<=})" + }, + "await-prefix": { + "name": "keyword.other.await.cs", + "match": "(await)\\s+" + }, + "csharp-code-block": { + "name": "meta.structure.razor.csharp.codeblock", + "begin": "(\\{)", + "beginCaptures": { + "1": { + "name": "punctuation.curlybrace.open.cs" + } + }, + "patterns": [ + { + "include": "#razor-codeblock-body" + } + ], + "end": "(\\})", + "endCaptures": { + "1": { + "name": "punctuation.curlybrace.close.cs" + } + } + }, + "csharp-condition": { + "begin": "(\\()", + "beginCaptures": { + "1": { + "name": "punctuation.parenthesis.open.cs" + } + }, + "patterns": [ + { + "include": "source.cs#local-variable-declaration" }, { - "match": "(\\.)\\s*([_[:alpha:]][_[:alnum:]]*)", - "captures": { - "1": { - "name": "punctuation.accessor.cs" - }, - "2": { - "name": "storage.type.cs" - } - } + "include": "source.cs#expression" + }, + { + "include": "source.cs#punctuation-comma" }, { - "name": "storage.type.cs", - "match": "[_[:alpha:]][_[:alnum:]]*" + "include": "source.cs#punctuation-semicolon" } - ] + ], + "end": "(\\))", + "endCaptures": { + "1": { + "name": "punctuation.parenthesis.close.cs" + } + } } } } \ No newline at end of file