Consulo — IDE где Java и C# живут вместе

в 18:39, , рубрики: .net, consulo, IDE, intellij, java

Здравствуйте. Прошло много времени после моих постов на хабре(тык, тык) на тему Consulo. Ниже я расскажу, что изменилось за это время.

Для тех кто пропустил мои посты:

Consulo — это форк IntelliJ IDEA Community Edition, который имеет поддержку .NET(C# на текущий момент), Java, Javascript(NodeJS), и многое другое. Проект собрал множество открытых плагинов в себе. При этом код остался открытым.

Consulo — IDE где Java и C# живут вместе

Хотелось бы уточнить. Пока что Consulo не годится для работы в Production, все развивается очень медленно и силами одного человека (то есть меня).

Но посмотрите чего я добился.

Сравнения реализации Java & C# на простом примере (внимания две больших гифки)

Java

image

C# (Mono)

image

MSIL

С самого начала написания поддержки C#, декомпиляция была только в C# код. Спустя время я понял, что это очень плохо (выходит C# был на верхушке языковой пирамиды .NET, хотя по сути он имеет те же права что и Java(ikvm.net), nemerle, vb). Эта проблема заставляла изобретать некоторые велосипеды. Плюс это сильно влияло на перфоманс (поиск внутри библиотеки занимал много времени).

Плагину уже было пол года, и переделывать было для меня сильно накладно. Но я взвесил все за и против. И решился. Объём работ Вы можете увидеть в ПуллРеквесте на Гитхабе:

github.com/consulo/consulo-dotnet/pull/6

91 коммит — 3 дня. Реализация дала очень много. Доволи сильно выросла скорость поиска внутри бинарного кода, и появилась возможность посмотреть MSIL код(без инструкций, пока для меня это не приоритет)

Consulo — IDE где Java и C# живут вместе

Configuration Profiles

Так как IDEA, не имеет встроенной поддержки профилей, была сделана убогая реализация внутри самого .NET плагина

Consulo — IDE где Java и C# живут вместе

Но это создало много багов, для плагинов которые зависят от .NET(например NUnit, IronPython). Была ещё проблема с зависимостями. Например если у нас проект для Microsoft .NET & Mono .NET, и используется например Apache Thrift либа, проблема в том что билды нужны разные, и подключить 2ве библиотеки, было невозможно.

Выход был один — переписать внутри самой Консулы. Я долго тянул эту задачу, но решил всё-таки сделать. При этом плагины аля Haxe / Google Go/ Java (и прочие) получили возможность смены конфигураций, которая была не возможная внутри IDEA.

Consulo — IDE где Java и C# живут вместе

Debugger

Пока что я не обзавелся Microsoft дебаггером (есть предложения как сделать, но нет рук). Но при этом я улучшаю Mono .NET дебаггер. За это время я исправил много багов. Были исправлены разные проблемы, например когда дебаггер не мог приаттачится к приложению. Была исправлена работа с вложенными классами.

NUnit

Самой главной проблемой была — как подгрузить NUnit со своим логгером. В итоге был написан dotnet-loader. Он подгружает указанный модуль(.exe файл), нужную dll-ку и вызывает нужный метод из класса. Как оказалось — это универсальный способ, и он пригодился мне для NAnt(до этого я имел форк NAnt)

NAnt расширения
NUnit расширения

Пример настройки и работы NUnit

image

Mono vs Windows

За все время работы с Mono, я увидел много багов. Например NUnit(как и Windows.Forms) не работают. Баг этот есть в версии 3.4. Как оказалось, баг исправлен (в 3.6) — только вот прикол, официально билдов для Windows нет. Для MacOS есть билд 3.6

Unhandled Exception:
System.TypeInitializationException: An exception was thrown by the type initializer for System.Windows.Forms.WindowsFormsSynchronizationContext ---> System.TypeInitializationException: An exception was thrown by the type initializer for System.Windows.Forms.ThemeEngine ---> System.TypeInitializationException: An exception was thrown by the type initializer for System.Windows.Forms.ThemeWin32Classic ---> System.TypeInitializationException: An exception was thrown by the type initializer for System.Drawing.KnownColors ---> System.TypeInitializationException: An exception was thrown by the type initializer for System.Drawing.GDIPlus ---> System.DllNotFoundException: /tmp/install/lib/libgdiplus.so

IKVM.NET — также сломан. Первое это неправильное расположения .exe файла в отношении к его либам. Второе — кто-то забыл добавить Preprocessor Variable MONO во время компиляции ikvmc.exe. Ужас :)

...

Описывать разные вещи можно долго. Я не только занимаюсь C# плагином(включая .NET). Сегодня, например, закрыл пока что Composite Formatting. Позднее улучшу, но нужна поддержка External Attributes

image

Есть тесты в сторону NodeJS(дебаг уже есть) и JavaScript(плагин также есть)

Автор: VISTALL

Источник

Поделиться

* - обязательные к заполнению поля