2010-07-01 6 views
3

J'essaie de jouer avec les nouvelles capacités de coloration syntaxique de VS2010 basées sur l'échantillon de coloration diff de Noah Richards. L'objectif est de créer une coloration syntaxique pour SpecFlow (http://www.specflow.org). Dans mon cas, trouver les éléments syntaxiques est assez complexe et pas au niveau de la ligne. Par conséquent, lorsque j'implémente GetClassificationSpans, je ne souhaite pas analyser de nouveau le fichier entier, mais plutôt prendre l'état du début du texte modifié et analyser le contenu à partir de ce point. Je pensais pouvoir obtenir les classifications précédentes en tant que ClassificationTags. Je l'ai fait en utilisant la classe IBufferTagAggregatorFactoryService.Coloration syntaxique VS2010: comment obtenir le type de classification précédent

Cela fonctionne, mais je ne sais pas si c'est la meilleure façon de procéder. Dois-je créer uniquement un agrégateur de balises pour la classe de classificateur entière ou je peux le créer chaque fois que GetClassificationSpans est appelée? Dois-je créer une étiquette spéciale pour me souvenir de l'état d'analyse?

Peut-être que ce n'est pas la bonne façon d'y aller, je suis également intéressé par d'autres suggestions.

Br, Gaspar

Edit: J'ai trouvé un bon article série dans la rubrique: http://www.hill30.com/MikeFeingoldBlog/index.php/2009/07/31/django-editor-in-vs-2010-part-1-colors/

Répondre

4

Essentiellement, vous devez vous rappeler l'état vous. La plupart des services linguistiques VS conservent un cookie d'état pour le début de chaque ligne qu'ils mettent à jour lors du changement de texte. A tout moment, l'obtention de classifications (via un agrégateur de classificateur ou un agrégateur de tags) aboutira toujours à un appel dans les classificateurs/étiqueteurs actuels, de sorte qu'il ne retournera aucun type d'état mis en cache (ou le "dernier"). "classifications renvoyées". L'éditeur ne met pas réellement en cache ces informations et agit simplement comme un renvoi direct aux informations que votre classificateur fournit aux lignes visibles en cours de formatage. En outre, si vous le faites à partir d'un classificateur (fourni par IClassifierProvider ou ITaggerProvider), vous vous configurez pour une récursivité désagréable, en particulier si votre classificateur répond à GetClassificationSpans en appelant l'agrégateur (qui rappelle dans votre classificateur pour un texte plus ancien, etc.). Si votre classificateur a besoin à consommer d'autres classifications pour fonctionner correctement (et non ses propres classifications), le seul moyen sûr d'écrire qui est à:

  1. Mettre en œuvre votre « classificateur » comme ITagger<IClassificationTag>, et de lui fournir de un IViewTaggerProvider.
  2. Prenez un ITagAggregator<IClassificationTag> à partir d'un IBufferTagAggregatorFactoryService, mais seulement une fois.
  3. Mettez en œuvre IDisposable sur votre étiqueteuse et disposez l'agrégateur d'étiquettes au Dispose().
+0

thx pour la réponse! à propos des cookies d'état: y a-t-il une infrastructure intégrée ou dois-je simplement les stocker dans mon propre modèle? –

+0

Il y avait dans les anciennes interfaces ('IVsColorizer'), mais pas dans les nouvelles, donc vous devrez écrire votre propre modèle. Faites-moi savoir si vous rencontrez des problèmes, car j'ai dû écrire un tel modèle lorsque vous avez réduit ces anciens 'IVsColorizer' pour qu'ils fonctionnent avec la classification. –

Questions connexes