IScanner, interface
Utilisé comme interface pour un analyseur de langage dans un service de langage.
Espace de noms : Microsoft.VisualStudio.Package
Assemblys : Microsoft.VisualStudio.Package.LanguageService.10.0 (dans Microsoft.VisualStudio.Package.LanguageService.10.0.dll)
Microsoft.VisualStudio.Package.LanguageService.11.0 (dans Microsoft.VisualStudio.Package.LanguageService.11.0.dll)
Microsoft.VisualStudio.Package.LanguageService.9.0 (dans Microsoft.VisualStudio.Package.LanguageService.9.0.dll)
Microsoft.VisualStudio.Package.LanguageService (dans Microsoft.VisualStudio.Package.LanguageService.dll)
Syntaxe
'Déclaration
Public Interface IScanner
public interface IScanner
Le type IScanner expose les membres suivants.
Méthodes
Nom | Description | |
---|---|---|
ScanTokenAndProvideInfoAboutIt | Analyse le jeton suivant de langage de la ligne en cours et retourne des informations connexes. | |
SetSource | Définit la ligne à analyser. |
Début
Remarques
Un service de langage doit analyser code afin de prendre en charge les fonctionnalités l'une des offertes par Visual Studio aux développeurs.Par exemple, mettre en surbrillance de syntaxe requiert une connaissance des différents éléments du langage pour fournir une bonne couleur, tandis que l'achèvement de code nécessite des connaissances de la portée actuelle.Identifier le type de jetons est le rôle du scanneur, tandis que identifier la fonctionnalité et la portée d'un jeton est le rôle d'un analyseur.
Remarques à l'attention des implémenteurs
Pour analyser code, vous devez implémenter l'interface d'IScanner sur une classe et appeler le constructeur de cette classe dans votre implémentation d'GetScanner.
Remarques à l'attention des appelants
Le scanneur est utilisé par la classe d'Colorizer pour gérer la syntaxe mettant en surbrillance et est en général fourni au constructeur de coloriseur.L'analyseur peut également être utilisé pour d'autres fonctionnalités des langages, telles que identifier les déclencheurs symboliques qui initialisent une analyse plus complexe via la méthode d'ParseSource.
Exemples
Voici un exemple d'une implémentation simple de cette interface.
[C#]
namespace MyLanguagePackage
{
class CScanner : IScanner
{
/////////////////////////////////////////////////////
// Fields
private string m_line;
private int m_offset;
private int m_offset;
private string m_source;
/////////////////////////////////////////////////////
// Enumerations
private enum ParseState
{
InText = 0,
InQuotes = 1,
InComment = 2
}
/////////////////////////////////////////////////////
// Private methods
private bool GetNextToken(int startIndex,
TokenInfo tokenInfo,
ref int state)
{
bool bFoundToken = false;
int endIndex = -1;
int index = startIndex;
if (index < m_source.Length)
{
if (state == (int) ParseState.InQuotes)
{
// Find end quote. If found, set state to InText
// and return the quoted string as a single token.
// Otherwise, return the string to the end of the line
// and keep the same state.
}
else if (state == (int) ParseState.InComment)
{
// Find end of comment. If found, set state to InText
// and return the comment as a single token.
// Otherwise, return the comment to the end of the line
// and keep the same state.
}
else
{
// Parse the token starting at index, returning the
// token's start and end index in tokenInfo, along with
// the token's type and color to use.
// If the token is a quoted string and the string continues
// on the next line, set state to InQuotes.
// If the token is a comment and the comment continues
// on the next line, set state to InComment.
bFoundToken = true;
}
}
return bFoundToken;
}
/////////////////////////////////////////////////////
// IScanner methods
public bool ScanTokenAndProvideInfoAboutIt(TokenInfo tokenInfo,
ref int state)
{
bool bFound = false;
if (tokenInfo != null)
{
bFound = GetNextToken(m_offset, tokenInfo, ref state);
if (bFound)
{
m_offset = tokenInfo.EndIndex + 1;
}
}
return bFound;
}
public void SetSource(string source, int offset)
{
m_offset = offset;
m_source = source;
}
}
}