Freigeben über


IntelliSense-Member-Abschluss (Managed Paketframework)

Der IntelliSense-Member-Abschluss ist eine QuickInfo angezeigt, die eine Liste möglicher Mitglied eines bestimmten Bereichs, wie z. B. eine Klasse, eine Struktur, eine Enumeration oder einen Namespace an. Zum Beispiel in C#, wenn der Benutzer „this“ gefolgt von einem Punkt wird eine Liste aller Member der Klasse oder Struktur am aktuellen Bereich in einer Liste angezeigt, aus der der Benutzer auswählen kann.

Das verwaltete Paketframework (MPF) bietet Unterstützung für die QuickInfo und Verwalten der Liste in der QuickInfo. Alle erforderlichen Zusammenarbeit ist vom Parser, um die Daten anzugeben, die in der Liste angezeigt wird.

Funktionsweise

Im Folgenden werden die beiden Möglichkeiten, eine Memberliste mit der MPF-Klassen gezeigt wird:

  • Die Einfügemarke in einem Bezeichner oder nach einem Member abschluss Zeichen und - c$auswählen von Member auflistenIntelliSense aus dem Menü positioniert wird.

  • Der IScanner Scanner erkennt ein Member abschluss Zeichen und legt einen Token " aus MemberSelect für dieses Zeichen fest.

Ein Member abschluss Zeichen gibt an, dass ein Member einer Klasse, Struktur oder Enumeration folgen soll. Zum Beispiel in C# oder Visual Basic ist die Member abschluss Zeichen ., während in C++ das Zeichen . oder ->ist. Der Wert der Trigger Option wird festgelegt, wenn das Zeichen des Members untersucht wird.

Der IntelliSense-Memberlisten-Befehl

Der Befehl SHOWMEMBERLIST initiiert einen Aufruf der Completion-Methode für die Source-Klasse und die Completion-Methode ruft wiederum den ParseSource-Methoden mit dem Parser grund Analyse von DisplayMemberListan.

Der Parser bestimmt den Kontext der aktuellen Position als auch über das Token oder unmittelbar vor der aktuellen Position. Auf Grundlage dieses Token wird eine Liste mit Deklarationen dargestellt. Zum Beispiel in C#, wenn Sie die Einfügemarke in einem Klassenmember Member auflistenauswählen und positionieren, rufen Sie eine Liste aller Member der Klasse ab. Wenn Sie nach einem Element positioniert die Einfügemarke, der eine Objektvariable erfolgreich war, rufen Sie eine Liste aller Member der Klasse ab, die Objekt darstellt. Beachten Sie, dass, wenn die Einfügemarke in einem Member befindet, wenn die Memberliste angezeigt wird, das Auswählen eines Members aus der Liste Member ersetzt, mit dem das Caretzeichen in der Liste aktiviert ist.

Der Token "

