Skip to content

Conversation

joshuataylor
Copy link
Collaborator

See #3704
Here is the current roadmap for supporting 2025.2+:

  1. 2025.1 and 2025.2 requires a bit of work to get working again, due to deprecated functionality.
  2. If you want the plugin to "work", use 2024.x
  3. To not break compatibility with 2024.x, we'll work on a new branch until it's stable enough. A new feature branch has been created (feature/support-2025-2)
  4. An EAP release will be created that will allow auto updating via the Plugin Manager in intelliJ.
    1. Until then, we'll provide zips.
  5. To accommodate various "experimental functionality", registry keys will be made available, this is to work around settings bugs in IntelliJ.
  6. For everything else, this will be in settings.
  7. Support for IntelliJ will.come first, as the SDK is slightly less hacky than RubyMine etc.
  8. RubyMine and GoLand and similar IDEs are still priority, we'll sort one problem at a time

I believe this is the easiest approach, and let's users get going again.

Please report any bugs/weirdness, Ns please submit error reports - these REALLY help!

I'll update this post once the EAP releases have been uploaded.

@joshuataylor joshuataylor force-pushed the feature/support-2025-2 branch from adad16c to 6fbfa00 Compare August 31, 2025 13:05
@joshuataylor
Copy link
Collaborator Author

This adds initial support for 2025.2, upgrades to Kotlin 2.2, fixes the SDK adding issue for Erlang/Elixir, and a bunch of other issues.

Still much more writeActions to be converted..

intellij-elixir-22-EAP.zip

@Null-Sound
Copy link

Thank you! Some immediate feedback: I'm able to add my Elixir SDK back, which is great.
However, there are some issues I noticed:

  1. The color scheme for some definitions, such as defmodule, def, and defp, do not work even after invalidating caches and restarting.
  2. I attempted to test a Elixir Mix type run/debug config, and for some reason it kept insisting that I install Hex even though I already have it (my Erlang and Elixir are managed through asdf). When I went ahead and said yes, it seemed to be operating from my home directory(?!) and attempted to install Hex there... Same result when I set the working directory to my project.
  3. I still saw a WHOLE LOT of org.elixir_lang.beam.StubBuilder - No stub built for file FileContentImpl in the IntelliJ logs.

@joshuataylor
Copy link
Collaborator Author

@Lutrome Great feedback - thanks so much for testing!

Interesting re/ colour schemes, that seemed to work for me, will double check.

2/3 will hopefully be fixed with the deprecation changes (coming next). Will add these as bugs.

@Null-Sound
Copy link

Yeah, the coloring issue is a bit annoying (it still bolds and italicizes definitions), but definitely not a dealbreaker - grateful for all the work that's being put into this!
I have low vision so I usually use colors to distinguish between similar-looking objects which is why I brought it up.
I tried creating a new Phoenix project and a new Elixir project, but the coloring doesn't work regardless.

However, the functionality is mostly intact, which is good.

@Null-Sound
Copy link

Null-Sound commented Sep 4, 2025

One more piece of feedback - I installed the EAP ZIP on my work machine and it works fine on my work projects, except that the Run/Test configs don't work well, or even at all... When trying to run some of my unit tests on a Phoenix application, the test runner just stayed hanging on "Initializing tests" and "The database for [redacted].Repo has been dropped" then nothing else happened. I checked the logs afterwards but couldn't immediately find anything that stood out. Then again, there were a lot of log lines to trudge through.

Edited to add clarification: On the work machine, the Run/Test configs don't nag me about installing Hex, like it does on my personal machine. However, when I try a Run config (not a Test config) with a "Load this .env file" step pointing to an .env file in my project, it straight up does NOT load the .env file and gleefully runs anyways, causing my application to fail locally. I have to use the terminal instead for now.

@joshuataylor
Copy link
Collaborator Author

joshuataylor commented Sep 5, 2025

New update, that hopefully fixes some more writeActions.

If you see weirdness/glitches, or reporting an issue, I would love relevant lines from idea.log. (Help -> Show Log).

Thanks for all the reports so far! I've been testing, and it's looking better!!

Notes:

Adding SDK

When adding the Elixir SDK, sometimes the SDK isn't added unless you add the Erlang SDK, save and close settings, then open it again. This is due to EDT writeActions I believe, it sometimes works for me..

