Consulo — IDE где Java и C# живут вместе
Здравствуйте. Прошло много времени после моих постов на хабре (тык, тык) на тему Consulo. Ниже я расскажу, что изменилось за это время.Для тех кто пропустил мои посты:
Consulo — это форк IntelliJ IDEA Community Edition, который имеет поддержку .NET (C# на текущий момент), Java, Javascript (NodeJS), и многое другое. Проект собрал множество открытых плагинов в себе. При этом код остался открытым.
Хотелось бы уточнить. Пока что Consulo не годится для работы в Production, все развивается очень медленно и силами одного человека (то есть меня).
Но посмотрите чего я добился.
Сравнения реализации Java & C# на простом примере (внимания две больших гифки) Java
C# (Mono)
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 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
Есть тесты в сторону NodeJS (дебаг уже есть) и JavaScript (плагин также есть)