Wenn Sie einen Sprachdienst (Managed Paketframework implementieren)
Um einen Sprachdienst mithilfe von verwaltetem Paketframeworks (MPF) zu implementieren, müssen Sie eine Klasse von der LanguageService-Klasse ableiten und die folgenden abstrakten Methoden und Eigenschaften implementiert werden:
Die GetLanguagePreferences-Methode
Die GetScanner-Methode
Die ParseSource-Methode
Die Name-Eigenschaft.
Folgenden finden Sie die entsprechenden Abschnitte ausführliche Informationen zum Implementieren dieser Methoden und Eigenschaften.
Um zusätzliche Features zu unterstützen, muss möglicherweise der Sprachdienst eine Klasse von einer der MPF-Sprachendienst Klassen ableiten. Beispielsweise um zusätzliche Menübefehle zu unterstützen, müssen Sie eine Klasse von der ViewFilter-Klasse ableiten und behandlungs Befehl mehrere Methoden überschreiben (siehe ViewFilter für Details). Die LanguageService-Klasse stellt mehrere Methoden, die aufgerufen werden, um neue Instanzen unterschiedlicher Klassen zu erstellen, und überschreiben Sie die entsprechende Methode zum Erstellen einer Instanz der Klasse bereitzustellen. Beispielsweise müssen Sie die CreateViewFilter-Methode in der LanguageService-Klasse überschreiben, um eine Instanz der Klasse zurückzugeben, ViewFilter besitzen. Weitere Informationen finden Sie im Abschnitt „instanziierend der benutzerdefinierten Klassen“.
Der Sprachdienst kann auch eigene Symbole bieten, die in vielen Stellen verwendet werden. Wenn z. B. eine IntelliSense-Vervollständigungsliste angezeigt wird, kann jedes Element in der Liste vorhanden ist, wird ein Symbol zugeordnet ist und das Element als Methode markieren, Namespace, Klasse, Eigenschaft oder was für die Sprache erforderlich ist. Diese Symbole sind in allen IntelliSense-Listen Navigationsleiste, und klicken Sie im Fehlerliste Aufgabenfenster verwendet. Weitere Informationen finden Sie im Abschnitt „Sprachendienst-Image“ weiter unten.
GetLanguagePreferences-Methode
Die GetLanguagePreferences-Methode gibt immer die gleiche Instanz einer LanguagePreferences-Klasse zurück. Sie können die LanguagePreferences-Klasse verwenden, wenn Sie keine zusätzlichen Einstellungen für den Sprachdienst erfordern. Die MPF-Sprachendienst Klassen nehmen das Vorhandensein der mindestens LanguagePreferences-Klasse.
Beispiel
In diesem Beispiel wird eine typische Implementierung der GetLanguagePreferences-Methode auf. In diesem Beispiel wird die LanguagePreferences-Klasse.
using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio.TextManager.Interop;
namespace TestLanguagePackage
{
public class TestLanguageService : LanguageService
{
private LanguagePreferences m_preferences;
public override LanguagePreferences GetLanguagePreferences()
{
if (m_preferences == null)
{
m_preferences = new LanguagePreferences(this.Site,
typeof(TestLanguageService).GUID,
this.Name );
m_preferences.Init();
}
return m_preferences;
}
}
}
GetScanner-Methode
Diese Methode gibt eine Instanz eines IScanner-Objekts zurück, das einen Zeile-ausgerichteten Parser oder ein Scanner implementiert, die für das Abrufen von Token und ihre Typen und Trigger verwendet werden. Dieser Scanner wird in der Colorizer-Klasse für Farbauftrag verwendet, obwohl der Scanner für das Abrufen von Tokentypen und Triggern als Präfix für einen komplexeren Analysevorgang verwendet werden kann. Sie müssen die Klasse bereitstellen, die die IScanner-Schnittstelle implementiert und Sie müssen alle Methoden für die IScanner-Schnittstelle implementieren.
Beispiel
In diesem Beispiel wird eine typische Implementierung der GetScanner-Methode auf. Die TestScanner-Klasse implementiert die IScanner-Schnittstelle (nicht dargestellt).
using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio.TextManager.Interop;
namespace TestLanguagePackage
{
public class TestLanguageService : LanguageService
{
private TestScanner m_scanner;
public override IScanner GetScanner(IVsTextLines buffer)
{
if (m_scanner == null)
{
m_scanner = new TestScanner(buffer);
}
return m_scanner;
}
}
}
internal class TestScanner : IScanner
{
private IVsTextBuffer m_buffer;
string m_source;
public TestScanner(IVsTextBuffer buffer)
{
m_buffer = buffer;
}
bool IScanner.ScanTokenAndProvideInfoAboutIt(TokenInfo tokenInfo, ref int state)
{
tokenInfo.Type = TokenType.Unknown;
tokenInfo.Color = TokenColor.Text;
return true;
}
void IScanner.SetSource(string source, int offset)
{
m_source = source.Substring(offset);
}
}
ParseSource-Methode
Analysiert die Quelldatei basierend auf verschiedene Gründe. Diese Methode ist ein ParseRequest-Objekt angegeben, das beschreibt, welche von einem bestimmten Analysevorgang erwartet wird. Die ParseSource-Methode ruft einen komplexeren Parser, der Token Funktionen und Bereich bestimmt. Die ParseSource-Methode wird als Unterstützung für IntelliSense-Vorgänge sowie die Zuordnung von Klammern verwendet. Auch wenn Sie keine solchen erweiterten Vorgänge unterstützen, müssen Sie ein gültiges AuthoringScope-Objekt noch zurückgeben und das müssen Sie eine Klasse erstellen, die die Schnittstelle implementiert und AuthoringScope implementiert alle Methoden in dieser Schnittstelle. Sie können NULL-Werte aus allen Methoden zurückgegeben werden, aber das AuthoringScope-Objekt selbst darf kein NULL-Wert sein.
Beispiel
In diesem Beispiel wird eine minimale Implementierung der ParseSource-Methode und der AuthoringScope-Klasse aus, um dem Sprachdienst zu ermöglichen, zu kompilieren und zu arbeiten, ohne tatsächlich mehr erweiterten Features zu unterstützen.
using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio.TextManager.Interop;
namespace TestLanguagePackage
{
public class TestLanguageService : LanguageService
{
public override AuthoringScope ParseSource(ParseRequest req)
{
return new TestAuthoringScope();
}
}
internal class TestAuthoringScope : AuthoringScope
{
public override string GetDataTipText(int line, int col, out TextSpan span)
{
span = new TextSpan();
return null;
}
public override Declarations GetDeclarations(IVsTextView view,
int line,
int col,
TokenInfo info,
ParseReason reason)
{
return null;
}
public override string Goto(VSConstants.VSStd97CmdID cmd, IVsTextView textView, int line, int col, out TextSpan span)
{
span = new TextSpan();
return null;
}
public override Methods GetMethods(int line, int col, string name)
{
return null;
}
}
Name-Eigenschaft
Diese Eigenschaft gibt den Namen des Sprachdiensts zurück. Dies muss derselbe angegebene Name sein, als der Sprachdienst registriert wurde. Dieser Name wird an mehreren Stellen, das verwendet vorstehendste Argument LanguagePreferences die Klasse darstellt, in der der Name verwendet wird, um die Registrierung zuzugreifen. Der Name, der von dieser Eigenschaft zurückgegeben wird, dürfen nicht lokalisiert werden, wie er in der Registrierung für Registrierungseintrag und Schlüsselnamen verwendet wird.
Beispiel
In diesem Beispiel wird eine mögliche Implementierung der Name-Eigenschaft an. Beachten Sie, dass der Name hier hartcodiert wird: Der tatsächliche Name sollte aus einer Ressourcendatei abgerufen werden. Daher kann er verwendet werden, wenn ein Sprachdienst registriert werden (siehe Wenn Sie einen Sprachdienst registrieren (Managed Paketframework)).
using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio.TextManager.Interop;
namespace TestLanguagePackage
{
public class TestLanguageService : LanguageService
{
public override string Name
{
get { return "Test Language"; }
}
}
}
Benutzerdefinierte Klassen instanziieren
Die folgenden Methoden in den angegebenen Klassen überschrieben werden können, um Instanzen bereitzustellen, Versionen jeder Klasse besitzen.
In der LanguageService-Klasse
Methode |
Klasse zurückgegeben |
Beschreibung |
---|---|---|
Um benutzerdefinierte Ergänzungen der Textansicht unterstützen. |
||
Um benutzerdefinierte Dokumenteigenschaften unterstützen. |
||
So Navigationsleisteunterstützen. |
||
So Supportfunktionen Vorlagen in den Codeausschnitt. |
||
So zeigen Sie Codeausschnitte unterstützen (Diese Methode wird i. d. R. nicht außer Kraft gesetzt). |
||
So Anpassung der ParseRequest Struktur (diese Methode wird in der Regel nicht außer Kraft gesetzt). |
||
So fügen Sie den Quellcode der Formatierung unterstützen, Kommentarzeichen an Methodensignaturen und passen angibt. |
||
Um zusätzliche Menübefehle unterstützen. |
||
So Syntax-Hervorhebung unterstützen (Diese Methode wird i. d. R. nicht außer Kraft gesetzt). |
||
Um Zugriff auf die Spracheinstellungen unterstützen. Diese Methode muss implementiert werden, jedoch kann eine Instanz der Basisklasse zurückgeben. |
||
So fügen Sie einen Parser verwendet zum Identifizieren von Typen von Token in einer Zeile bereitstellen. Diese Methode muss implementiert werden und IScanner muss abgeleitet werden. |
||
So fügen Sie einen Parser verwendet zum Identifizieren von Funktionen und Bereich in einer kompletten Quelldatei bereitstellen. Diese Methode muss implementiert werden und muss eine Instanz der Version der AuthoringScope-Klasse zurückgeben. Wenn Sie unterstützen möchten, Syntax-Hervorhebung (die den IScanner Parser GetScanner erfordert, die von der Methode zurückgegeben wird), können Sie in dieser Methode nichts anderes als eine Version vor der Rückgabe AuthoringScope deren Methoden der Klasse alle null-werte zurückgeben. |
In der Quellklasse
Methode |
Klasse zurückgegeben |
Beschreibung |
---|---|---|
Für das Anpassen der Anzeige von IntelliSense-Vervollständigungslisten (diese Methode wird in der Regel nicht außer Kraft gesetzt). |
||
Für die Unterstützung von Markierungen in der Fehlerliste taskliste. ausdrücklich Unterstützung für Funktionen über dem Öffnen der Datei und das Springen zur Zeile, die den Fehler verursacht hat. |
||
Für das Anpassen der Anzeige der IntelliSense-Parameterinformationens-QuickInfo. |
||
Für die Unterstützung des kommentierenden Codes. |
||
Für das Erfassen von Informationen während der Analyse Vorgangs. |
In der AuthoringScope-Klasse
Methode |
Klasse zurückgegeben |
Beschreibung |
---|---|---|
Stellt eine Liste von Deklarationen wie Typen oder Member bereit. Diese Methode muss implementiert werden, kann aber einen NULL-Wert zurückgeben. Wenn diese Methode ein gültiges Objekt zurückgibt, muss das Objekt eine Instanz der Version der Declarations-Klasse sein. |
||
Stellt eine Liste von Methodensignaturen für einen angegebenen Kontext bereit. Diese Methode muss implementiert werden, kann aber einen NULL-Wert zurückgeben. Wenn diese Methode ein gültiges Objekt zurückgibt, muss das Objekt eine Instanz der Version der Methods-Klasse sein. |
Sprachendienst-Images
Um eine Liste der während des Sprachdiensts zu verwendende Symbolen bereitstellen, überschreiben Sie die GetImageList-Methode in der LanguageService-Klasse an, und geben Sie ImageList zurück, das die Symbole enthält. Die Basis- LanguageService-Klassenbelastungen ein Standardsatz von Symbolen. Während Sie den genauen Index des Bildes in diesen Stellen angeben, welche Symbole anordnen, wie Sie benötigen, sind Sie Bildliste Sie vollständig ist.
IntelliSense-Vervollständigungslisten in verwendeten Bilds
Die IntelliSense-Vervollständigungslisten wird der Index des Bilds für jedes Element in der GetGlyph-Methode der Declarations-Klasse angegeben, die Sie überschreiben müssen, wenn Sie einen Index des Bilds bereitstellen möchten. Der Wert, der aus der GetGlyph-Methode zurückgegeben wird, ist ein Index in der Bildliste, die dem CompletionSet-Klassenkonstruktor angegeben ist und die ist dieselbe, die aus der Bildliste GetImageListLanguageService-Methode in der Klasse zurückgegeben wird (Sie können ändern, der für CompletionSet die Bildliste zu verwenden, wenn Sie die CreateCompletionSet-Methode in der Source-Klasse überschreiben, um eine andere Bildliste anzugeben).
Bilder verwendet der Navigationsleiste
Navigationsleiste wird Auflisten von Typen und Membern an und wird für schnelle Navigation kann Symbole anzeigen verwendet. Diese Symbole sind in der GetImageList-Methode in der LanguageService-Klasse abgerufen und können nicht für Navigationsleisteausdrücklich überschrieben werden. Die Indizes, die für jedes Element in den Kombinationsfeldern verwendet werden, Listen, wenn angegeben werden, die die Kombinationsfelder darstellen, die OnSynchronizeDropdowns-Methode in der TypeAndMemberDropdownBars-Klasse aufgefüllt werden (siehe Unterstützung für die Navigationsleiste (Managed Paketframework)). Diese Bild des Parsers, mit vorhandenen Indizes werden in der Regel durch die Version der Declarations-Klasse ermittelt. Wie die Indizes abgerufen werden. Sie ist vollständig
Bilder werden im Fehlerlisten-Aufgaben-Fenster
Sobald der Parser Methoden ParseSource (siehe Sprachendienst-Parser und Scanner (Managed Paketframework)), ein Fehler auftritt und diesen Fehler zu AddError-Methode in der AuthoringSink-Klasse erreicht, wird der Fehler im Fehlerliste Aufgabenfenster gemeldet. Ein Symbol kann mit jedem Element zugeordnet sind, das im Aufgabenfenster wird und das Symbol aus der Bildliste stammt, die aus der GetImageList-Methode in der LanguageService-Klasse zurückgegeben wird. Das Standardverhalten der MPF-Klassen ist, ein Bild mit der Fehlermeldung nicht angezeigt. Sie können dieses Verhalten überschreiben, indem Sie eine Klasse von der Source-Klasse ableiten und die CreateErrorTaskItem-Methode überschreiben. In dieser Methode erstellen Sie ein neues DocumentTask-Objekt. Bevor Sie dieses Objekt zurückgeben, können Sie die ImageIndex-Eigenschaft auf dem DocumentTask-Objekt verwenden, um den Index des Bilds festlegen. Dies würde in etwa dem folgenden Beispiel entsprechen. Beachten Sie, dass TestIconImageIndex eine Enumeration ist, die alle Symbole aufgeführt ist und diesem Beispiel spezifisch sind. Sie haben möglicherweise eine andere Art von Identifizieren von Symbolen im Sprachdienst.
using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.TextManager.Interop;
namespace TestLanguagePackage
{
class TestSource : Source
{
public override DocumentTask CreateErrorTaskItem(
TextSpan span,
string filename,
string message,
TastPriority priority,
TaskCategory category,
MARKERTYPE markerType,
TaskErrorCategory errorCategory)
{
DocumentTask taskItem = base.CreateErrorTaskItem(
span,
filename,
message,
priority,
category,
markerType,
errorCategory);
if (errorCategory == TaskErrorCategory.Error)
{
taskItem.ImageIndex = TestIconImageIndex.Error;
}
return taskItem;
}
}
}
Der Standardwert für die Bildliste für einen Sprachdienst
Der Standardwert für die Bildliste, die mit den Klassen der Sprachdienst Basis MPF angegeben wird, umfasst mehrere Symbole, die mit den mehr Elementen die gemeinsame Sprache zugeordnet sind. Die Großteil dieser Symbole werden in den Sätzen von sechs Variationen, entsprechend den Zugriff konzepten der öffentlichen angeordnet, intern, Friend, privat, geschützt und Verknüpfung. Beispielsweise können Sie verschiedene Symbole für eine Methode aufweisen, je nachdem, ob sie öffentlich oder privat, geschützt ist, oder legt diesen fest.
Die folgende Enumeration gibt typische Namen für jedes festgelegte Symbol an und gibt den zugeordneten Index an. Zum Beispiel auf Grundlage der Enumeration, können Sie den Index des Bilds für geschützte Methode als (int)IconImageIndex.Method + (int)IconImageIndex.AccessProtectedangeben. Sie können die Namen in dieser Enumeration ändern, wie gewünscht.
public enum IconImageIndex
{
// access types
AccessPublic = 0,
AccessInternal = 1,
AccessFriend = 2,
AccessProtected = 3,
AccessPrivate = 4,
AccessShortcut = 5,
Base = 6,
// Each of the following icon type has 6 versions,
//corresponding to the access types
Class = Base + 0,
Constant = Base + 1,
Delegate = Base + 2,
Enumeration = Base + 3,
EnumMember = Base + 4,
Event = Base + 5,
Exception = Base + 6,
Field = Base + 7,
Interface = Base + 8,
Macro = Base + 9,
Map = Base + 10,
MapItem = Base + 11,
Method = Base + 12,
OverloadedMethod = Base + 13,
Module = Base + 14,
Namespace = Base + 15,
Operator = Base + 16,
Property = Base + 17,
Struct = Base + 18,
Template = Base + 19,
Typedef = Base + 20,
Type = Base + 21,
Union = Base + 22,
Variable = Base + 23,
ValueType = Base + 24,
Intrinsic = Base + 25,
JavaMethod = Base + 26,
JavaField = Base + 27,
JavaClass = Base + 28,
JavaNamespace = Base + 29,
JavaInterface = Base + 30,
// Miscellaneous icons with one icon for each type.
Error = 187,
GreyedClass = 188,
GreyedPrivateMethod = 189,
GreyedProtectedMethod = 190,
GreyedPublicMethod = 191,
BrowseResourceFile = 192,
Reference = 193,
Library = 194,
VBProject = 195,
VBWebProject = 196,
CSProject = 197,
CSWebProject = 198,
VB6Project = 199,
CPlusProject = 200,
Form = 201,
OpenFolder = 202,
ClosedFolder = 203,
Arrow = 204,
CSClass = 205,
Snippet = 206,
Keyword = 207,
Info = 208,
CallBrowserCall = 209,
CallBrowserCallRecursive = 210,
XMLEditor = 211,
VJProject = 212,
VJClass = 213,
ForwardedType = 214,
CallsTo = 215,
CallsFrom = 216,
Warning = 217,
}
Siehe auch
Konzepte
Sprachendienst-Übersicht (Managed Paketframework)
Wenn Sie einen Sprachdienst registrieren (Managed Paketframework)
Sprachendienst-Parser und Scanner (Managed Paketframework)
Weitere Ressourcen
Wenn Sie einen Sprachdienst mithilfe von verwaltetem Paketframeworks implementieren