Validando os pontos de interrupção (estrutura de pacote gerenciado)
Um ponto de interrupção indica que a execução do programa deve parar em um determinado ponto, enquanto ele está sendo executado em um depurador. Um usuário pode colocar um ponto de interrupção em qualquer linha no arquivo de origem, desde que o editor não tem conhecimento sobre o que constitui um local válido para um ponto de interrupção. Quando o depurador é iniciado, todos os pontos de interrupção marcados (chamados pendentes pontos de interrupção) são vinculados para o local apropriado no programa em execução. Ao mesmo tempo que os pontos de interrupção são validados para garantir que eles marcam locais de código válido. Por exemplo, um ponto de interrupção em um comentário não é válido, porque não há nenhum código nesse local no código fonte. O depurador desativa os pontos de interrupção inválidos.
Desde que o serviço da linguagem conheça o código-fonte que está sendo exibido, ele pode validar os pontos de interrupção antes que o depurador é iniciado. Você pode substituir o ValidateBreakpointLocation método para retornar um intervalo, especificando um local válido para um ponto de interrupção. O local do ponto de interrupção ainda é validado quando o depurador é iniciado, mas o usuário é notificado de pontos de interrupção inválida sem esperar que o depurador carregar.
Implementação do suporte para validação de pontos de interrupção
O ValidateBreakpointLocation método é dada a posição do ponto de interrupção. Sua implementação deve decidir se deseja ou não o local é válido e indicar isso retornando um intervalo de texto que identifica o código associado com a posição de linha no ponto de interrupção.
Retornar S_OK se o local é válido, ou S_FALSE se não for válido.
Se o ponto de interrupção for válido, o intervalo de texto é realçado juntamente com o ponto de interrupção.
Se o ponto de interrupção for inválido, uma mensagem de erro é exibida na barra de status.
Exemplo
Este exemplo mostra uma implementação da ValidateBreakpointLocation método que chama o analisador para obter o trecho de código (se houver) no local especificado.
Este exemplo assume que você adicionou um GetCodeSpan método para o AuthoringSink classe valida a extensão do texto e retorna true se ele for um local válido do ponto de interrupção.
using Microsoft VisualStudio;
using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio.TextManager.Interop;
namespace TestLanguagePackage
{
class TestLanguageService : LanguageService
{
public override int ValidateBreakpointLocation(IVsTextBuffer buffer,
int line,
int col,
TextSpan[] pCodeSpan)
{
int retval = VSConstants.S_FALSE;
if (pCodeSpan != null)
{
// Initialize span to current line by default.
pCodeSpan[0].iStartLine = line;
pCodeSpan[0].iStartIndex = col;
pCodeSpan[0].iEndLine = line;
pCodeSpan[0].iEndIndex = col;
}
if (buffer != null)
{
IVsTextLines textLines = buffer as IVsTextLines;
if (textLines != null)
{
Source src = this.GetSource(textLines);
if (src != null)
{
TokenInfo tokenInfo = new TokenInfo();
string text = src.GetText();
ParseRequest req = CreateParseRequest(src,
line,
col,
tokenInfo,
text,
src.GetFilePath(),
ParseReason.CodeSpan,
null);
req.Scope = this.ParseSource(req);
TestAuthoringSink sink = req.Sink as TestAuthoringSink;
TextSpan span = new TextSpan();
if (sink.GetCodeSpan(out span))
{
pCodeSpan[0] = span;
retval = VSConstants.S_OK;
}
}
}
}
return retval;
}
}
}
Consulte também
Outros recursos
Recursos de serviço de linguagem (estrutura de pacote gerenciado)