Partilhar via


Implementando um serviço de linguagem (estrutura de pacote gerenciado)

Para implementar um serviço de linguagem usando a estrutura de pacote gerenciado (MPF), você deve derivar uma classe a partir de LanguageService de classe e implementar as propriedades e métodos abstratos seguintes:

Consulte as seções apropriadas abaixo para obter detalhes sobre como implementar esses métodos e propriedades.

Para oferecer suporte a recursos adicionais, seu serviço de linguagem talvez seja necessário derivar uma classe de uma das classes de serviço de linguagem MPF; Por exemplo, para oferecer suporte a comandos de menu adicional, você deve derivar uma classe a partir de ViewFilter de classe e substituir vários dos métodos de manipulação de comandos (consulte ViewFilter para obter detalhes). O LanguageService classe fornece vários métodos que são chamados para criar novas instâncias de várias classes e você substituir o método apropriado de criação para fornecer uma instância da classe. Por exemplo, você precisará substituir o CreateViewFilter método na LanguageService classe para retornar uma instância do seu próprio ViewFilter classe. Consulte a seção "Instanciação de Classes personalizadas" para obter mais detalhes.

O serviço de linguagem também pode fornecer seus próprios ícones, que são usados em muitos lugares. Por exemplo, quando uma lista de conclusão de IntelliSense é mostrada, cada item na lista pode ter um ícone associado a ele, marcando o item como um método, a classe, o espaço para nome, a propriedade, ou o que for necessário para o seu idioma. Esses ícones são usados em todas as listas de IntelliSense, o barra de navegaçãoe de Error List janela tarefa. Consulte a seção "Imagens de serviço da linguagem" abaixo para obter detalhes.

Método GetLanguagePreferences

O GetLanguagePreferences método sempre retorna a mesma instância de um LanguagePreferences classe. Você pode usar a base de LanguagePreferences se você não precisa qualquer preferências adicionais para o serviço de linguagem de classe. As classes de serviço de idioma do MPF pressupõem a presença de pelo menos a base de LanguagePreferences classe.

Exemplo

Este exemplo mostra uma implementação típica da GetLanguagePreferences método. Este exemplo usa a base da LanguagePreferences classe.

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

Método GetScanner

Esse método retorna uma instância de um IScanner objeto que implementa um analisador orientado por linhas ou o scanner usado para obter tokens e seus tipos e disparadores. Este mecanismo é usado na Colorizer classe para colorização, embora o mecanismo de varredura também pode ser usado para obter os tipos de token e disparadores como um prelude para uma operação de análise mais complexa. Você deve fornecer a classe que implementa o IScanner interface e você deve implementar todos os métodos de IScanner interface.

Exemplo

Este exemplo mostra uma implementação típica da GetScanner método. O TestScanner classe implementa o IScanner interface (não mostrado).

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

Método ParseSource

Analisa o arquivo de origem com base em uma série de motivos diferentes. Este método é fornecido um ParseRequest objeto que descreve o que se espera de uma determinada operação de análise. O ParseSource método invoca um analisador mais complexo que determina a funcionalidade de token e escopo. O ParseSource método é usado no suporte para operações de IntelliSense, bem como a chave correspondente. Mesmo se você não suporta tais operações avançadas, você ainda deve retornar um válido AuthoringScope objeto e que exige a criação de uma classe que implementa o AuthoringScope interface e implementar todos os métodos nesta interface. Você pode retornar valores nulos de todos os métodos, mas o AuthoringScope próprio objeto não deve ser um valor nulo.

Exemplo

Este exemplo mostra uma implementação mínima da ParseSource método e a AuthoringScope classe, suficiente para permitir que o serviço de linguagem compilar e funcionar sem na verdade, com suporte para qualquer um dos recursos mais avançados.

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

Propriedade Name

Essa propriedade retorna o nome do serviço de linguagem. Esse deve ser o mesmo nome fornecido quando o serviço de idioma foi registrado. Este nome é usado em um número de casas, o mais proeminente é o LanguagePreferences onde o nome é usado para acessar o registro de classe. O nome retornado por essa propriedade não deve ser traduzido como ele é usado para entrada de registro e nomes de chave no registro.