Der MemberSelect Trigger initiiert einen Aufruf der Completion-Methode für die Source-Klasse und die Completion-Methode ruft wiederum den Parser mit dem Analysis grund von MemberSelect (wenn der Token " auch das MatchBraces-Flag einschloss, ist der Analyse grund, der MemberSelectAndHighlightBraces-Memberauswahl und Hervorhebung von Klammern kombinieren).

Der Parser bestimmt den Kontext der aktuellen Position sowie welche bevor das ausgewählte Zeichen des Members zugewiesen wurde. Aus diesen Informationen erstellt der Parser eine Liste aller Member des angeforderten Bereichs. Diese Liste der Deklarationen wird im AuthoringScope-Objekt gespeichert, das von der ParseSource-Methode zurückgegeben wird. Wenn einer der Deklarationen werden Member zurückgegeben, Close, der die QuickInfo angezeigt wird. Die QuickInfo wird durch eine Instanz der CompletionSet-Klasse verwaltet.

Unterstützung für Member-Abschluss aktivieren

Sie müssen den CodeSense Registrierungseintrag, der auf 1 festgelegt wird, um jeden IntelliSense-Vorgang zu unterstützen. Dieser Registrierungseintrag kann mit einem benannten Parameter festgelegt werden, der dem Benutzer ProvideLanguageServiceAttribute-Attribut übergeben wird, das dem Sprachen Paket zugeordnet ist. Der Sprachdienst Klassen lesen den Wert dieses Registrierungseintrags von der EnableCodeSense-Eigenschaft für die LanguagePreferences-Klasse.

Wenn der Scanner den Token " aus MemberSelectzurückgibt und der Parser eine Liste mit Deklarationen zurückgibt, wird die Member vervollständigungsliste angezeigt.

Unterstützung der Scanner im Member-Abschluss

Der Scanner muss in der Lage sein, ein Mitglied abschluss Eingabezeichen erkannt und legen das Token " aus MemberSelect , wenn das Zeichen analysiert wird.

Beispiel

Hier ist ein vereinfachtes Beispiel für das Erkennens Member des abschluss Signierung und Festlegen der entsprechenden TokenTriggers-Flags. Dieses Beispiel ist nur zur Veranschaulichung. Es wird davon ausgegangen, dass der Scanner eine Methode GetNextToken enthält, die Token aus einer Textzeile identifiziert und zurückgibt. Im Beispielcode wird einfach den Trigger fest, wenn er die Art der rechten Seite des Zeichens wird.

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

namespace TestLanguagePackage
{
    public class TestScanner : IScanner
    {
        private Lexer lex;
        private const char memberSelectChar = '.';

        public bool ScanTokenAndProvideInfoAboutIt(TokenInfo tokenInfo,
                                                   ref int state)
        {
            bool foundToken = false
            string token = lex.GetNextToken();
            if (token != null)
            {
                foundToken = true;
                char c = token[0];
                if (c == memberSelectChar)
                {
                        tokenInfo.Trigger |= TokenTriggers.MemberSelect;
                }
            }
            return foundToken;
        }
    }
}

Member-Abschluss im Parser unterstützt

Ein Member abschluss ruft die Source-Klasse die GetDeclarations-Methode veranschaulicht. Sie müssen die Liste in einer Klasse implementieren, die von der Declarations-Klasse abgeleitet ist. Zeigen Sie die Declarations-Klasse Einzelheiten über die Methode, die Sie implementieren müssen.

Der Parser wird mit MemberSelect oder MemberSelectAndHighlightBraces aufgerufen, wenn ein ausgewähltes Zeichen des Members zugewiesen wird. Der Speicherort, der im ParseRequest-Objekt angegeben ist, befindet sich unmittelbar nachdem das ausgewählte Zeichen des Members. Der Parser muss die Namen aller Member sammeln, die in einer Liste Member für diesen bestimmten Punkt im Quellcode angezeigt werden können. Anschließend muss der Parser die aktuelle Zeile analysieren, um den Bereich zu bestimmen, den der Benutzer zugeordnete mit dem markierten Zeichen des Members möchte.

Dieser Bereich ist auf dem Typ des Bezeichners bevor das ausgewählte Zeichen des Members. In C# languageService die Membervariable angegeben, die einen Typ LanguageServicehat, wechselt languageService. wird eine Liste aller Member der LanguageService-Klasse. Auch in C#, diese Eingabe. wird eine Liste aller Member der Klasse im aktuellen Bereich.

Beispiel

Im folgenden Beispiel wird eine Möglichkeit veranschaulicht, eine Declarations Liste aufgefüllt wird. In diesem Code wird davon ausgegangen, dass der Parser eine Deklaration erstellt und sie der Liste hinzugefügt wird, indem eine AddDeclaration-Methode für die TestAuthoringScope-Klasse aufruft.

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

namespace TestLanguagePackage
{
    internal class TestDeclaration
    {
        public string Name;            // Name of declaration
        public int     TypeImageIndex; // Glyph index
        public string Description;     // Description of declaration

        public TestDeclaration(string name, int typeImageIndex, string description)
        {
            this.Name = name;
            this.TypeImageIndex = typeImageIndex;
            this.Description = description;
        }
    }


    //===================================================
    internal class TestDeclarations : Declarations
    {
        private ArrayList declarations;

        public TestDeclarations()
            : base()
        {
            declarations = new ArrayList();
        }

        public void AddDeclaration(TestDeclaration declaration)
        {
            declarations.Add(declaration);
        }

        //////////////////////////////////////////////////////////////////////
        // Declarations of class methods that must be implemented.
        public override int GetCount()
        {
            // Return the number of declarations to show.
            return declarations.Count;
        }

        public override string GetDescription(int index)
        {
            // Return the description of the specified item.
            string description = "";
            if (index >= 0 && index < declarations.Count)
            {
                description = ((TestDeclaration)declarations[index]).Description;
            }
            return description;
        }

        public override string GetDisplayText(int index)
        {
            // Determine what is displayed in the tool tip list.
            string text = null;
            if (index >= 0 && index < declarations.Count)
            {
                text = ((TestDeclaration)declarations[index]).Name;
            }
            return text;
        }

        public override int GetGlyph(int index)
        {
            // Return index of image to display next to the display text.
            int imageIndex = -1;
            if (index >= 0 && index < declarations.Count)
            {
                imageIndex = ((TestDeclaration)declarations[index]).TypeImageIndex;
            }
            return imageIndex;
        }

        public override string GetName(int index)
        {
            string name = null;
            if (index >= 0 && index < declarations.Count)
            {
                name = ((TestDeclaration)declarations[index]).Name;
            }
            return name;
        }
    }


    //===================================================
    public class TestAuthoringScope : AuthoringScope
    {
        private TestDeclarations declarationsList;

        public void AddDeclaration(TestDeclaration declaration)
        {
            if (declaration != null)
            {
                if (declarationsList == null)
                {
                    declarationsList = new TestDeclarations();
                }
                declarationsList.AddDeclaration(declaration);
            }
        }

        public override Declarations GetDeclarations(IVsTextView view,
                                                     int line,
                                                     int col,
                                                     TokenInfo info,
                                                     ParseReason reason)
        {
            return declarationsList;
        }

        /////////////////////////////////////////////////
        // Remainder of AuthoringScope methods not shown.
        /////////////////////////////////////////////////
    }


    //===================================================
    class TestLanguageService : LanguageService
    {
        public override AuthoringScope ParseSource(ParseRequest req)
        {
            TestAuthoringScope scope = new TestAuthoringScope();
            if (req.Reason == ParseReason.MemberSelect ||
                req.Reason == ParseReason.MemberSelectAndHighlightBraces)
            {
                // Gather list of declarations based on what the user
                // has typed so far. In this example, this list is an array of
                // MemberDeclaration objects (a helper class you might implement
                // to hold member declarations).
                // How this list is gathered is dependent on the parser
                // and is not shown here.
                MemberDeclarations memberDeclarations;
                memberDeclarations = GetDeclarationsForScope();

                // Now populate the Declarations list in the authoring scope.
                // GetImageIndexBasedOnType() is a helper method you
                // might implement to convert a member type to an index into
                // the image list returned from the language service.
                foreach (MemberDeclaration dec in memberDeclarations)
                {
                    scope.AddDeclaration(new TestDeclaration(
                                             dec.Name,
                                             GetImageIndexBasedOnType(dec.Type),
                                             dec.Description));
                }
            }
            return scope;
        }
    }
}