0

Je suis en train de modifier la coloration syntaxique pour le langage CSharp, donc j'obtiendrai la coloration syntaxique pour SQL dans la chaîne C#. TextMate prend en charge les langages incorporés, cela semble donc possible.Grammaire TextMate - précédence des règles

Je construis sur csharp.tmLanguage.json et je voudrais être en mesure de permettre embeded SQL avec un commentaire spécial avant chaîne comme

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

Merci à Language Grammars et Introduction to scopes de TextMate je suis venu avec cette règle JSON

"repository": { 
    "embeded-sql": { 
     "contentName": "source.sql",    
     "begin": "/\\*\\s*SQL\\s*\\*/\\s*\\[email protected]?\"", 
     "end": "\";", 
     "patterns": [ 
      { 
       "include": "source.sql" 
      } 
     ] 
    }, 
    ... 
} 

Et grâce à Themes, Snippets and Colorizers de VSCode et Running and Debugging Your Extension j'ai pu tester, que cette règle fonctionne.

Mais j'ai un problème, que je suis incapable de résoudre.

Ma règle de grammaire ne fonctionne que si la partie signifficant des règles de CSharp sont désactivées, si je désactive tous les #declarations et #script-top-level, fonctionne SQL embeded:

enter image description here

Sinon, ma règle est remplacée par des règles de CSharp comme

  • punctuation.definition.comment.cs
  • string.quoted.double.cs
  • comment.block
  • etc.

enter image description here

Le problème est que ma règle travaille sur plusieurs éléments de langage et la définition de csharp gagne sur le ciblage de ces éléments.

Sur quelle base les éléments sont-ils étiquetés? Comment écrire ma règle, ainsi elle gagnera et marquera cette syntaxe avant d'autres règles de langue? Existe-t-il un algorithme pour calculer le poids des règles?


Solution

Si vous ne pouvez pas pirater la syntaxe de commentaire dans csharp, nous permet de travailler avec un commentaire dans SQL. J'ai fait une règle activée par le commentaire -- SQL et j'ai appliqué ceci à la chaîne verbatim. Maintenant ça marche mais les styles sont parfois mélangés avec de la ficelle. A besoin d'améliorations supplémentaires, mais semble prometteur.

enter image description here

La règle qui prouve au travail va comme ceci

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

Maintenant, je voudrais enable Intellisense and error checking in such embedded language.

Répondre

0

Les règles de la liste de motifs sont mises en correspondance dans l'ordre.

Votre règle apparaît comme une spécialisation de commentaires, vous pouvez le mettre juste avant le 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" 
        } 
       } 
      }, 
      ... 

L'instantané se fait sur une langue my qui est juste une copie de c# JSON plus votre plongement sql.

enter image description here