Condividi tramite


Supporto per la finestra auto (managed package Framework)

La finestra di automobili visualizzare le espressioni quali le variabili e parametri sottoposti quando il programma sottoposto a debug viene sospeso (a causa di un punto di interruzione o di un'eccezione). Le espressioni possono includere variabili, locale o globale e parametri che sono stati modificati in locale. La finestra di automobili anche possibile includere le creazioni di istanze di una classe, una struttura, o di qualche altro tipo. Qualsiasi elemento in un analizzatore di espressioni possibile valutare potenzialmente può essere visualizzato nella finestra di automobili .

Il framework gestito del pacchetto (MPF) non fornisce supporto diretto alla finestra di automobili . Tuttavia, se si esegue l'override del metodo di GetProximityExpressions , è possibile restituire un elenco di espressioni da visualizzare nella finestra di automobili .

Implementare il supporto della finestra auto

È sufficiente impostare per supportare la finestra di automobili si distribuirà il metodo di GetProximityExpressions nella classe di LanguageService . L'implementazione di deve decidere, in base a una posizione nel file di origine, nelle espressioni sono visualizzati nella finestra di automobili . Il metodo restituisce un elenco di stringhe in cui ogni stringa rappresenta una singola espressione. Un valore restituito di S_OK indica che l'elenco contiene le espressioni, mentre S_FALSE indica l'assenza espressioni da visualizzare.

Le effettive espressioni restituiscono sono i nomi delle variabili o dei parametri presenti in tale posizione nel codice. Tali nomi vengono passati analizzatore di espressioni per ottenere i valori e i tipi che viene poi visualizzata nella finestra di automobili .

Esempio

Nell'esempio seguente viene illustrata un'implementazione del metodo di GetProximityExpressions che ottiene un elenco di espressioni dal metodo di ParseSource utilizzando il motivo di analisi Autos. Ognuna delle espressioni viene eseguito il wrapping come TestVsEnumBSTR che implementi l'interfaccia di IVsEnumBSTR .

Si noti che i metodi di GetAutoExpression e di GetAutoExpressionsCount sono metodi personalizzati sull'oggetto di TestAuthoringSink e sono stati aggiunti per supportare questo esempio. Rappresentano un modo in cui le espressioni aggiunte all'oggetto di TestAuthoringSink dal parser chiamando il metodo di AutoExpression ) è possibile accedere all'esterno del parser.

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;
        }
    }
}