Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add grammar support for new directives: rendermode, preservewhitespace and typeparam #6887

Merged
merged 4 commits into from Feb 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
78 changes: 78 additions & 0 deletions src/razor/syntaxes/aspnetcorerazor.tmLanguage.json
Expand Up @@ -525,6 +525,15 @@
},
{
"include": "#using-directive"
},
{
"include": "#rendermode-directive"
},
{
"include": "#preservewhitespace-directive"
},
{
"include": "#typeparam-directive"
}
]
},
Expand Down Expand Up @@ -849,6 +858,75 @@
}
}
},
"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+",
Expand Down
35 changes: 34 additions & 1 deletion src/razor/syntaxes/aspnetcorerazor.tmLanguage.yml
Expand Up @@ -281,6 +281,9 @@ repository:
- include: '#section-directive'
- include: '#layout-directive'
- include: '#using-directive'
- include: '#rendermode-directive'
- include: '#preservewhitespace-directive'
- include: '#typeparam-directive'

#>>>>> @code and @functions <<<<<

Expand Down Expand Up @@ -420,6 +423,36 @@ repository:
3: { patterns: [ include: 'source.cs#type' ] }
4: { name: 'entity.name.variable.property.cs' }

#>>>>> @rendermode <<<<<

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 <<<<<

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 <<<<<

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 <<<<<

attribute-directive:
Expand Down Expand Up @@ -925,4 +958,4 @@ repository:
- include: 'source.cs#punctuation-semicolon'
end: '(\))'
endCaptures:
1: { name: 'punctuation.parenthesis.close.cs' }
1: { name: 'punctuation.parenthesis.close.cs' }
Expand Up @@ -2820,6 +2820,58 @@ exports[`Grammar tests @page directive Routed spaced 1`] = `
"
`;

exports[`Grammar tests @preservewhitespace directive Bool provided (false) 1`] = `
"Line: @preservewhitespace false
- token from 0 to 1 (@) with scopes text.aspnetcorerazor, meta.directive, keyword.control.cshtml.transition
- token from 1 to 19 (preservewhitespace) with scopes text.aspnetcorerazor, meta.directive, keyword.control.razor.directive.preservewhitespace
- token from 19 to 20 ( ) with scopes text.aspnetcorerazor, meta.directive
- token from 20 to 25 (false) with scopes text.aspnetcorerazor, meta.directive, constant.language.boolean.false.cs
"
`;

exports[`Grammar tests @preservewhitespace directive Bool provided (true) 1`] = `
"Line: @preservewhitespace true
- token from 0 to 1 (@) with scopes text.aspnetcorerazor, meta.directive, keyword.control.cshtml.transition
- token from 1 to 19 (preservewhitespace) with scopes text.aspnetcorerazor, meta.directive, keyword.control.razor.directive.preservewhitespace
- token from 19 to 20 ( ) with scopes text.aspnetcorerazor, meta.directive
- token from 20 to 24 (true) with scopes text.aspnetcorerazor, meta.directive, constant.language.boolean.true.cs
"
`;

exports[`Grammar tests @preservewhitespace directive Bool provided spaced 1`] = `
"Line: @preservewhitespace false
- token from 0 to 1 (@) with scopes text.aspnetcorerazor, meta.directive, keyword.control.cshtml.transition
- token from 1 to 19 (preservewhitespace) with scopes text.aspnetcorerazor, meta.directive, keyword.control.razor.directive.preservewhitespace
- token from 19 to 33 ( ) with scopes text.aspnetcorerazor, meta.directive
- token from 33 to 38 (false) with scopes text.aspnetcorerazor, meta.directive, constant.language.boolean.false.cs
- token from 38 to 48 ( ) with scopes text.aspnetcorerazor, meta.directive
"
`;

exports[`Grammar tests @preservewhitespace directive Incomplete bool 1`] = `
"Line: @preservewhitespace fal
- token from 0 to 1 (@) with scopes text.aspnetcorerazor, meta.directive, keyword.control.cshtml.transition
- token from 1 to 19 (preservewhitespace) with scopes text.aspnetcorerazor, meta.directive, keyword.control.razor.directive.preservewhitespace
- token from 19 to 20 ( ) with scopes text.aspnetcorerazor, meta.directive
- token from 20 to 24 (fal) with scopes text.aspnetcorerazor, meta.directive
"
`;

exports[`Grammar tests @preservewhitespace directive No bool 1`] = `
"Line: @preservewhitespace
- token from 0 to 1 (@) with scopes text.aspnetcorerazor, meta.directive, keyword.control.cshtml.transition
- token from 1 to 19 (preservewhitespace) with scopes text.aspnetcorerazor, meta.directive, keyword.control.razor.directive.preservewhitespace
"
`;

exports[`Grammar tests @preservewhitespace directive No bool spaced 1`] = `
"Line: @preservewhitespace
- token from 0 to 1 (@) with scopes text.aspnetcorerazor, meta.directive, keyword.control.cshtml.transition
- token from 1 to 19 (preservewhitespace) with scopes text.aspnetcorerazor, meta.directive, keyword.control.razor.directive.preservewhitespace
- token from 19 to 34 ( ) with scopes text.aspnetcorerazor, meta.directive
"
`;

