Support better C++ annotation highlighting

* Uses some simple highlighting within annotations
* Supports multi-line annotations
  (see compiler-explorer/compiler-explorer#878)
This commit is contained in:
Matt Godbolt 2021-02-15 17:15:34 -06:00
parent ec67c169a8
commit 265d83f041
2 changed files with 60 additions and 1 deletions

View file

@ -856,5 +856,55 @@ testTokenization('cpp', [
{ startIndex: 4, type: 'comment.cpp' } { startIndex: 4, type: 'comment.cpp' }
] ]
} }
],
[
{
line: '[[nodiscard]]',
tokens: [{ startIndex: 0, type: 'annotation.cpp' }]
}
],
[
{
// Example from http://eel.is/c++draft/dcl.attr
line: '[[using CC: opt(1), debug]]',
tokens: [
{ startIndex: 0, type: 'annotation.cpp' }, // [[
{ startIndex: 2, type: 'keyword.cpp' }, // using
{ startIndex: 7, type: '' },
{ startIndex: 8, type: 'annotation.cpp' }, // CC
{ startIndex: 10, type: 'delimiter.cpp' }, // colon
{ startIndex: 11, type: '' },
{ startIndex: 12, type: 'annotation.cpp' }, // opt
{ startIndex: 15, type: 'delimiter.parenthesis.cpp' }, // (
{ startIndex: 16, type: 'annotation.cpp' }, // 1
{ startIndex: 17, type: 'delimiter.parenthesis.cpp' }, // )
{ startIndex: 18, type: 'delimiter.cpp' }, // ,
{ startIndex: 19, type: '' },
{ startIndex: 20, type: 'annotation.cpp' } // debug]]
]
}
],
[
// Multiline and comments.
{
line: '[[nodiscard /*commented*/',
tokens: [
{ startIndex: 0, type: 'annotation.cpp' },
{ startIndex: 11, type: '' },
{ startIndex: 12, type: 'comment.cpp' }
]
},
{
line: ']] int i;',
tokens: [
{ startIndex: 0, type: 'annotation.cpp' },
{ startIndex: 2, type: '' },
{ startIndex: 3, type: 'keyword.int.cpp' },
{ startIndex: 6, type: '' },
{ startIndex: 7, type: 'identifier.cpp' },
{ startIndex: 8, type: 'delimiter.cpp' }
]
}
] ]
]); ]);

View file

@ -298,7 +298,7 @@ export const language = <languages.IMonarchLanguage>{
{ include: '@whitespace' }, { include: '@whitespace' },
// [[ attributes ]]. // [[ attributes ]].
[/\[\[.*\]\]/, 'annotation'], [/\[\[/, { token: 'annotation', next: '@annotation' }],
[/^\s*#include/, { token: 'keyword.directive.include', next: '@include' }], [/^\s*#include/, { token: 'keyword.directive.include', next: '@include' }],
@ -384,6 +384,15 @@ export const language = <languages.IMonarchLanguage>{
[/.*/, 'string.raw'] [/.*/, 'string.raw']
], ],
annotation: [
{ include: '@whitespace' },
[/using|alignas/, 'keyword'],
[/[a-zA-Z0-9_]+/, 'annotation'],
[/[,:]/, 'delimiter'],
[/[()]/, '@brackets'],
[/\]\]/, { token: 'annotation', next: '@pop' }]
],
include: [ include: [
[ [
/(\s*)(<)([^<>]*)(>)/, /(\s*)(<)([^<>]*)(>)/,