Partager via


Prise en charge pour la automatique (fenêtre (managed package)

La fenêtre d' Automatique affiche les expressions telles que des variables et des paramètres qui sont dans la portée lorsque le programme débogué est suspendu (en raison d'un point d'arrêt ou une exception). Les expressions peuvent inclure des variables, local ou global, et les paramètres modifiés dans la portée locale. La fenêtre d' Automatique peut également inclure des instanciations d'une classe, de structure, ou d'une autre type. Tout ce qu'un évaluateur d'expression peut évaluer peut potentiellement être affiché dans la fenêtre d' Automatique .

Managed package (MPF) ne fournit pas de prise en charge directe de la fenêtre d' Automatique . Toutefois, si vous substituez la méthode d' GetProximityExpressions , vous pouvez retourner une liste d'expressions à faire dans la fenêtre d' Automatique .

Implémenter la prise en charge de la automatique (fenêtre)

Tout ce que vous devez effectuer pour prendre en charge la fenêtre d' Automatique est d'implémenter la méthode d' GetProximityExpressions dans la classe d' LanguageService . Votre implémentation doit décider, étant donné un emplacement dans le fichier source, qui les expressions qui doivent apparaître dans la fenêtre d' Automatique . La méthode retourne une liste de chaînes dans lesquelles chaque chaîne représente une expression unique. Une valeur de retour d' S_OK indique que la liste contient des expressions, tandis que S_FALSE indique qu'il n'y a aucune expression à afficher.

Les expressions réelles retournées sont les noms des variables ou des paramètres qui s'affichent à cet emplacement dans le code. ces noms sont passés à l'évaluateur d'expression pour obtenir les valeurs et les types qui sont alors affichés dans la fenêtre d' Automatique .

Exemple

L'exemple suivant illustre une implémentation de la méthode d' GetProximityExpressions qui obtient une liste des expressions de la méthode d' ParseSource à l'aide de la raison Autosl'analyse. Chacune des expressions sont encapsulées comme TestVsEnumBSTR qui implémente l'interface d' IVsEnumBSTR .

notez que les méthodes d' GetAutoExpressionsCount et d' GetAutoExpression sont des méthodes personnalisées sur l'objet d' TestAuthoringSink et ont été ajoutées pour prendre en charge cet exemple. Ils représentent une façon dont les expressions ajoutées à l'objet d' TestAuthoringSink par l'analyseur (en appelant la méthode d' AutoExpression ) sont accessibles en dehors de l'analyseur.

using Microsoft.VisualStudio;
using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio.TextManager.Interop;

namespace TestLanguagePackage
{
    public class TestLanguageService : LanguageService
    {
        public override int GetProximityExpressions(IVsTextBuffer buffer,
                                                    int line,
                                                    int col,
                                                    int cLines,
                                                    out IVsEnumBSTR ppEnum)
        {
            int retval = VSConstants.E_NOTIMPL;
            ppEnum = null;
            if (buffer != null)
            {
                IVsTextLines textLines = buffer as IVsTextLines;
                if (textLines != null)
                {
                    Source src = this.GetSource(textLines);
                    if (src != null)
                    {
                        TokenInfo tokenInfo = new TokenInfo();
                        string text = src.GetText();
                        ParseRequest req = CreateParseRequest(src,
                                                              line,
                                                              col,
                                                              tokenInfo,
                                                              text,
                                                              src.GetFilePath(),
                                                              ParseReason.Autos,
                                                              null);
                        req.Scope = this.ParseSource(req);
                        TestAuthoringSink sink = req.Sink as TestAuthoringSink;

                        retval = VSConstants.S_FALSE;
                        int spanCount = sink.GetAutoExpressionsCount();
                        if (spanCount > 0) {
                            TestVsEnumBSTR bstrList = new TestVsEnumBSTR();
                            for (int i = 0; i < spanCount; i++)
                            {
                                TextSpan span;
                                sink.GetAutoExpression(i, out span);
                                string expression = src.GetText(span.iStartLine,
                                                                span.iStartIndex,
                                                                span.iEndLine,
                                                                span.iEndIndex);
                                bstrList.AddString(expression);
                            }
                            ppEnum = bstrList;
                            retval = VSConstants.S_OK;
                        }
                    }
                }
            }
            return retval;
        }
    }
}