Разработка Плагина Intellij Idea. Часть 3

Немного теории о проектах и VFS. Предыдущая часть здесь .



Структура проекта

В IntelliJ IDEA проект инкапсулирует все исходные коды, библиотеки, скрипты сборки в единый организационный блок.

Абсолютно все действия в IDEA происходят в контексте проекта.

Проект может содержать коллекции модулей и библиотек.

В зависимости от логических или функциональных требований вы можете создать одномодульный или многомодульный проект.

Модули
Модуль — это отдельный функциональный объект, который можно запускать, тестировать и отлаживать независимо.

Модули включают в себя такие вещи, как исходный код, сценарии сборки, модульные тесты и т. д. Каждый модуль в проекте может использовать определенный SDK или наследовать SDK проекта.

Модули могут зависеть от других модулей в проекте.



Библиотеки
Библиотека — это скомпилированный код в архиве (например, JAR-файле), от которого зависят модули.

IntelliJ IDEA Community Edition поддерживает три типа библиотек:

  • библиотека модулей – видна только в этом модуле, информация о ней сохраняется в файле *.

    iml;

  • библиотека проекта – видна внутри всего проекта, информация о ней сохраняется в файле *.

    ipr;

  • глобальная библиотека — информация о ней сохраняется в файле applicationLibraries.xml, видимость которого распространяется на все проекты.



SDK
В каждом проекте используется комплект разработки программного обеспечения (SDK).

Для проектов Java существует специальный тип SDK, называемый JDK (Java Development Kit).

SDK определяет, какой API используется при сборке проекта.

В многомодульном проекте по умолчанию SDK наследуется всеми модулями, но также возможно определить отдельные SDK для соответствующих модулей.



Фасет
Фасет — это функциональность, связанная с модулем, которая сообщает, как взаимодействовать с содержимым модуля.

Модуль может иметь несколько Фасетов.

IntelliJ IDEA Ultimate Edition имеет параметр в настройках проекта, который позволяет назначать фасеты, в отличие от Community Edition, где назначение фасетов доступно только из API.

Структура проекта
С точки зрения разработчика плагина структура проекта выглядит так, как показано на рисунке ниже.

Проект содержит один или несколько модулей.

Каждый модуль включает исходный код плагина и вызывает упорядоченный набор объектов, связанных с SDK и библиотеками.

Модуль может иметь набор фасетов.



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



Работа с файлами проекта, модулями, библиотеками
IntelliJ IDEA сохраняет данные конфигурации в файлах XML. Список этих файлов зависит от формата проекта.

Для файловых форматов проекта информация хранится в самом файле проекта «имя-плагина.

ipr».

Информация о модулях сохраняется в файлах «имя-модуля.

iml», которые создаются для каждого модуля.

Для формата проекта на основе каталога настройки проекта сохраняются в нескольких XML-файлах в подкаталоге «.

idea».

Каждый файл отвечает за свой набор настроек и имеет соответствующее имя: projectCodeStyle.xml,codings.xml, vcs.xml и так далее.

Данные модуля сохраняются в файлах *.

iml. Для работы с проектами и файлами проектов существует несколько интерфейсов и классов:

  • Интерфейс проекта;
  • абстрактный класс ProjectRootManager;
  • абстрактный класс ProjectManager;
  • интерфейс ProjectFileIndex.
IntelliJ IDEA предоставляет следующие классы для работы с модулями:
  • абстрактный класс ModuleManager;
  • Интерфейс модуля;
  • абстрактный класс ModuleRootManager;
  • интерфейс ModuleRootModel;
  • класс ModuleUtil;
  • интерфейс МодифицируемаяМодульМодель;
  • интерфейс МодифицируемаяРутМодель.

Чтобы получить список библиотек, вы можете перечислить все сущности модуля и выбрать экземпляры интерфейса LibraryOrderEntry. Чтобы получить классы, содержащиеся в библиотеке, вы можете использовать метод Library.ModifyingModel.getUrls. Для работы с фасетом существуют классы DefaultFacetsProvider и Facet.

Виртуальная файловая система IntelliJ IDEA
Виртуальная файловая система (VFS) — это компонент IntelliJ IDEA, который инкапсулирует большую часть функций для работы с файлами.

Служит для следующих целей:

  • предоставление универсального API для работы с файлами независимо от их физического расположения (на диске, в архиве, на FTP-сервере и т.п.

    );

  • отслеживание изменений файлов и предоставление как старых, так и новых версий их содержимого;
  • предоставление возможности указать дополнительную информацию для файла в VFS.
Чтобы обеспечить две последние функции, VFS создает снимки содержимого на жестком диске.

Снимок включает в себя только те файлы, которые были хотя бы один раз запрошены через программный интерфейс VFS, и асинхронно обновляет их в соответствии с изменениями, происходящими на диске.

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

Все операции доступа выполняются через снимок; если запрошенная информация недоступна, то она загружается с диска.

Содержимое файлов и список файлов в каталоге сохраняются только в случае запроса конкретной информации, в противном случае сохраняется только метаинформация (имя, размер и т. д.).

Все операции записи синхронны, т.е.

данные записываются на диск немедленно.

IntelliJ IDEA выполняет асинхронную операцию полного обновления содержимого при запуске.

Также по умолчанию обновление происходит при переходе из другого приложения, но такое поведение можно настроить в «Настройки | Синхронизировать файлы».

Операция синхронизации основана на временных метках; если дата модификации не изменилась, то IDEA не обновляет содержимое файла.

По возможности IntelliJ IDEA использует средства отслеживания файлов, встроенные в операционную систему (inotify, epoll и т. д.).



События виртуальной файловой системы
Все изменения, происходящие в виртуальной файловой системе в результате операции обновления или действий пользователя, называются событиями виртуальной файловой системы.

Самый эффективный способ прослушивания событий VFS — реализовать интерфейс BulkFileListener и подписаться на VirtualFileManager.VFS_CHANGES. Этот API предоставляет список всех изменений, произошедших во время операции обновления, что позволяет выполнять пакетную обработку.

Альтернативный способ — реализовать интерфейс VirtualFileListener и зарегистрировать его с помощью VirtualFileManager.addFileListener().

Эта опция позволяет обрабатывать изменения по одному.

Не забывайте, что обработчики работают на уровне приложения, поэтому получают события от всех проектов, открытых пользователем.

Поэтому в первую очередь стоит фильтровать только события, имеющие отношение к активному проекту.

При обновлении события создаются только для файлов, загруженных в снапшот. Следовательно, если через VirtualFile.findChild() был загружен один файл, то изменения, происходящие с ним, будут отслеживаться, а с соседними по каталогу - нет. В следующий части: лексический, синтаксический анализ, PSI, индекс-заглушка.

Все статьи серии: 1 , 2 , 3 , 4 , 5 , 6 , 7 .

Теги: #intellij idea #плагины #разработка #программирование #java

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.