Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Разработка плагина IntelliJ IDEA. Часть 5

Anna | 5.06.2014 | нет комментариев

Класс, применяемый в IDEA для определения, как соответствующий текстовый диапазон должен быть подсвечен, именуется TextAttributesKey. Экземпляр этого класса создается для всякого разного типа элементов, которые обязаны быть подсвечены (ключевые слова, числа, строки, комментарии и т.д.), он определяет признаки по-умолчанию, которые используются к элементам соответствующего типа (скажем, ключевые слова выдаются полужирным, числа – синим, строки – курсивом и зеленым фоном). Отображение TextAttributesKey на специфические признаки, используемые в редакторе, определено классомEditorColorsScheme и может быть настроено пользователем, если плагин предоставляет соответствующий конфигурационный интерфейс. В подсветке может применяться наложение нескольких TextAttributeKey: скажем, один ключ может определять начертание, а иной – цвет элемента.

Базовая подсветка синтаксиса

Подсветка синтаксиса и ошибок выполняется на различных ярусах. На первом – подсветка синтаксиса, основанная на итогах лексического разбора, осуществляется посредством интерфейса SyntaxHighlighter. Данный интерфейс возвращает экземпляры TextAttributeKey для всякого типа токенов, тот, что требует специальную подсветку. Для подсвечивания ошибок лексера используется типовой объект класса TextAttributeKey для недопустимых символов (HighligherColors.BAD_CHARACTER).

Схема управления цветом немножко изменилась в Intelli IDEA 12.1, Дабы облегчить работу дизайнеров схем и сделать идентичное отображение для разных языков программирования, даже если схема не была первоначально предуготовлена для них. Ранее языковые плагины применяли фиксированные цветовые схемы не неизменно совместимые, скажем, с темными темами. Новая реализация разрешает определить зависимости от комплекта стандартных текстовых признаков, привязанных к схеме, а не определенному языку. Признаки для специфических языков все еще могут быть установлены дизайнером схемы, но сейчас они необязательны. Новые цветовые схемы получили растяжение .icls во избежание задач с совместимостью.
Сейчас для определения текстовых признаков и зависимости от стандартных ключей применяется классDefaultLanguageHighlighterColors.

Пример: реализация SyntaxHighlighlighter для плагина Properties.

На втором ярусе подсветки – выделение ошибок, произошедших во время синтаксического разбора. Если определенная цепочка токенов не соответствует грамматике языка, способ PsiBuilder.error() может быть использован для подсветки ложных токенов и отображения сообщения об ошибке.

Аннотации

3-й ярус подсветки выполняется с поддержкой интерфейса Annotator. Плагин может зарегистрировать одну либо несколько аннотаций в точках растяжения com.intellij.annotator, позже чего они будут вызваны в фоновом процессе во время подсветки элементов PSI-дерева пользовательского языка. Аннотации могут исследовать не только синтаксис, но и семантику и таким образом предоставлять больше тонкую логику обработки и подсветки ошибок. Аннотация может содержать функциональность для решения найденных задач (т.н. quick fix).

Когда файл изменен, аннотация вызывается инкрементально для обработки только изменившихся элементов PSI-дерева.
Для подсветки определенного диапазона текста как ошибки либо предупреждения, аннотация вызывает createErrorAnnotation() либо createWarningAnnotation() на объекте типа AnnotationHolder, и опционально registerFix() на возвращаемом объекте класса Annotator для добавления логики исправления ошибки. Для использования дополнительной подсветки, аннотация может вызвать AnnotationHolder.createInfoAnnotation() с пустым сообщением и после этого, вызвав Annotation.setTextAttributes(), установить признаки текста.

Пример: Annotator для языка Properties.

Внешние аннотации

Наконец, если в пользовательском языке применяется внешние средства для валидации файлов, их итоги дозволено предоставить, реализовав интерфейс ExternalAnnotator и зарегистрировав его в точке растяженияcom.intellij.externalAnnotator. Подсветка с поддержкой ExternalAnnotator имеет минимальный приоритет и выполняется только позже выполнения всех фоновых процессов. Внешние аннотации применяют тот же интерфейс AnnotationHolder для адаптации итога внешних инструментов и показа подсветки.

Страница настроек цвета

Плагин также может предоставить конфигурационный интерфейс, разрешающий пользователю настраивать цвета определенных элементов. Для этого нужно сделать экземпляр класса ColorSettingPage и зарегистрировать его в точке растяжения com.intellij.colorSettingsPage.

Пример: ColorSettingsPage для Properties.

Функция «Export to HTML» использует тот же механизм подсветки, что и редактор, следственно становится доступной для пользовательского языка сразу позже реализации SyntaxHighlighter.

Ссылочная система IntelliJ IDEA

Одна из особенно значимых и запутанных частей в реализации программной конструкции пользовательского языка – это разрешение ссылок, т.е. способность проследовать от места применения элемента (переменная в выражении, вызов способа и т.д.) к месту определения (декларации переменной, способа и т.п.). Это требуется для поддержки многих функций IDEA, таких как «Go to Declaration» (Ctrl-B и Ctrl-Click), а также при поиске применений, переименовании, автодополнении.

Всякий PSI-элемент, тот, что должен трудиться ссылкой обязан переопределить способ PsiElement.getReference(), так Дабы он возвращал соответствующую реализацию интерфейса PsiReference. Данный интерфейс может быть реализован как самим классом PsiElement, так и отдельным. Если элемент может содержать несколько ссылок (скажем, строка с перечислением классов), то в таком случае он должен реализовать способ PsiElement.getReferences(), возвращающий массив из ссылок.

Основной способ интерфейса PsiReference – это resolve(), тот, что возвращает либо элемент, на тот, что указывает ссылка, либо null, если немыслимо позволить ссылку (скажем, если указывает на неопределенный класс). Противоположный ему способ isReferenceTo(), тот, что проверяет, указывает ли ссылка на определенный элемент. Конечный способ может быть реализован с поддержкой вызова resolve() и сопоставления итога с переданным PSI-элементом, но разрешает разработчику применить добавочные оптимизации.

Пример: Ссылка на ResourceBundle в плагине Properties.

IDEA предоставляет уйма интерфейсов, которые могут быть использованы как база для реализации поддержки ссылок, а именно интерфейс PsiScopeProcessor и способ PsiElement.processDeclarations(). Эти интерфейсы владеют большинством трудностей, которые не непременны для большинства пользовательских языков (скажем, помощь подстановки обобщенных типов), но они нужны, если пользовательский язык может ссылаться на Java код. Если интероперабельность с Java не требуется, либо имеются другие поводы, плагин может переопределить стандартную реализацию разрешения ссылок.

Типовые вспомогательные классы IDEA, используемые для разрешения ссылок, состоят из следующих компонентов:

  • класса, реализующего интерфейс PsiScopeProcessor, тот, что собирает допустимые определения ссылок и останавливает процесс разрешения, когда он всецело закончен. Основной способ, тот, что нужно реализовать – это execute(), котор_twomk! href=”http://habrahabr.ru/post/187106/”>1, 2345.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB