Module Extensions API - replacement for ModuleType & Facet & ModuleExtension(old)

Sorry this text ill be in Russian - due to problems with understanding.


Здраствуйте. Речь пойдет о замене Фасетов, типов модулей, и других - на общий механизм, который сейчас называется ModuleExtension. Когда то я поднимал тему про замену - типов модулей на Фасеты (http://devnet.jetbrains.com/thread/432546) с того времени много воды утекло, и я обдумал как будет лучше.

В: Зачем все это?

О: Есть разные ситуации.
        Первая сторона - сторона пользователя. Для меня как для пользователя Facet & Framework это чтото непонятное - часто путающее с ModuleType, ибо часто плагины реализовую Фасеты и Модуль Типы
        Вторая сторона - сторона разработчика. Пример С++ плагин - в коде есть и Facet + Module Type, которые по сути играют одну и туже роль.

Что я предлагаю.

Заменить все выше описаные API , на одно.

Модуль Разширения  - что оно такое. Это некий обьект который хранит в себе настройки, и который может быть отключен. Он может иметь "зависимые" модули - которые в случаии выключения родителя, выключаются также.

Пример этого древа.

http://klikr.org/3543e1f709b3054af3ee7d2512a5.png

Как я писал - каждое разширения, имеет свои настройки(по нужде). Доступ к ним - по двойном клике в дереве. Пример.
http://klikr.org/3d7efd715a5960b33ae06cc63d2b.png

Реализация. Первый класс это ModuleExtensionType

public interface ModuleExtensionType<T extends ModuleExtension> {   @NotNull   String getId();   @Nullable   ModuleExtensionType<?> getParent();   @NotNull   Collection<ModuleExtensionType<?>> getChildrenTypes();   @NotNull   String getName();   @Nullable   Icon getIcon();   @NotNull   T createModuleExtension(@NotNull Module module);   boolean isEnabledByDefault(); }



Он представляет в себе - Тип разширения. Регистрируются через EP

<moduleExtensionType enabledByDefault="false" id="plugin" parent="java" implementationClass="org.jetbrains.idea.devkit.module.newApi.DevKitModuleExtensionType" />



ModuleExtension - это само разширения, хранит настройки в себе, и хранится в Модуле. Примерное АПИ

public interface ModuleExtension<T extends ModuleExtension<T>> extends PersistentStateComponent<Element>, Disposable {   @NotNull   ModuleExtensionType<T> getType();   @NotNull   Module getModule();   boolean isEnabled();   MutableModuleExtension<?> createMutable(); }



Как я писал - каждое разширения может иметь настройки. Enable / Disable - идут в базовой реализации. А вот другие - идут через ModuleExtensionConfigurable. И регестрируются через EP

<moduleExtension.configurable id="java" implementationClass="com.intellij.openapi.module.JavaModuleExtensionConfigurable" />



Простая реализация (для явы)

public class JavaModuleExtensionConfigurable extends ModuleExtensionConfigurable<JavaMutableModuleExtension> {   public JavaModuleExtensionConfigurable(JavaMutableModuleExtension extension) {     super(extension);   }   @Override   public JComponent createComponent(JavaMutableModuleExtension mutable) {     return new JavaModuleExtensionPanel();   } }




Это из "черновой" реализации. Что в плане. Добавить поддержку - moduleExtension.fileTypeProvilder .  Задуманое API

public interface ModuleExtensionFileTypeProvider
{
  FileType getFileType(ModuleExtension extension, FileType original, VirtualFile virtualFile)
}




Зачем это нужно. На примере Play 1.2. У нас есть файл conf/routes . Который по сути не имеет тип или стоит PlainFileType . Для этого и нужно это АПИ, с её помощью можно возратить PlayRouteFile который потом будет парсится по своих правилах. Таких примеров куча - WEB-INF/web.xml, plugin.xml(DevKit) - и так далее.


JDK vs IntelliJ SDK vs Android SDK

С помощью этого API можно отделить JDK, от других SDK. При выборе - в Java(Extension) , SDK будет автоматически добавлен в Classpath. Таже суть и в DevKit(IntelliJ). Тоисть в Модуле плагина будет такой Classpath

>> Java SDK 1.6

>> IntelliJ SDK 128

>> IntelliJ SDK 128 : copyright


В DevKit Module Extension  - будет к выбору СДК идеи, будет список Плагинов, которые можно будет включить и выключить(тем же самим будет автоматически добавлятся и удалятся с classpath) . Подобную вещь я когда то отрепортил(http://youtrack.jetbrains.com/issue/IDEABKL-6313) но спустя время, понял что каждый модуль может иметь разные Плагин зависимости.

Как можно будет получить SDK. Пример для Java

JavaModuleExtension extension = module.getEnabledExtenstion(JavaModuleExtensionType.class);
if(extension == null) {
   return null;
}

extension.getSdk();




Я подумывал что - сделать базовую реализацию SdkableModuleExtension - которая будет реализовать Екстеншен с СДК внутри.


Hibernate & Spring & Lombok  - прочее

Все настройки унесутся в Ектеншен. Для некоторых будет настройка - скачать Библиотеку(как в них сейчас есть).

Ant И другие Toolwindows

По сути, <toolWindows  будет иметь атрибут dependsOn, в котором будет писатся ModuleExtensionTypeId. Если в проэкте - будет хотя бы один модуль с этим Экстеншеном - он будет отображатся. Для вариантов когда Apache Ant , используется не в среде Java, в настройках можно будет поставить - Show Always.


Вроде все.

PS: Спасибо за то что прочитали :) . По сути - я делаю черновую реалицию, но думаю она останется черновой как минимум пол-года(поэтому я и написал эту тему). Я знаю объемы работы - самое большое это сделать поддержку и "унести" Java. Другие плагины обойдутся заменой одних классов на других. Есть ищо нюансы - с Run Action, но уже обдумано как будет

5 comments

I'm sorry but this is an English language forum, and we're unable to lead discussions in Russian. If you don't feel comfortable with your English, feel free to contact us privately by email or otherwise, or to use a Russian language community (ru_intellijidea in LiveJournal or habrahabr.ru, for example).

0

Yep, my english is bad) Who do I write? This text is so long. This is proposition of API change only for IntelliJ Core Team (this is not for habr, etc)

0

For non-russian readers: Valeriy asked to replace module types, facets and SDK by some common API called ModuleExtension. In fact we're working on
something like that for IDEA 13 but it's a bit early to talk about the details.

--
Nikolay Chashnikov
Software Developer
JetBrains, Inc
http://www.jetbrains.com
"Develop with pleasure!"

0

Please sign in to leave a comment.