Partager via


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
Méthode publique ScanTokenAndProvideInfoAboutIt Analyse le jeton suivant de langage de la ligne en cours et retourne des informations connexes.
Méthode publique 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;
        }
    }
}

Voir aussi

Référence

Microsoft.VisualStudio.Package, espace de noms