So the following workflow needs to be done:

  1. In "Project Settings"

    1. image
  2. After adding an Erlang SDK, the Erlang SDK has libraries:

    1. image-3
  3. Close settings, open again, add Elixir SDK, and you should see the Erlang libraries in the Elixir SDK:

    1. image-4

If not, the Erlang libraries won't be added to the Elixir SDK.

image-2

Colour Scheme

re/ Colouring, can I confirm if you're using the Classic UI plugin, and your colour schema etc.

I can see defmodule work for me:

image-5

In Settings | Editor | Color Scheme | Elixir:
image-6

Environment issues

Can I ask if you're using asdf/mise or similar? I always launch my IDE for the CLI for Elixir, due to environment weirdness.

Can you try again with this latest build, and

(Mise plugin for IDEA solves this for things like Python/Java/etc, would be amazing to get support for this as well).

intellij-elixir-eap2025-2.zip

@joshuataylor joshuataylor mentioned this pull request Sep 6, 2025
@Null-Sound
Copy link

Hi! Thanks for the updated plugin zip! I've installed it and tested changing colors - works perfectly fine for me! However, when I set it back to the default color, it turns white/colorless again. Technically, the macro functionality is working in that it's appropriately bolded and indented, just not the coloring.

I'm using the Catppuccin theme plugin, with the Catpuccin Macchiato theme loaded.
I also tried it with the default IntelliJ Dark theme.
Here are the relevant idea.log lines, first section is from when I changed the color to something silly, then the next section is from when I changed it back. Both sections mention my local .m2 (Maven) folder so I'm thinking something probably got screwed up over there when I tried committing my clean Phoenix project to my local Git repo.

2025-09-06 03:22:08,119 [ 389665]   WARN - #c.i.o.o.e.ConfigurableExtensionPointUtil - ignore configurable with duplicated id: instant.run
2025-09-06 03:22:08,120 [ 389666]   WARN - #c.i.o.o.e.ConfigurableExtensionPointUtil - ignore deprecated groupId: language for id: preferences.language.Kotlin.scripting
2025-09-06 03:22:08,120 [ 389666]   WARN - #c.i.o.o.e.ConfigurableExtensionPointUtil - ignore deprecated groupId: tools for id: kotlinNotebook.newNotebook
2025-09-06 03:22:08,124 [ 389670]   WARN - #c.i.o.o.e.ConfigurableExtensionPointUtil - ignore deprecated groupId: Errors for id: Credo
2025-09-06 03:22:08,124 [ 389670]   WARN - #c.i.o.o.e.ConfigurableExtensionPointUtil - ignore deprecated groupId: Errors for id: Dialyzer
2025-09-06 03:22:08,131 [ 389677]   WARN - #c.i.o.o.e.ConfigurableExtensionPointUtil - use other group instead of unexpected one: debugger
2025-09-06 03:22:15,145 [ 396691]   INFO - #c.i.s.c.SettingsSyncBridge - Couldn't obtain event lock. Will retry later
2025-09-06 03:22:31,200 [ 412746]   INFO - #c.i.s.c.SettingsSyncBridge - Couldn't obtain event lock. Will retry later
2025-09-06 03:22:35,180 [ 416726]   INFO - #c.i.w.i.i.j.s.JpsGlobalModelSynchronizerImpl - Saving global entities com.intellij.platform.workspace.jps.entities.SdkEntity to files
2025-09-06 03:22:35,183 [ 416729]   INFO - #c.i.w.i.i.j.s.JpsGlobalModelSynchronizerImpl - Saving global entities com.intellij.platform.workspace.jps.entities.LibraryEntity to files
2025-09-06 03:22:35,220 [ 416766]   INFO - #c.i.s.c.SettingsSyncBridge - Processing event IdeChange[colors/_@user_Dark.icls]
2025-09-06 03:22:35,229 [ 416775]   INFO - #c.i.s.c.GitSettingsLog - Applying settings changes to branch ide: colors/_@user_Dark.icls
2025-09-06 03:22:35,243 [ 416789]   INFO - #c.i.s.c.GitSettingsLog - Advancing master@4a1e02c9. Need merge of ide@fabc8f13 and cloud@4a1e02c9
2025-09-06 03:22:35,247 [ 416793]   INFO - #c.i.s.c.GitSettingsLog - Merge of master&ide@fabc8f13 with cloud@4a1e02c9: Merge of revisions fabc8f134ac1c4487901b67c4d8972ab22e16dc0, 4a1e02c9fac5c717e876fc4632d77f527f9c9f5c with base 4a1e02c9fac5c717e876fc4632d77f527f9c9f5c using strategy recursive resulted in: Already-up-to-date.
2025-09-06 03:22:35,345 [ 416891]   INFO - #c.i.a.o.PathMacrosImpl - Saved path macros: {MAVEN_REPOSITORY=/Users/nathan/.m2/repository}
2025-09-06 03:22:35,742 [ 417288]   INFO - #c.i.s.c.AbstractServerCommunicator - Pushing setting snapshot to the cloud config server...
2025-09-06 03:22:36,813 [ 418359]   INFO - #c.i.s.c.SettingsSyncBridge - Result of pushing settings to the cloud: SUCCESS
2025-09-06 03:22:36,816 [ 418362]   INFO - #c.i.s.c.GitSettingsLog - Updated position of cloud from 4a1e02c9 to fabc8f13: FORCED
2025-09-06 03:22:37,066 [ 418612]   INFO - #c.i.w.i.i.j.s.JpsGlobalModelSynchronizerImpl - Saving global entities com.intellij.platform.workspace.jps.entities.SdkEntity to files
2025-09-06 03:22:37,070 [ 418616]   INFO - #c.i.w.i.i.j.s.JpsGlobalModelSynchronizerImpl - Saving global entities com.intellij.platform.workspace.jps.entities.LibraryEntity to files


