Web-разработка, иностранные языки, Eclipse и разные разности

Zygo Profile

Санскрит - словоформы

Verbos Irregulares

5. UI интеграция точек останова.

05.11.2015

В предыдущей части руководства мы реализовали проход по исходному коду. Пошаговый проход - это здорово, но нам еще нужно добавить поддержку точек останова для улучшения качества отладки. В конце данного руководства мы сможем устанавливать их, используя UI:



В среде Эклипс существует несколько разновидностей точек останова:
точки останова на строке (line breakpoints) - остановка исполнения кода на определенной строке, точка останова на функции (function breakpoints) - останов происходит, когда вызывается некоторая функция foo(), контрольные точки (watchpoints) - останов происходит, когда определенная переменная используется в коде или изменяет свое значение. Не все из них имеют смысл, когда речь идет о каком-либо специализированном языке. В этом руководстве мы рассмотрим только точки останова на строке.

Шаг 1. Определение точек останова.


Точки останова определены в точке расширения breakpoints. Чтобы сделать эти точки останова постоянными, эклипс использует маркеры. Таким образом, каждая точка останова подкрепляется маркером, который привязан к ресурсу рабочего пространства (workspace resource).

Создайте новое расширение org.eclipse.core.resource.markers в com.codeandme.textinterpreter.debugger/plugin.xml. Идентификатор маркера ID должен быть записан как единое слово, без предваряющего его имени плагина, поэтому давайте присвоим ему значение "textLineBreakpointMarker". В полном названии маркера появится приставка в виде ID плагина. Наш маркер должен являться подтипом org.eclipse.debug.core.lineBreakpointMarker и быть постоянным.

Затем мы можем создать расширение org.eclipse.debug.core.breakpoints, которое ссылается на только что созданный тип маркера.



Реализация достаточно проста, мы всего лишь добавили конструктор, чтобы привязать точки останова к ресурсу.



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.codeandme.textinterpreter.debugger.breakpoints;  
  
public class TextLineBreakpoint extends LineBreakpoint {  
  
 public TextLineBreakpoint() {  
 }  
  
 public TextLineBreakpoint(final IResource resource, final int lineNumber) throws CoreException {  
  this(resource, lineNumber, true);  
 }  
  
 protected TextLineBreakpoint(final IResource resource, final int lineNumber, final boolean persistent) throws CoreException {  
  IWorkspaceRunnable runnable = new IWorkspaceRunnable() {  
   @Override  
   public void run(IProgressMonitor monitor) throws CoreException {  
    IMarker marker = resource.createMarker("com.codeandme.textinterpreter.debugger.textLineBreakpointMarker");  
    setMarker(marker);  
    marker.setAttribute(IBreakpoint.ENABLED, true);  
    marker.setAttribute(IBreakpoint.PERSISTED, persistent);  
    marker.setAttribute(IMarker.LINE_NUMBER, lineNumber);  
    marker.setAttribute(IBreakpoint.ID, getModelIdentifier());  
    marker.setAttribute(IMarker.MESSAGE, "Line Breakpoint: " + resource.getName() + " [line: " + lineNumber + "]");  
   }  
  };  
  run(getMarkerRule(resource), runnable);  
 }  
  
 @Override  
 public String getModelIdentifier() {  
  return TextDebugModelPresentation.ID;  
 }  
}  

Убедитесь в том, что вы сохранили конструктор по умолчанию, поскольку он необходим отладочному фреймворку для восстановления точек останова.

Как видите, мы здесь использовали новый класс: TextDebugModelPresentation. Он необходим, чтобы охватить все стороны отладочной модели для конкретного типа отладчки. На данный момент это пустая реализация интерфейса IDebugModelPresentation, предоставляющая свой ID только как статическую константу. Не забудьте прописать ее как расширение в com.codeandme.textinterpreter.debugger/plugin.xml.



Шаг 2. Добавьте в редактор поддержку точек останова


