0

私はCSharp言語の構文ハイライトを変更しようとしていますので、C#の文字列でSQLの構文をハイライト表示します。 TextMateは埋め込み言語をサポートしているので、これは可能です。TextMate文法 - ルールの優先度

私は、このJSONルール

"repository": { 
    "embeded-sql": { 
     "contentName": "source.sql",    
     "begin": "/\\*\\s*SQL\\s*\\*/\\s*\\[email protected]?\"", 
     "end": "\";", 
     "patterns": [ 
      { 
       "include": "source.sql" 
      } 
     ] 
    }, 
    ... 
} 
を思い付いたのTextMateの Language GrammarsIntroduction to scopesのおかげで、私は csharp.tmLanguage.json上に構築し、私は

string query = /*SQL*/ [email protected]"SELECT something FROM ..." 

のような文字列の前に特別なコメントで埋め込みSQLを有効にできるようにしたいと思います

VSCodeのThemes, Snippets and ColorizersRunning and Debugging Your Extensionのおかげで、このルールが機能することをテストできました。

しかし、私は解決できない1つの問題があります。

私の文法規則は、CSHARPルールのsignifficant部分は、無効になっている私はすべての#declarations#script-top-levelを無効にした場合は、埋め込みSQLが動作する場合にのみ機能します:

enter image description here

そうでない場合は、私のルールは

ようCSHARPルールによって上書きされます
  • punctuation.definition.comment.cs
  • string.quoted.double.cs
  • comment.block
  • など

enter image description here

問題は、私のルールは、これらの要素をターゲットに、いくつかの言語要素とCSHARP定義勝利に動作すること、です。

タグ付けされた要素にはどのような基準がありますか?私のルールを書く方法、それは他の言語のルールの前にその構文に勝つタグを付けるでしょうか?ルールの重みを計算するアルゴリズムはありますか?


ソリューション

あなたがCSHARPでコメント構文をハイジャックすることができない場合は、私たちはSQLにコメントして作業することができます。私は-- SQLのコメントで有効にしたルールを作成し、これを逐語的な文字列に適用しました。今は動作しますが、スタイルは時々文字列と混ざります。追加の改善が必要ですが、有望です。

enter image description here

仕事に証明規則は、この

"embeded-sql": { 
     "contentName": "source.sql", 
     "begin": "--\\s*SQL", 
     "end": "(?:\\b|^)(?=\"\\s*;)", 
     "patterns": [ 
      { 
       "include": "source.sql" 
      } 
     ] 
    }, 

ようになり今ではenable Intellisense and error checking in such embedded languageしたいと思います。

答えて

0

パターンリストのルールは、順番に一致します。

あなたのルールでは、コメントの専門のように表示されますので、あなただけのスナップショットがちょうどc# JSONのコピーに加えて、あなたのsql埋め込みである言語myで行われcomment.block.cs

"comment": { 
     "patterns": [ 
      { 
       "contentName": "source.sql", 
       "begin": "(/\\*\\s*SQL\\s*\\*/)\\s*\\[email protected]?\"", 
       "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" 
        } 
       } 
      }, 
      ... 

前にそれを置くことができます。

enter image description here