2025-09-06 03:23:03,112 [ 444658]   INFO - #c.i.s.c.SettingsSyncBridge - Couldn't obtain event lock. Will retry later
2025-09-06 03:23:04,502 [ 446048]   WARN - #c.i.o.o.e.ConfigurableExtensionPointUtil - ignore configurable with duplicated id: instant.run
2025-09-06 03:23:04,504 [ 446050]   WARN - #c.i.o.o.e.ConfigurableExtensionPointUtil - ignore deprecated groupId: language for id: preferences.language.Kotlin.scripting
2025-09-06 03:23:04,504 [ 446050]   WARN - #c.i.o.o.e.ConfigurableExtensionPointUtil - ignore deprecated groupId: tools for id: kotlinNotebook.newNotebook
2025-09-06 03:23:04,507 [ 446053]   WARN - #c.i.o.o.e.ConfigurableExtensionPointUtil - ignore deprecated groupId: Errors for id: Credo
2025-09-06 03:23:04,508 [ 446054]   WARN - #c.i.o.o.e.ConfigurableExtensionPointUtil - ignore deprecated groupId: Errors for id: Dialyzer
2025-09-06 03:23:04,513 [ 446059]   WARN - #c.i.o.o.e.ConfigurableExtensionPointUtil - use other group instead of unexpected one: debugger
2025-09-06 03:23:09,914 [ 451460]   INFO - #c.i.w.i.i.j.s.JpsGlobalModelSynchronizerImpl - Saving global entities com.intellij.platform.workspace.jps.entities.SdkEntity to files
2025-09-06 03:23:09,916 [ 451462]   INFO - #c.i.w.i.i.j.s.JpsGlobalModelSynchronizerImpl - Saving global entities com.intellij.platform.workspace.jps.entities.LibraryEntity to files
2025-09-06 03:23:10,084 [ 451630]   INFO - #c.i.a.o.PathMacrosImpl - Saved path macros: {MAVEN_REPOSITORY=/Users/nathan/.m2/repository}
2025-09-06 03:23:10,091 [ 451637]   INFO - #c.i.c.ComponentStoreImpl - Saving appFileTypeManager took 12 ms
2025-09-06 03:23:10,094 [ 451640]   INFO - #c.i.w.i.i.j.s.JpsGlobalModelSynchronizerImpl - Saving global entities com.intellij.platform.workspace.jps.entities.SdkEntity to files
2025-09-06 03:23:10,096 [ 451642]   INFO - #c.i.w.i.i.j.s.JpsGlobalModelSynchronizerImpl - Saving global entities com.intellij.platform.workspace.jps.entities.LibraryEntity to files
2025-09-06 03:23:10,137 [ 451683]   INFO - #c.i.s.c.SettingsSyncBridge - Processing event IdeChange[colors/_@user_Dark.icls]
2025-09-06 03:23:10,143 [ 451689]   INFO - #c.i.s.c.GitSettingsLog - Applying settings changes to branch ide: colors/_@user_Dark.icls
2025-09-06 03:23:10,155 [ 451701]   INFO - #c.i.s.c.GitSettingsLog - Advancing master@fabc8f13. Need merge of ide@f1f89c8f and cloud@fabc8f13
2025-09-06 03:23:10,159 [ 451705]   INFO - #c.i.s.c.GitSettingsLog - Merge of master&ide@f1f89c8f with cloud@fabc8f13: Merge of revisions f1f89c8f21aebfc9f18634f5f129ffecf2c8fe78, fabc8f134ac1c4487901b67c4d8972ab22e16dc0 with base fabc8f134ac1c4487901b67c4d8972ab22e16dc0 using strategy recursive resulted in: Already-up-to-date.
2025-09-06 03:23:10,954 [ 452500]   INFO - #c.i.s.c.AbstractServerCommunicator - Pushing setting snapshot to the cloud config server...
2025-09-06 03:23:13,353 [ 454899]   INFO - #c.i.s.c.SettingsSyncBridge - Result of pushing settings to the cloud: SUCCESS
2025-09-06 03:23:13,355 [ 454901]   INFO - #c.i.s.c.GitSettingsLog - Updated position of cloud from fabc8f13 to f1f89c8f: FORCED

