9 votes

Comment créer des ornements verts (ou bleus) avec une extension Visual Studio

J'ai une extension Visual Studio qui affiche des gribouillis d'erreur rouges. J'aime aussi fournir des symboles d'autres couleurs, par exemple jaune pour les avertissements.

La création de gribouillis rouges peut être réalisée en étendant la classe ITagger, comme suit :

internal sealed class MySquigglesTagger : ITagger<IErrorTag> {
    public IEnumerable<ITagSpan<IErrorTag>> GetTags(NormalizedSnapshotSpanCollection spans) {
        foreach (IMappingTagSpan<MyTokenTag> myTokenTag in this._aggregator.GetTags(spans))        
            SnapshotSpan tagSpan = myTokenTag.Span.GetSpans(this._sourceBuffer)[0];
            yield return new TagSpan<IErrorTag>(tagSpan, new ErrorTag("Error", "some info about the error"));
        }
    }
}

Ce que j'ai essayé :

  1. Mon intuition (erronée) me dit que retourner un ErrorTag avec un errorType différent peut donner un type de tag différent, mais quelle que soit la chaîne que vous lui passez, les gribouillis restent rouges. Par exemple, new ErrorTag("Warning") renvoie des gribouillis rouges. La documentation MSDN est pratiquement inexistante. Voir ErrorTag .
  2. Dans le cadre de la Espace de noms pour le balisage il n'est pas fait mention d'une classe d'étiquettes différente qui mettrait en œuvre ITag. J'espérais qu'il existait un WarningTag ou un InfoTag.
  3. A posé une question sur le forum MSDN aquí .

Pregunta Comment créer des ornements verts (ou bleus ou jaunes) en forme de gribouillis ? Malheureusement, même les solutions obscures ou alambiquées sont appréciées...

Je vise VS2015 et VS2017.

Edit : Pendant que je tapais cette question, quelqu'un sur le forum MSDN m'a répondu que ce n'était pas possible avec l'API actuelle. Est-il vraiment impossible de faire des gribouillis jaunes dans Visual Studio ?

4voto

C.Evenhuis Points 10818

En Noms des types d'erreurs prédéfinis contient les valeurs prises en charge pour le ErrorType de la propriété ErrorTag .

Vous vous en êtes approché avec "Warning", mais la valeur de PredefinedErrorTypeNames.Warning semble être un "avertissement du compilateur".

1voto

HJLebbink Points 332

Juste pour documenter ma propre question et ma réponse.

Créer un fichier SquigglesTaggerProvider.cs avec le contenu suivant :

[Export(typeof(IViewTaggerProvider))]
[ContentType("Your Content Type")]
[TagType(typeof(ErrorTag))]
internal sealed class SquigglesTaggerProvider : IViewTaggerProvider {
    [Import]
    private IBufferTagAggregatorFactoryService _aggregatorFactory = null;

    public ITagger<T> CreateTagger<T>(ITextView textView, ITextBuffer buffer) where T : ITag {
        ITagger<T> sc() {
            return new SquigglesTagger(buffer, this._aggregatorFactory) as ITagger<T>;
        }
        return buffer.Properties.GetOrCreateSingletonProperty(sc);
    }
}

Créer un fichier nommé SquigglesTagger.cs avec le contenu suivant :

internal sealed class SquigglesTagger : ITagger<IErrorTag> {
    private readonly ITextBuffer _sourceBuffer;
    private readonly ITagAggregator<AsmTokenTag> _aggregator;

    internal SquigglesTagger(ITextBuffer buffer, IBufferTagAggregatorFactoryService aggregatorFactory) {
        this._sourceBuffer = buffer;            
        ITagAggregator<AsmTokenTag> sc() {   
            return aggregatorFactory.CreateTagAggregator<AsmTokenTag>(buffer);
        }
        this._aggregator = buffer.Properties.GetOrCreateSingletonProperty(sc);
    }

    public IEnumerable<ITagSpan<IErrorTag>> GetTags(NormalizedSnapshotSpanCollection spans) {
        foreach (IMappingTagSpan<MyTokenTag> myTokenTag in this._aggregator.GetTags(spans))        
            SnapshotSpan tagSpan = myTokenTag.Span.GetSpans(this._sourceBuffer)[0];
            yield return new TagSpan<IErrorTag>(tagSpan, new ErrorTag(PredefinedErrorTypeNames.SyntaxError, "some info about the error"));
        }
    }
}

En PredefinedErrorTypeNames comporte différentes erreurs prédéfinies.

public const string SyntaxError = "syntax error";
public const string CompilerError = "compiler error";
public const string OtherError = "other error";
public const string Warning = "compiler warning";
public const string Suggestion = "suggestion";

Le code est extrait de mon référentiel aquí .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X