Грамматика 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 вложение.

Другие вопросы по тегам