Also, I'm using asdf to manage my language installs, including Elixir and Erlang. I can test mise - I've been curious about that as well.
Adding the Elixir SDK worked with the last plugin ZIP, so no worries there.

@joshuataylor
Copy link
Collaborator Author

joshuataylor commented Sep 6, 2025

I believe the colours have always been a bit finnicky, as I had dramas with getting them "just right" a few years ago, and just override everything.

Can I also confirm that you can see your Erlang ebin's in the Erlang/Elixir SDK setup?

Thanks so much for the testing! 👐

Edit: Also, I've submitted the EAP to JetBrains, right now it's manual for them to process the plugin, but we should have a "EAP" channel up soon that'll allow you to autoupdate to newer versions.

@Null-Sound
Copy link

Thanks! Yeah, I'm not too finicky about the coloring - funny enough, calling macros works fine, it's just defining them (such as defmodule) that doesn't color right.

And yes, I do see all the Erlang ebins in my Elixir SDK
image

@joshuataylor
Copy link
Collaborator Author

Perfect thanks, yep, seeing it as well. Overriding the actual colour works..

Also, it shows as the proper colour in the preview, which is odd. (Note I've made my bold only, not italics).

image

Could be a bug/issue/quirk with IntelliJ and how it has a "default value" but no actual value filled in, defaulting to the default colour:

image

Looking at a random example, SQL, this has a value when not overridden:

image

We should 100% raise/fix this, as when we start looking into LSP, we'll use the colour profiles a as a base.

@Null-Sound
Copy link

Null-Sound commented Sep 6, 2025

Now that I look closer, it seems that no definition macros (defmodule, def, defp, really any def*) are colored unless overridden even though they are properly bolded and italicized... :/

Edit: I'll probably try reinstalling my IDE at some point. But also, the Run/Test config still seems to run from my home directory which causes it to nag me about installing Hex.

@joshuataylor
Copy link
Collaborator Author

Figured it out..

Clicking defmodule..

  1. Inherits values from Calls->Function (Elixir) (No colour)
scr1
  1. Inherits values from Identifiers -> Function call (Language Defaults) (No colour)
scr2
  1. Inherits values from Inherits Identifiers -> Default (Language Defaults) (No colour)
scr3
  1. Inherits values from Text -> Default text (General) (Foreground: #A9B7C6)
sc4

So unsure why it's for example orange by default, files are here: https://github.com/joshuataylor/intellij-elixir/tree/main/resources/colorSchemes

https://github.com/joshuataylor/intellij-elixir/blob/main/src/org/elixir_lang/ElixirSyntaxHighlighter.kt

@Null-Sound
Copy link

Yeah, I just checked that directory and the file you pointed out, but looks like there are inconsistencies between ElixirDefault.xml and ElixirSyntaxHighlighter.kt.

For example, in the XML file, there is a foreground color (cc7832) for ELIXIR_KERNEL_MACRO but that same option doesn't exist in the syntax highlighter file, closest one I could find in there was MACRO_CALL or MACRO_DECLARATION but those two don't have appropriate foreground coloring entries in the XML file, causing them to fall back to the default white coloring.
Hope that makes sense, but now I'm starting to understand why the coloring scheme is so wonky - these files haven't been updated for quite a while - the XML files were last updated 4 years ago and the syntax highlighter was updated 4 years ago as well.

@joshuataylor
Copy link
Collaborator Author

Great spot - we're missing:
Looks like we're missing:

ELIXIR_INTERPOLATION
ELIXIR_KERNEL_MACRO
ELIXIR_PREDEFINED

@joshuataylor
Copy link
Collaborator Author

Good news - this was a fairly easy fix, I've rewritten the main module SDK stuff a bit, and the "small" IDEs now also work.

Small IDEs are PyCharm, Webstorm, RubyMine, PyCharm.

I've added a new action that allows you to fix a broken Elixir SDK, though honestly you should just readd it, an action to delete Elixir SDKs that works on both the IntelliJ and small IDEs.

This is because you can get your settings in a weird state that is confusing to recover from, and this should hopefully fix it.

Behind the more experimental side is a new status bar that shows if your SDK is configured (inspired from PyCharm), and I've added the elixir heredoc HTML injection work in as well. (This will be used in future with the LSP work ).

This is experimental features are controlled via the settings menu right now.

There is no real way to figure out if we are breaking EDT, as AFAIK this is only via UI test, that need junit5?

I'm also digging into the colours - this will be used for the LSP work, I'm sure, so it's worth it.

New EAP shortly. Thanks for the reports sorry far, and testing on additional OSs ♥️

@Null-Sound
Copy link

I found yet another problem - the Credo inspection doesn't work and hangs. Won't even complete cancelling.

In both cases, the logs have the exact same output:

2025-09-06 18:04:44,684 [ 211854]   WARN - #c.i.e.p.BaseOSProcessHandler - Process hasn't generated any output for a long time.
If it's a long-running mostly idle daemon process, consider overriding OSProcessHandler#readerOptions with 'BaseOutputReader.Options.forMostlySilentProcess()' to reduce CPU usage.
Command line: /Users/nathan/.asdf/installs/erlang/28.0.2/bin/erl -pa /Users/nathan/.asdf/installs/erlang/28.0.2/lib -pa /Users/nathan/.asdf/installs/elixir/1.18.4-otp-28/lib/logger/ebin -pa /Users/nathan/.asdf/installs/elixir/1.18.4-otp-28/lib/elixir/ebin -pa /Users/nathan/.asdf/installs/elixir/1.18.4-otp-28/lib/ex_unit/ebin -pa /Users/nathan/.asdf/installs/elixir/1.18.4-otp-28/lib/mix/ebin -pa /Users/nathan/.asdf/installs/elixir/1.18.4-otp-28/lib/eex/ebin -pa /Users/nathan/.asdf/installs/elixir/1.18.4-otp-28/lib/iex/ebin -pa /Users/nathan/.asdf/installs/erlang/28.0.2/lib/ftp-1.2.4/ebin -pa /Users/nathan/.asdf/installs/erlang/28.0.2/lib/parsetools-2.7/ebin -pa /Users/nathan/.asdf/installs/erlang/28.0.2/lib/eldap-1.2.16/ebin -pa /Users/nathan/.asdf/installs/erlang/28.0.2/lib/eunit-2.10/ebin -pa /Users/nathan/.asdf/installs/erlang/28.0.2/lib/runtime_tools-2.2/ebin -pa /Users/nathan/.asdf/installs/erlang/28.0.2/lib/dialyzer-5.4/ebin -pa /Users/nathan/.asdf/installs/erlang/28.0.2/lib/os_mon-2.11/eb ...

java.lang.Throwable: Process creation:
	at com.intellij.execution.process.BaseOSProcessHandler.<init>(BaseOSProcessHandler.java:32)
	at com.intellij.execution.process.OSProcessHandler.<init>(OSProcessHandler.java:45)
	at com.intellij.execution.process.CapturingProcessHandler.<init>(CapturingProcessHandler.java:21)
	at com.intellij.execution.util.ExecUtil.execAndGetOutput(ExecUtil.kt:81)
	at org.elixir_lang.credo.inspection_tool.Global$runInspection$processOutput$1.compute(Global.kt:100)
	at org.elixir_lang.credo.inspection_tool.Global$runInspection$processOutput$1.compute(Global.kt:78)
	at com.intellij.openapi.progress.Task$WithResult.run(Task.java:380)
	at com.intellij.openapi.progress.impl.CoreProgressManager.startTask(CoreProgressManager.java:498)
	at com.intellij.openapi.progress.impl.ProgressManagerImpl.startTask(ProgressManagerImpl.java:119)
	at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcessWithProgressSynchronously$10(CoreProgressManager.java:588)
	at com.intellij.openapi.progress.impl.ProgressRunner.lambda$new$0(ProgressRunner.java:88)
	at com.intellij.openapi.progress.impl.ProgressRunner.lambda$submit$4(ProgressRunner.java:252)
	at com.intellij.openapi.progress.ProgressManager.lambda$runProcess$0(ProgressManager.java:98)
	at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$1(CoreProgressManager.java:229)
	at com.intellij.platform.diagnostic.telemetry.helpers.TraceKt.use(trace.kt:44)
	at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:228)
	at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$executeProcessUnderProgress$14(CoreProgressManager.java:681)
	at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:756)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computeUnderProgress(CoreProgressManager.java:712)
	at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:680)
	at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:78)
	at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:209)
	at com.intellij.openapi.progress.ProgressManager.runProcess(ProgressManager.java:98)
	at com.intellij.openapi.progress.impl.ProgressRunner.lambda$submit$5(ProgressRunner.java:252)
	at com.intellij.openapi.progress.impl.ProgressRunner$ProgressRunnable.run(ProgressRunner.java:515)
	at com.intellij.openapi.progress.impl.ProgressRunner.lambda$launchTask$18(ProgressRunner.java:480)
	at com.intellij.util.concurrency.ChildContext$runInChildContext$1.invoke(propagation.kt:167)
	at com.intellij.util.concurrency.ChildContext$runInChildContext$1.invoke(propagation.kt:167)
	at com.intellij.util.concurrency.ChildContext.runInChildContext(propagation.kt:173)
	at com.intellij.util.concurrency.ChildContext.runInChildContext(propagation.kt:167)
	at com.intellij.openapi.progress.impl.ProgressRunner.lambda$launchTask$19(ProgressRunner.java:476)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
	at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:735)
	at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:732)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
	at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1.run(Executors.java:732)
	at java.base/java.lang.Thread.run(Thread.java:1583)