Exemplo

Este exemplo mostra uma possível implementação da Name propriedade. Observe que o nome aqui é embutido: o nome real deve ser obtido de um arquivo de recurso para que ele pode ser usado no registro de um serviço de linguagem (consulte Registrando um serviço de linguagem (estrutura de pacote gerenciado)).

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

namespace TestLanguagePackage
{
    public class TestLanguageService : LanguageService
    {
        public override string Name
        {
            get { return "Test Language"; }
        }
    }
}

Instanciação de Classes personalizadas

Os seguintes métodos nas classes especificados podem ser substituídos para fornecer instâncias de suas próprias versões de cada classe.

Na classe LanguageService

Método

Classe retornada

Descrição

CreateCodeWindowManager

CodeWindowManager

Para oferecer suporte a adições personalizadas para o modo de exibição de texto.

CreateDocumentProperties

DocumentProperties

Para oferecer suporte a propriedades de documento personalizadas.

CreateDropDownHelper

TypeAndMemberDropdownBars

Para oferecer suporte a barra de navegação.

CreateExpansionFunction

ExpansionFunction

Para oferecer suporte a funções nos modelos de trecho de código.

CreateExpansionProvider

ExpansionProvider

Para suportar os trechos de código (Este método geralmente não é substituído).

CreateParseRequest

ParseRequest

Para dar suporte à personalização da ParseRequest estrutura (Este método geralmente não é substituído).

CreateSource

Source

Para dar suporte à formatação código-fonte, especificando os caracteres de comentário e personalização de assinaturas de método.

CreateViewFilter

ViewFilter

Para oferecer suporte a comandos de menu adicionais.

GetColorizer

Colorizer

Para suportar o realce de sintaxe (Este método geralmente não é substituído).

GetLanguagePreferences

LanguagePreferences

Para oferecer suporte ao acesso às preferências de idioma. Esse método deve ser implementado, mas pode retornar uma instância da classe base.

GetScanner

IScanner

Para fornecer um analisador usado para identificar os tipos de tokens em uma linha. Este método deve ser implementado e IScanner deve ser derivado.

ParseSource

AuthoringScope

Para fornecer um analisador usado para identificar a funcionalidade e o escopo ao longo de um arquivo de origem inteiro. Este método deve ser implementado e deve retornar uma instância da sua versão do AuthoringScope classe. Se tudo o que você quiser suportar é realce de sintaxe (que requer a IScanner analisador retornado do GetScanner método), você pode fazer nada nesse método diferente de retorno de uma versão do AuthoringScope classe cujos todos os métodos retornam valores nulos.

Na classe de origem

Método

Classe retornada

Descrição

CreateCompletionSet

CompletionSet

Para personalizar a exibição de listas de conclusão de IntelliSense (Este método geralmente não é substituído).

CreateErrorTaskItem

DocumentTask

Para oferecer suporte a marcadores na lista de tarefas lista de erros; Especificamente, o suporte para recursos, além de abrir o arquivo e saltar para a linha que causou o erro.

CreateMethodData

MethodData

Para personalizar a exibição de dicas de ferramentas do IntelliSense parâmetro Info.

GetCommentFormat

CommentInfo

Para oferecer suporte a comentando o código.

CreateAuthoringSink

AuthoringSink

Para reunir informações durante a operação de análise.

Na classe AuthoringScope

Método

Classe retornada

Descrição

GetDeclarations

Declarations

Fornece uma lista das declarações, como membros ou tipos. Esse método deve ser implementado, mas pode retornar um valor nulo. Se esse método retorna um objeto válido, o objeto deve ser uma instância da sua versão do Declarations classe.

GetMethods

Methods

Fornece uma lista de assinaturas de método para um determinado contexto. Esse método deve ser implementado, mas pode retornar um valor nulo. Se esse método retorna um objeto válido, o objeto deve ser uma instância da sua versão do Methods classe.