exports[`Grammar tests @removeTagHelper directive Incomplete parameter 1`] = `
"Line: @removeTagHelper "
- token from 0 to 1 (@) with scopes text.aspnetcorerazor, meta.directive, keyword.control.cshtml.transition
Expand Down Expand Up @@ -2876,6 +2928,49 @@ exports[`Grammar tests @removeTagHelper directive Unquoted parameter 1`] = `
"
`;

exports[`Grammar tests @rendermode directive Incomplete mode 1`] = `
"Line: @rendermode InteractiveWebAssemb
- token from 0 to 1 (@) with scopes text.aspnetcorerazor, meta.directive, keyword.control.cshtml.transition
- token from 1 to 11 (rendermode) with scopes text.aspnetcorerazor, meta.directive, keyword.control.razor.directive.rendermode
- token from 11 to 12 ( ) with scopes text.aspnetcorerazor, meta.directive
- token from 12 to 32 (InteractiveWebAssemb) with scopes text.aspnetcorerazor, meta.directive, entity.name.type.cs
"
`;

exports[`Grammar tests @rendermode directive Mode provided 1`] = `
"Line: @rendermode InteractiveServer
- token from 0 to 1 (@) with scopes text.aspnetcorerazor, meta.directive, keyword.control.cshtml.transition
- token from 1 to 11 (rendermode) with scopes text.aspnetcorerazor, meta.directive, keyword.control.razor.directive.rendermode
- token from 11 to 12 ( ) with scopes text.aspnetcorerazor, meta.directive
- token from 12 to 29 (InteractiveServer) with scopes text.aspnetcorerazor, meta.directive, entity.name.type.cs
"
`;

exports[`Grammar tests @rendermode directive Mode provided spaced 1`] = `
"Line: @rendermode InteractiveAuto
- token from 0 to 1 (@) with scopes text.aspnetcorerazor, meta.directive, keyword.control.cshtml.transition
- token from 1 to 11 (rendermode) with scopes text.aspnetcorerazor, meta.directive, keyword.control.razor.directive.rendermode
- token from 11 to 25 ( ) with scopes text.aspnetcorerazor, meta.directive
- token from 25 to 40 (InteractiveAuto) with scopes text.aspnetcorerazor, meta.directive, entity.name.type.cs
- token from 40 to 50 ( ) with scopes text.aspnetcorerazor, meta.directive
"
`;

exports[`Grammar tests @rendermode directive No mode 1`] = `
"Line: @rendermode
- token from 0 to 1 (@) with scopes text.aspnetcorerazor, meta.directive, keyword.control.cshtml.transition
- token from 1 to 11 (rendermode) with scopes text.aspnetcorerazor, meta.directive, keyword.control.razor.directive.rendermode
"
`;

exports[`Grammar tests @rendermode directive No mode spaced 1`] = `
"Line: @rendermode
- token from 0 to 1 (@) with scopes text.aspnetcorerazor, meta.directive, keyword.control.cshtml.transition
- token from 1 to 11 (rendermode) with scopes text.aspnetcorerazor, meta.directive, keyword.control.razor.directive.rendermode
- token from 11 to 26 ( ) with scopes text.aspnetcorerazor, meta.directive
"
`;

exports[`Grammar tests @section directive As C# local 1`] = `
"Line: @section.method()
- token from 0 to 1 (@) with scopes text.aspnetcorerazor, meta.expression.implicit.cshtml, keyword.control.cshtml.transition
Expand Down Expand Up @@ -3661,6 +3756,63 @@ exports[`Grammar tests @try { ... } catch/finally { ... } Single line 1`] = `
"
`;

exports[`Grammar tests @typeparam directive Complete type, generic 1`] = `
"Line: @typeparam SomeViewBase<string>
- token from 0 to 1 (@) with scopes text.aspnetcorerazor, meta.directive, keyword.control.cshtml.transition
- token from 1 to 10 (typeparam) with scopes text.aspnetcorerazor, meta.directive, keyword.control.razor.directive.typeparam
- token from 10 to 11 ( ) with scopes text.aspnetcorerazor, meta.directive
- token from 11 to 23 (SomeViewBase) with scopes text.aspnetcorerazor, meta.directive, entity.name.type.cs
- token from 23 to 24 (<) with scopes text.aspnetcorerazor, meta.directive, punctuation.definition.typeparameters.begin.cs
- token from 24 to 30 (string) with scopes text.aspnetcorerazor, meta.directive, keyword.type.cs
- token from 30 to 31 (>) with scopes text.aspnetcorerazor, meta.directive, punctuation.definition.typeparameters.end.cs
"
`;