@joshuataylor
Copy link
Collaborator Author

joshuataylor commented Sep 7, 2025 via email

@Null-Sound
Copy link

Agreed. Would we be building around elixir-ls, or the new Expert language server?

@joshuataylor
Copy link
Collaborator Author

Honestly, JB has made some bold moves the last month:

  • Opensourcing LSP
  • Walking back their decision to make the language-specific IDEs free for non-commercial - RustRover was the big one.
  • Being more open.

I had kind of lost faith in JB, and I really don't want to tie the plugin into a specific LSP integration, but I've got more faith in the LSP4IJ project than JB right now, especially for getting any weird bugs fixed, and we're not the first.

I'm hoping we could create simple interfaces so we could change to the JB LSP.

Everything else would just be kinda like "Elixir helpers", e.g ~H syntax highlighting, nicer run configurations, tie in with asdf/mise/etc, debugger helpers (we shouldn't need to do much for this, hopefully).

@Null-Sound
Copy link

I just read JB's blog post re: the LSP API becoming available (implementation is still closed-source, unfortunately).

It's probably better if we start off building for LSP4IJ, and I think switching to JB's LSP later on if needed shouldn't be too difficult, especially since they both communicate via stdio.

@joshuataylor joshuataylor mentioned this pull request Sep 7, 2025
@joshuataylor
Copy link
Collaborator Author

Quick/dirty 22.0.0-eap2025-3 for testing "small IDEs" aka Custom IDEs - i've tested with PyCharm/WebStorm and friends.

intellij-elixir-eap2025-3.zip

To confirm how to add IDE without PyCharm etc having a fit:

  1. Add Erlang SDK to Internal Erlang SDKs
image

You should see the classpaths:
image

  1. Click Ok to save settings, so it closes.
  2. Reopen settings, add Elixir SDK, you should see Erlang SDK classpaths:
image
  1. Choose Elixir SDK
image image

@fictitiouswizard
Copy link

@joshuataylor I now see the class paths when selecting a elixir and erlang version

Screenshot 2025-09-07 131905 Screenshot 2025-09-07 131912

but when I created a brand new mix project, I was unable to select the elixir facet for the project. The apply button does not work and the ok button does not apply the changes for the project

Screenshot 2025-09-07 131857 Screenshot 2025-09-07 131841

@manweCZ
Copy link

manweCZ commented Sep 10, 2025

I can now see the Class Paths etc in my PHPStorm
image
image
image

but still when I type ie Enum. / Map. i still get no function hinting
phpstorm64_Ta3aBw3W1c

also, one weird thing is when I doubleshift and try
image

it says there are no active Elixir SDKs in the project.

I tried creating new mix project and setting it up, but the result is the same

@Null-Sound
Copy link

FYI @joshuataylor I installed Mise - curious to see how it compares with asdf. I'd be happy to do some mise testing with the intellij-elixir plugin sometime down the road! I still have asdf installed side-by-side, though.

@gaggle
Copy link

gaggle commented Sep 19, 2025

Just to add a datapoint:

I deleted SDKs and could not re-add them using the marketplace Elixir plugin (nothing would happen upon selecting an Erlang SDK directory path).

I then removed the Elixir plugin, restarted IDE, installed intellij-elixir-eap2025-3.zip, and I could immediately add SDKs. So, all good 👍. Just wanted to drop that note here. I've not yet used the plugin in anger but so far so good, at least.

IntelliJ IDEA 2025.2 (Ultimate Edition)
  org.elixir_lang (22.0.0-eap2025-3)

(also works after I've upgraded to IntelliJ IDEA 2025.2.1)

@joshuataylor
Copy link
Collaborator Author

intellij-elixir-eap2025-4-support-252.zip (2025.2 and below)
intellij-elixir-eap2025-5.zip (2025.3 and above)

--

The amount of time we've put into this, and now with 2025.3EAP breaking more things, honestly we've hit a point where I'm just pushing a boulder up a hill.

2025.3 EAP breaks further EDT, the project doesn't even open now (which I've fixed, for the sake of it).

This is because most of the plugin is coded in the "old way", which JetBrains is moving away from - 2025.2 was a shitshow of a release, with a lot of their own plugins breaking, and they have the gal to say we needed to be ready/test. 🤷.

EAP4 will be the last EAP (hopefully), then we will release v24.

The really painful part is there are changed APIs in 2025.3, making it incompatible with 2025.2 and below...

So, here are 2 versions, one for 2025.2.x, and one for 2025.3 (EAP). From now, 2025.3 (253.x) will be the only supported version, due to API changes.

2025.2 seems really broken now, so either use the previous EAP (EAP-4) or upgrade... sorry, but we can't maintain both without massiv effort.

I recommend using:

  • <= 2025.2 - EAP-4 - intellij-elixir-eap2025-3 (intellij-elixir-eap2025-4-support-252.zip will probably break things....)
  • = 2025.3 - EAP-5 - intellij-elixir-eap2025-5

Added to this release:

  1. Elixir SDK Refresh Actions
  2. Status bar with SDK status
  3. IntelliJ Lang injection for Hex, Regex.

Tentative Plan

  1. Start new plugin, tentatively named intellij-elixir-helper
  2. Current plugin is a losing battle to maintain.
  3. Bring over what we can, modernise.
  4. Based off LSP
  5. Hopefully will be a lot more maintainable
  6. Will use Elixir burrito for actual testing, so you shouldn't need to even install elixir versions to help develop.

@Null-Sound
Copy link

Yeah, I agree that this plugin should be scrapped - there's too much old code and it'd be a massive workload to rewrite, especially with only one person working on this. :/ I'd be glad to help out with the new LSP-based plugin!

@joshuataylor
Copy link
Collaborator Author

I'll keep you posted -- there is a lot the plugin will need that people don't normally consider, which we can extract for this plugin (e.g syntax highlighting, PSI, etc).

@gaggle
Copy link

gaggle commented Oct 1, 2025

I think this is a big and possibly difficult plan to propose, but it feels like a fundamentally healthy direction. I’m deeply appreciative of all the work that’s gone into this plugin (it's likely the reason I stuck with Elixir, since it let me keep using my preferred editor). At the same time, this pivot seems like the right way to tackle the technical challenges (and it’s clear JetBrains hasn’t made that part any easier).

Thanks for staying involved, Joshua. An LSP-based approach feels like the best way to bring this plugin into parity with other editors and lower the barrier for others to adopt our preferred IDE. With Expert coming soon, the timing looks good for the community to rally into LSPs.

I also hope a fresh start might make it easier for non-Java folks like me to contribute. Thanks again. What can I or others do to help move this forward?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants