I was finally able to build my plugin against 2026.1 EAP 3 now that it’s possible to create a plugin SDK against it from within the IDE, and I found a pretty significant set of unexpected breaking changes.
I’ve been able to get things to build, but that required me to disable several things that have worked just fine against years and years of previous versions, specifically things that don’t seem to have been denoted as deprecated, internal, etc. Here’s a list of specific things that are suddenly gone:
projectStructureValidator EP and associated classes
projectStructureDetector EP and associated classes
com.intellij.polySymbols.PolySymbolQualifiedName#getQualifiedKind() - There is a remaining method, getKind(), but I’m not sure it’s a direct replacement.
I checked for Known Breaking Changes, but that doesn’t seem to have any new content for the 2026.1 EAP. I’ve looked at the sources for the EPs/classes specified above, and none of them show any indication of removal/replacement.
Maybe I’m missing something obvious, but I was definitely surprised to see this level of removal version-to-version of things that didn’t seem to be on a deprecate-and-remove path.
Any insights that you can provide are greatly appreciated. If I should just log one or more issues in YouTrack, let me know and I’ll get them going.
If you use <depends>com.intellij.java</depends> there must be no changes required and everything should stay compatible, let me reproduce the issue with the fresh EAP
Please note experimental status of the entire com.intellij.polySymbols package. There could be no migration for some breaking changes there until it stabilizes.
Thanks for all the feedback, guys. That’s reassuring. My project is not Gradle-based for a number of reasons, not the least of which being the significant performance issues of Gradle-based projects on Windows and some incompatibilities on Windows/ARM64 which is my daily driver. That’s why I had to wait for EAP 3 to resolve the issue creating a plugin SDK.
It sounds like perhaps these classes moved around a bit and weren’t added as part of the core plugin SDK as they’d been in the past. That’s my oversight as I generally catch when things are moved into modules or plugins. I’ll find them in a bit once my morning appointments wrap up.
Regarding the polySymbols change, could someone responsible for that area please let me know the right migration path for getQualifiedKind? I ended using that API based on JetBrains’ recommendation to start for some JavaScript/TypeScript behavior that wasn’t possible elsewhere.
According to that commit, you may want to try to migrate and use kind: PolySymbolKind instead of qualifiedKind: PolySymbolQualifiedKind.
The other classes are from the intellij.java.ui module, so you would need to have a dependency on the java plugin anyway. If you use <depends>com.intellij.java</depends>, there should be no changes required, and everything should remain compatible. Otherwise, it would be necessary to add explicit dependencies to these modules.
Thanks again. I’ve made good progress and it looks like those IntelliJ IDEA-specific new project wizard things are fine now.
One thing that’s odd is that a few things that seem to be IDE-agnostic have been moved into Java-specific artifacts, or perhaps they were always there but it wasn’t obvious because of the Java packaging. I’m specifically talking about the following:
com.intellij.codeInsight.daemon.QuickFixBundle where I was using message key remove.suppression.action.family.
com.intellij.refactoring.HelpID where I was using constants for the various refactorings that I’ve implemented in my plugin.
Is that expected? Are there IDE-agnostic versions of those to be found anywhere? I can obviously add my own, but it was nice to be able to use the IDE’s where available.
Please avoid reusing message keys if possible, we do not really treat them as API and do not track breaking changes there automatically, such as removal of keys
Yes, that was the question…whether there were IDE-agnostic versions of those same message keys/constants since something like “Remove suppression” seems to apply equally for any language that supports redundant suppression detection and removal (my plugin does for its supported language). However, @yuriy.artamonov‘s comment about not treating message keys as API effectively answers that question. No issues. I’m definitely knocking almost all of these remaining issues out now. Thanks again!