Пользователи желают установить точки останова в редактор кода. Для этого выбранный нами редактор должен осуществлять интерфейс IToggleBreakpointsTarget. К сожалению, текстовый редактор по умолчанию не поддерживает этот интерфейс. Поэтому нам необходимо создать адаптер для редактора. Шаблон адаптера не входит в данное руководство. Если вы желаете получить больше информации о том, как создавать адаптеры, вы можете почитать эту статью

Аdapter factory создает экземпляры TextLineBreakpointTarget:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package com.codeandme.textinterpreter.debugger.breakpoints;  
  
public class TextLineBreakpointTarget implements IToggleBreakpointsTarget {  
  
 // FIXME for full source code see http://codeandme.googlecode.com/svn/trunk/blog/debugger/05/com.codeandme.textinterpreter.debugger/src/com/codeandme/textinterpreter/debugger/breakpoints/TextLineBreakpointTarget.java  
  
 @Override  
 public boolean canToggleLineBreakpoints(IWorkbenchPart part, ISelection selection) {  
  return true;  
 }  
  
 @Override  
 public void toggleLineBreakpoints(IWorkbenchPart part, ISelection selection) throws CoreException {  
  ITextEditor textEditor = getEditor(part);  
  if (textEditor != null) {  
   IResource resource = (IResource) textEditor.getEditorInput().getAdapter(IResource.class);  
   ITextSelection textSelection = (ITextSelection) selection;  
   int lineNumber = textSelection.getStartLine();  
   IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints(TextDebugModelPresentation.ID);  
   for (int i = 0; i < breakpoints.length; i++) {  
    IBreakpoint breakpoint = breakpoints[i];  
    if (resource.equals(breakpoint.getMarker().getResource())) {  
     if (((ILineBreakpoint) breakpoint).getLineNumber() == (lineNumber + 1)) {  
      // existing breakpoint; delete  
      breakpoint.delete();  
      return;  
     }  
    }  
   }  
  
   // new breakpoint; create  
   TextLineBreakpoint lineBreakpoint = new TextLineBreakpoint(resource, lineNumber + 1);  
   DebugPlugin.getDefault().getBreakpointManager().addBreakpoint(lineBreakpoint);  
  }  
 }  
}  

Аналогично командам пошагового прохода и возобновления, приведенным в предыдущих частях руководства, нам необходимо реализовать некоторый метод canToggleBreakpoint(). В нашем случае мы только разрешаем поддержку точек останова на строке (LineBreakpoints). Переключение само по себе просто:
  1. запрашивается активный редактор (строка 14)
  2. запрашивается текущий номер строки из выбранного фрагмента (строки 17, 18)
  3. проводится поиск существующей точки останова на этих строках (строки 19-29)
  4. возможно, удаляется существующая точка останова или создается новая (строки 25-33).

Когда вы запустите ваше приложение, вы сможете установить точки остановки, используя элемент меню Run/Toggle Breakpoint.

Шаг 3. Установка и удаление точек установа в контекстное меню линейки текстового редактора.


Чтобы добавить элемент в контекстное меню линейки текстового, нам необходимо использовать действия (actions). Откройте plugin.xml проекта отладчика и добавьте новое расширение org.eclipse.ui.popupMenus. Добавьте в него новый viewerContribution. Установите id равным "textEditor.rulerActions" и присвойте targetID значение "#TextRulerContext". Затем добавьте новое действие (action) и установите его id равным  "pda.editor.ruler.toggleBreakpointAction". Реализация получается достаточно скучной, поскольку она всего лишь получает номер строки после щелчка мышью и затем использует наш IToggleBreakpointsTarget (о котором мы говорили ранее), чтобы установить/удалить точки останова.



Завершение:

Сейчас мы уже можем установить точки останова из UI. Но наш отладчик прямо сейчас еще их не использует. В следующей части мы осуществим поддержку отлачиком точек останова.
Облако тегов
Меню
Архив
© Psytronica.ru. Блог существа SherZa. 2015-2017 Наверх