Manutenção de imagens do idioma

Para fornecer uma lista de ícones para serem usados em todo o serviço de linguagem, substituir o GetImageList método na LanguageService de classe e retornar um ImageList que contém os ícones. Base da LanguageService classe carrega um conjunto padrão de ícones. Uma vez que você especificar o índice de imagem exata nesses lugares que precisam de ícones, como você organiza a sua própria lista de imagem é integralmente com você.

Imagens usadas em listas de conclusão de IntelliSense

Para listas de conclusão de IntelliSense, o índice de imagem é especificado para cada item da GetGlyph método da Declarations classe, que você deve substituir se você desejar fornecer um índice de imagem. O valor retornado da GetGlyph método é um índice na lista de imagens fornecida para o CompletionSet construtor de classe e é a mesma lista de imagem retornados da GetImageList método no LanguageService classe (você pode alterar a lista de imagem a ser usada para o CompletionSet se você substituir o CreateCompletionSet método no Source classe para fornecer uma lista de imagem diferente).

Imagens usadas na barra de navegação

O barra de navegação exibe listas de tipos e membros e é usada para navegação rápida pode mostrar os ícones. Esses ícones são obtidos da GetImageList método na LanguageService de classe e não pode ser substituída especificamente para o barra de navegação. Os índices usados para cada item nas caixas de combinação são especificados quando as listas que representa as caixas de combinação são preenchidas a OnSynchronizeDropdowns método na TypeAndMemberDropdownBars classe (consulte Suporte para a barra de navegação (estrutura de pacote gerenciado)). Esses índices de imagem são obtidos de alguma forma de analisador, normalmente por meio de sua versão do Declarations classe. Como os índices são obtidos é integralmente com você.

Imagens usadas na janela de tarefa da lista de erros

Sempre que o ParseSource analisador de método (consulte Analisador de serviço de linguagem e o Scanner (estrutura de pacote gerenciado)) encontra um erro e passa a que esse erro o AddError método na AuthoringSink classe, o erro é relatado na Error List janela tarefa. Um ícone pode ser associado a cada item que aparece na janela de tarefas e esse ícone vem da mesma lista de imagem retornada da GetImageList método na LanguageService classe. O comportamento padrão das classes MPF é não mostrar uma imagem com a mensagem de erro. No entanto, você pode substituir esse comportamento, derivando uma classe a partir de Source classe e substituindo o CreateErrorTaskItem método. Nesse método, você cria uma nova DocumentTask objeto. Antes de retornar a esse objeto, você pode usar o ImageIndex propriedade no DocumentTask objeto para definir o índice de imagem. Isso poderia ser algo semelhante ao exemplo a seguir. Observe que TestIconImageIndex é uma enumeração que lista todos os ícones e é específico para este exemplo. Você pode ter uma maneira diferente de identificar os ícones no seu serviço de linguagem.

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

A lista de imagens padrão para um serviço de linguagem

A lista de imagens padrão fornecida com as classes de serviço de idioma base do MPF contém um número de ícones associados os elementos de linguagem mais comuns. A maior parte desses ícones são organizadas em conjuntos de seis variações, correspondentes aos conceitos de acesso do público, interno, amigo, protected, private e o atalho. Por exemplo, você pode ter ícones diferentes para um método dependendo se pública, protegida ou privada.

A enumeração seguinte especifica os nomes comuns para cada conjunto de ícones e especifica o índice associado. Por exemplo, baseada na enumeração, você pode especificar o índice de imagens para um método protegido como (int)IconImageIndex.Method + (int)IconImageIndex.AccessProtected. Você pode alterar os nomes desta enumeração conforme desejado.

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

Consulte também

Conceitos

Visão geral do serviço de linguagem (estrutura de pacote gerenciado)

Registrando um serviço de linguagem (estrutura de pacote gerenciado)

Analisador de serviço de linguagem e o Scanner (estrutura de pacote gerenciado)

Outros recursos

Implementando um serviço de idioma usando a estrutura de pacote gerenciado