PushDownProcessor marked Internal with no headless-viable replacement

Problem: This commit set all 6 classes in com.intellij.refactoring.memberPushDown to @ApiStatus.Internal.

My marketplace plugin (MixinMCP) used PushDownProcessor for headless push-down (for MCP-server refactor tools) and currently fails plugin verification, so I will most likely need to remove only this feature for 2026.2.

The seal looks less like an intentional decision about push-down and more like collateral from a module-scoped sweep:

  1. PullUpProcessor was not sealed. Pull-up and push-down are the same feature pair, and the only thing separating them is that memberPullUp lives in the Java plugin module, outside the swept platform/lang-impl.
  2. PushDownConflicts is still public and unannotated, so conflict analysis is still supported API. but the transformation it analyzes is not.
  3. JavaPushDownDelegate is public with public overrides but every method takes PushDownData, whose constructors are package-private, and the one apparently-public extension path is unreachable from outside the package.
  4. JavaRefactoringActionHandlerFactory.createPushDownHandler() unconditionally shows a modal PushDownDialog, with no headless path or result callback.

Request: Either restore public visibility of PushDownProcessor, or make PushDownData’s constructors public so JavaPushDownDelegate is usable as its signatures already imply.

Related: (but insufficient - this issue is specifically about not breaking existing API used for the behavior requested in these linked issues)

  • Provide an API for headless rename refactoring https://youtrack.jetbrains.com/issue/IJPL-201953
  • Support Running Refactoring Operations via Command Line / Headless Mode https://youtrack.jetbrains.com/issue/IJPL-222232
  • MCP Server: Provide on-demand headless JetBrains code intelligence daemon for agents https://youtrack.jetbrains.com/issue/IJPL-244212

Also see previous collateral, whose status from the same api-status-sweep was reverted within a few hours:

  1. GistAstMarker https://youtrack.jetbrains.com/issue/IJPL-248008
  2. BaseInjectedFileChangesHandler https://youtrack.jetbrains.com/issue/IJPL-248131

You’re right, there should be better ways to run refactorings in headless mode without necessity to inherit from platform classes. However, until this is done, I’ll remove @ApiStatus.Internal annotation from PushDownProcessor class (see IJPL-250730), sorry for the troubles.

When I was marking classes as internal, I didn’t do this for classes that are used from plugins, but for some reason the usage inside you plugin wasn’t found. We’ll investigate this.

Thanks for the quick response!

You didn’t miss anything when checking against plugins - I just recently added this particular refactor tool for 1.4, and saw that it fails on 2+ with no good way to reimplement it.

Removal of @ApiStatus.Internal will be included in IntelliJ IDEA 2026.2.1 bugfix update, it’s preview version should be published this week.