Pull to refresh

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

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

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




Хотелось бы уточнить. Пока что 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 код (без инструкций, пока для меня это не приоритет):



Configuration Profiles

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



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

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



Debugger

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

NUnit

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

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

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


Mono vs Windows

За все время работы с Mono я увидел много багов. Например, NUnit (как и Windows.Forms) не работают. Баг этот есть в версии 3.2. Как оказалось, баг исправлен (в 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 (плагин также есть).
Tags:
Hubs:
+121
Comments 50
Comments Comments 50

Articles