exports[`Grammar tests @typeparam directive Incomplete type, generic 1`] = `
"Line: @typeparam SomeViewBase<string
- token from 0 to 1 (@) with scopes text.aspnetcorerazor, meta.directive, keyword.control.cshtml.transition
- token from 1 to 10 (typeparam) with scopes text.aspnetcorerazor, meta.directive, keyword.control.razor.directive.typeparam
- token from 10 to 11 ( ) with scopes text.aspnetcorerazor, meta.directive
- token from 11 to 23 (SomeViewBase) with scopes text.aspnetcorerazor, meta.directive, entity.name.type.cs
- token from 23 to 24 (<) with scopes text.aspnetcorerazor, meta.directive, punctuation.definition.typeparameters.begin.cs
- token from 24 to 30 (string) with scopes text.aspnetcorerazor, meta.directive, keyword.type.cs
"
`;

exports[`Grammar tests @typeparam directive No type 1`] = `
"Line: @typeparam
- token from 0 to 1 (@) with scopes text.aspnetcorerazor, meta.directive, keyword.control.cshtml.transition
- token from 1 to 10 (typeparam) with scopes text.aspnetcorerazor, meta.directive, keyword.control.razor.directive.typeparam
"
`;

exports[`Grammar tests @typeparam directive No type spaced 1`] = `
"Line: @typeparam
- token from 0 to 1 (@) with scopes text.aspnetcorerazor, meta.directive, keyword.control.cshtml.transition
- token from 1 to 10 (typeparam) with scopes text.aspnetcorerazor, meta.directive, keyword.control.razor.directive.typeparam
- token from 10 to 25 ( ) with scopes text.aspnetcorerazor, meta.directive
"
`;

exports[`Grammar tests @typeparam directive Type provided 1`] = `
"Line: @typeparam Person
- token from 0 to 1 (@) with scopes text.aspnetcorerazor, meta.directive, keyword.control.cshtml.transition
- token from 1 to 10 (typeparam) with scopes text.aspnetcorerazor, meta.directive, keyword.control.razor.directive.typeparam
- token from 10 to 11 ( ) with scopes text.aspnetcorerazor, meta.directive
- token from 11 to 17 (Person) with scopes text.aspnetcorerazor, meta.directive, entity.name.type.cs
"
`;

exports[`Grammar tests @typeparam directive Type provided spaced 1`] = `
"Line: @typeparam Person
- token from 0 to 1 (@) with scopes text.aspnetcorerazor, meta.directive, keyword.control.cshtml.transition
- token from 1 to 10 (typeparam) with scopes text.aspnetcorerazor, meta.directive, keyword.control.razor.directive.typeparam
- token from 10 to 24 ( ) with scopes text.aspnetcorerazor, meta.directive
- token from 24 to 30 (Person) with scopes text.aspnetcorerazor, meta.directive, entity.name.type.cs
- token from 30 to 40 ( ) with scopes text.aspnetcorerazor, meta.directive
"
`;

exports[`Grammar tests @using ( ... ) { ... } Incomplete using statement, no condition 1`] = `
"Line: @using {}
- token from 0 to 1 (@) with scopes text.aspnetcorerazor, meta.directive, keyword.control.cshtml.transition
Expand Down
Expand Up @@ -39,6 +39,9 @@ import { RunTryStatementSuite } from './tryStatement';
import { RunUsingDirectiveSuite } from './usingDirective';
import { RunUsingStatementSuite } from './usingStatement';
import { RunWhileStatementSuite } from './whileStatement';
import { RunRendermodeDirectiveSuite } from './rendermodeDirective';
import { RunPreservewhitespaceDirectiveSuite } from './preservewhitespaceDirective';
import { RunTypeparamDirectiveSuite } from './typeparamDirective';

// We bring together all test suites and wrap them in one here. The reason behind this is that
// modules get reloaded per test suite and the vscode-textmate library doesn't support the way
Expand Down Expand Up @@ -71,6 +74,9 @@ describe('Grammar tests', () => {
RunSectionDirectiveSuite();
RunLayoutDirectiveSuite();
RunUsingDirectiveSuite();
RunRendermodeDirectiveSuite();
RunPreservewhitespaceDirectiveSuite();
RunTypeparamDirectiveSuite();

// Razor C# Control Structures
RunUsingStatementSuite();
Expand Down
@@ -0,0 +1,37 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import { describe, it } from '@jest/globals';
import { assertMatchesSnapshot } from './infrastructure/testUtilities';

// See GrammarTests.test.ts for details on exporting this test suite instead of running in place.

export function RunPreservewhitespaceDirectiveSuite() {
describe('@preservewhitespace directive', () => {
it('No bool', async () => {
await assertMatchesSnapshot('@preservewhitespace');
});

it('No bool spaced', async () => {
await assertMatchesSnapshot('@preservewhitespace ');
});

it('Incomplete bool', async () => {
await assertMatchesSnapshot('@preservewhitespace fal');
});

it('Bool provided (true)', async () => {
await assertMatchesSnapshot('@preservewhitespace true');
});

it('Bool provided (false)', async () => {
await assertMatchesSnapshot('@preservewhitespace false');
});

it('Bool provided spaced', async () => {
await assertMatchesSnapshot('@preservewhitespace false ');
});
});
}