Грамматика TextMate - приоритет правил
Я пытаюсь изменить подсветку синтаксиса для языка CSharp, поэтому я получу подсветку синтаксиса для SQL в строке C#. TextMate поддерживает встроенные языки, так что это кажется возможным.
Я использую csharp.tmLanguage.json и хотел бы иметь возможность включить встроенный SQL со специальным комментарием перед строкой, подобной
string query = /*SQL*/ $@"SELECT something FROM ..."
Благодаря языковым грамматикам TextMate и введению в области применения я разработал это правило JSON
"repository": {
"embeded-sql": {
"contentName": "source.sql",
"begin": "/\\*\\s*SQL\\s*\\*/\\s*\\$?@?\"",
"end": "\";",
"patterns": [
{
"include": "source.sql"
}
]
},
...
}
И благодаря Темам , Фрагментам и Колоризаторам VSCode и Запуску и Отладке Вашего Расширения я смог проверить, работает ли это правило.
Но у меня есть одна проблема, которую я не могу решить.
Мое правило грамматики работает, только если значительная часть правил csharp отключена, если я отключу все #declarations
а также #script-top-level
Встраиваемый SQL работает:
В противном случае мое правило переопределяется правилами csharp, такими как
- punctuation.definition.comment.cs
- string.quoted.double.cs
- comment.block
- и т.п.
Проблема в том, что мое правило работает с несколькими языковыми элементами, и определение csharp выигрывает при нацеливании на эти элементы.
На каком основании элементы помечены? Как написать мое правило, чтобы оно побеждало и помечало этот синтаксис раньше правил других языков? Есть ли алгоритм для расчета веса правил?
Решение
Если вы не можете перехватить синтаксис комментариев в csharp, давайте поработаем с комментариями в SQL. Я сделал правило включенным -- SQL
комментарий, и я применил это к дословной строке. Теперь это работает, но стили иногда смешиваются со строкой. Требует некоторых дополнительных улучшений, но выглядит многообещающе.
Правило, которое доказывает, работает так
"embeded-sql": {
"contentName": "source.sql",
"begin": "--\\s*SQL",
"end": "(?:\\b|^)(?=\"\\s*;)",
"patterns": [
{
"include": "source.sql"
}
]
},
Теперь я хотел бы включить Intellisense и проверку ошибок в таком встроенном языке.
1 ответ
Правила в списке шаблонов совпадают по порядку.
Ваше правило выглядит как специализация комментария, так что вы можете поместить его прямо перед comment.block.cs
"comment": {
"patterns": [
{
"contentName": "source.sql",
"begin": "(/\\*\\s*SQL\\s*\\*/)\\s*\\$?@?\"",
"beginCaptures": {
"1": {
"patterns": [
{
"include": "#comment"
}
]
}
},
"end": "\";",
"patterns": [
{
"include": "source.sql"
}
]
},
{
"name": "comment.block.cs",
"begin": "/\\*",
"beginCaptures": {
"0": {
"name": "punctuation.definition.comment.cs"
}
},
"end": "\\*/",
"endCaptures": {
"0": {
"name": "punctuation.definition.comment.cs"
}
}
},
...
Снимок сделан на языке my
которая является просто копией c#
JSON плюс твой sql
вложение.