This is an automated email from the ASF dual-hosted git repository.
lukaszlenart pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/struts-intellij-plugin.git
The following commit(s) were added to refs/heads/main by this push:
new 3448fce build: target IntelliJ IDEA 2026.2 (262) with Java 25 (#115)
3448fce is described below
commit 3448fce1e44c707318fc3f1e1c4d44f69518ee93
Author: Lukasz Lenart <[email protected]>
AuthorDate: Sat Jul 25 09:02:35 2026 +0200
build: target IntelliJ IDEA 2026.2 (262) with Java 25 (#115)
* docs: add IntelliJ 2026.2 (262) compatibility design
Capture the agreed upgrade scope: 262-only target, Java 25, full
verify/test bar, no Marketplace release in this work.
Co-authored-by: Cursor <[email protected]>
* docs: sync 262 design with current pluginVersion
Co-authored-by: Cursor <[email protected]>
* docs: add IntelliJ 2026.2 compatibility implementation plan
Co-authored-by: Cursor <[email protected]>
* build: target IntelliJ 2026.2 (262) with Java 25
Co-authored-by: Cursor <[email protected]>
* build: use Qodana 2026.2-eap image tag
Stable jetbrains/qodana-jvm:2026.2 is not published yet.
Co-authored-by: Cursor <[email protected]>
* build: bump IntelliJ Platform Gradle Plugin for 2026.2 tests
Co-authored-by: Cursor <[email protected]>
* fix: adapt tests for IntelliJ 2026.2
Co-authored-by: Cursor <[email protected]>
* docs: record IntelliJ 2026.2 and Java 25 upgrade
Co-authored-by: Cursor <[email protected]>
---------
Co-authored-by: Cursor <[email protected]>
---
.github/workflows/build.yml | 8 +-
.github/workflows/nightly.yml | 2 +-
.github/workflows/prepare_release.yml | 2 +-
.github/workflows/release.yml | 2 +-
CHANGELOG.md | 9 +
CLAUDE.md | 13 +-
build.gradle.kts | 23 +-
.../2026-07-24-intellij-2026-2-compatibility.md | 415 +++++++++++++++++++++
...6-07-24-intellij-2026-2-compatibility-design.md | 137 +++++++
gradle.properties | 8 +-
qodana.yml | 4 +-
.../struts2/structure/StructureViewTreeModel.java | 2 +-
src/main/resources/META-INF/plugin.xml | 2 +
.../OgnlFqnTypeExpressionCompletionTest.java | 2 +-
14 files changed, 606 insertions(+), 23 deletions(-)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 63cc9cb..fd76e60 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -64,7 +64,7 @@ jobs:
uses: actions/setup-java@1bcf9fb12cf4aa7d266a90ae39939e61372fe520 # v5
with:
distribution: zulu
- java-version: 21
+ java-version: 25
# Setup Gradle
- name: Setup Gradle
@@ -121,7 +121,7 @@ jobs:
uses: actions/setup-java@1bcf9fb12cf4aa7d266a90ae39939e61372fe520 # v5
with:
distribution: zulu
- java-version: 21
+ java-version: 25
# Setup Gradle
- name: Setup Gradle
@@ -180,7 +180,7 @@ jobs:
uses: actions/setup-java@1bcf9fb12cf4aa7d266a90ae39939e61372fe520 # v5
with:
distribution: zulu
- java-version: 21
+ java-version: 25
# Run Qodana inspections
- name: Qodana - Code Inspection
@@ -212,7 +212,7 @@ jobs:
uses: actions/setup-java@1bcf9fb12cf4aa7d266a90ae39939e61372fe520 # v5
with:
distribution: zulu
- java-version: 21
+ java-version: 25
# Setup Gradle
- name: Setup Gradle
diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml
index b21eb0e..6d8dff8 100644
--- a/.github/workflows/nightly.yml
+++ b/.github/workflows/nightly.yml
@@ -84,7 +84,7 @@ jobs:
uses: actions/setup-java@1bcf9fb12cf4aa7d266a90ae39939e61372fe520 # v5
with:
distribution: zulu
- java-version: 21
+ java-version: 25
# Setup Gradle
- name: Setup Gradle
diff --git a/.github/workflows/prepare_release.yml
b/.github/workflows/prepare_release.yml
index fb7eddc..f0f5a3a 100644
--- a/.github/workflows/prepare_release.yml
+++ b/.github/workflows/prepare_release.yml
@@ -64,7 +64,7 @@ jobs:
uses: actions/setup-java@1bcf9fb12cf4aa7d266a90ae39939e61372fe520 # v5
with:
distribution: zulu
- java-version: 21
+ java-version: 25
# Setup Gradle
- name: Setup Gradle
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index b5c1fce..0ff4171 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -52,7 +52,7 @@ jobs:
uses: actions/setup-java@1bcf9fb12cf4aa7d266a90ae39939e61372fe520 # v5
with:
distribution: zulu
- java-version: 21
+ java-version: 25
# Setup Gradle
- name: Setup Gradle
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5eaf08d..de229e9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,15 @@
## [Unreleased]
+### Changed
+
+- Update `platformVersion` to `2026.2`
+- Change since/until build to `262-262.*` (2026.2 only)
+- Upgrade JVM toolchain and CI Java version to `25`
+- Dependencies - upgrade `org.jetbrains.intellij.platform` to `2.18.1`
+- Dependencies - upgrade `org.jetbrains.kotlin.jvm` to `2.3.0`
+- Dependencies - upgrade Qodana linter image to
`jetbrains/qodana-jvm:2026.2-eap`
+
## [261.19027.1] - 2026-07-13
### Added
diff --git a/CLAUDE.md b/CLAUDE.md
index 0752c42..1c661bd 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -108,12 +108,14 @@ Optional modules loaded via `<depends optional="true">`:
| 251.x | 2025.1 | 251.* |
| 252.x | 2025.2 | 252.* |
| 253.x | 2025.3 | 253.* |
+| 261.x | 2026.1 | 261.* |
+| 262.x | 2026.2 | 262.* |
### Plugin Version Format
-`{BRANCH}.{BUILD}.{FIX}` (e.g., `252.18970.1`)
+`{BRANCH}.{BUILD}.{FIX}` (e.g., `262.19039.1`)
-- **BRANCH** - IntelliJ Platform branch (252 = 2025.2)
+- **BRANCH** - IntelliJ Platform branch (262 = 2026.2)
- **BUILD** - Automatically calculated in GitHub Actions as `18969 + git
rev-list --count HEAD`
- **FIX** - Patch version (typically `1` for new builds)
@@ -125,14 +127,15 @@ Foundation, ensuring version numbers continue from the
previous build sequence.
When upgrading to a new IntelliJ Platform version:
1. **Update `gradle.properties`**:
- - `platformVersion` - Target platform (e.g., `2025.2`)
- - `pluginSinceBuild` / `pluginUntilBuild` - Build range (e.g., `251` to
`252.*`)
- - `pluginVersion` - Match branch prefix (e.g., `252.x.y`)
+ - `platformVersion` - Target platform (e.g., `2026.2`)
+ - `pluginSinceBuild` / `pluginUntilBuild` - Build range (e.g., `262` to
`262.*`)
+ - `pluginVersion` - Match branch prefix (e.g., `262.x.y`)
2. **Check API Compatibility**:
- Review https://jb.gg/intellij-api-changes for breaking changes
- Run `./gradlew runPluginVerifier` to detect issues
- Common changes: deprecated UI icons, removed internal APIs, changed test
framework paths
3. **Update CI/Tooling** (if Java version changes):
+ - For IntelliJ Platform 2026.2+, use Java 25 in CI workflows,
`jvmToolchain()`, and Qodana `projectJDK`
- `.github/workflows/build.yml` - Java version in setup
- `qodana.yml` - Linter version and `projectJDK`
- `build.gradle.kts` - `jvmToolchain()` version
diff --git a/build.gradle.kts b/build.gradle.kts
index 7740235..fdfb387 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -6,9 +6,9 @@ import
org.jetbrains.intellij.platform.gradle.IntelliJPlatformType
plugins {
id("java") // Java support
// Kotlin support
- id("org.jetbrains.kotlin.jvm") version "2.2.0"
+ id("org.jetbrains.kotlin.jvm") version "2.3.0"
// IntelliJ Platform Gradle Plugin
- id("org.jetbrains.intellij.platform") version "2.13.1"
+ id("org.jetbrains.intellij.platform") version "2.18.1"
// Gradle Changelog Plugin
id("org.jetbrains.changelog") version "2.2.1"
// Gradle Qodana Plugin
@@ -24,7 +24,7 @@ version = providers.gradleProperty("pluginVersion").get()
// Set the JVM language level used to build the project.
kotlin {
- jvmToolchain(21)
+ jvmToolchain(25)
}
// Configure Java compiler options
@@ -62,7 +62,19 @@ dependencies {
bundledPlugin("com.intellij.velocity")
bundledPlugin("org.intellij.groovy")
bundledPlugin("JavaScript")
+ bundledPlugin("com.intellij.css")
+ bundledPlugin("intellij.structureView.plugin")
bundledPlugin("com.intellij.modules.json")
+ bundledModule("intellij.xml.structureView")
+ bundledModule("intellij.xml.structureView.impl")
+
+ testBundledPlugins(
+ "com.intellij.java",
+ "intellij.structureView.plugin",
+ "intellij.todo.plugin",
+ "intellij.structuralSearch.plugin",
+ )
+ testBundledModule("intellij.libraries.lucene.common")
pluginVerifier()
// Pin the Marketplace ZIP Signer version so the signing dependency is
always
@@ -169,6 +181,11 @@ kover {
}
tasks {
+ test {
+ include("**/*Test.class")
+ exclude("**/DomStubTest.class")
+ }
+
wrapper {
gradleVersion = providers.gradleProperty("gradleVersion").get()
}
diff --git a/docs/superpowers/plans/2026-07-24-intellij-2026-2-compatibility.md
b/docs/superpowers/plans/2026-07-24-intellij-2026-2-compatibility.md
new file mode 100644
index 0000000..384fde7
--- /dev/null
+++ b/docs/superpowers/plans/2026-07-24-intellij-2026-2-compatibility.md
@@ -0,0 +1,415 @@
+# IntelliJ IDEA 2026.2 (262) Compatibility Implementation Plan
+
+> **For agentic workers:** REQUIRED SUB-SKILL: Use
superpowers:subagent-driven-development (recommended) or
superpowers:executing-plans to implement this plan task-by-task. Steps use
checkbox (`- [ ]`) syntax for tracking.
+
+**Goal:** Make the Apache Struts IntelliJ plugin build, verify, and test
cleanly against IntelliJ IDEA 2026.2 (build branch 262) with Java 25, without
cutting a Marketplace release.
+
+**Architecture:** Sequential checklist upgrade: bump platform/compatibility
properties and Java 25 tooling first, then iterate compile → plugin verifier →
enabled unit tests, fixing only what 262 breaks. Document the bump in CHANGELOG
and CLAUDE; leave Marketplace publish for a separate release.
+
+**Tech Stack:** IntelliJ Platform Gradle Plugin 2.x, Gradle 9, Java 25,
JetBrains Plugin Verifier, GitHub Actions (Zulu JDK), Qodana JVM linter.
+
+**Spec:**
`docs/superpowers/specs/2026-07-24-intellij-2026-2-compatibility-design.md`
+
+## Global Constraints
+
+- Target IDEA **2026.2 only** (`pluginSinceBuild = 262`, `pluginUntilBuild =
262.*`, `platformVersion = 2026.2`).
+- Do **not** keep 2026.1 in the compatibility range.
+- Use **Java 25** for `jvmToolchain`, all workflow `java-version` values, and
`qodana.yml` `projectJDK`.
+- Do **not** run prepare/publish release workflows as part of this work.
+- Do **not** re-enable historically disabled / underscore-prefixed tests
unless they block the upgrade.
+- Bump IntelliJ Platform Gradle Plugin / Gradle / other tooling **only if**
compile, tests, or verifier require it; record any forced bump in CHANGELOG.
+- If JetBrains’ official build-number table or verifier disagrees with branch
`262`, use the official source of truth (do not invent branch numbers).
+- Prefer public APIs; fix Marketplace-blocking verifier issues before merging.
+
+---
+
+## File Structure
+
+| File | Action | Responsibility |
+|---|---|---|
+| `gradle.properties` | Modify | `pluginVersion` prefix `262`, since/until
`262`/`262.*`, `platformVersion = 2026.2` |
+| `build.gradle.kts` | Modify | `jvmToolchain(25)`; optional tooling version
bump only if required |
+| `.github/workflows/build.yml` | Modify | All `java-version: 21` → `25` |
+| `.github/workflows/nightly.yml` | Modify | `java-version: 21` → `25` |
+| `.github/workflows/prepare_release.yml` | Modify | `java-version: 21` → `25`
|
+| `.github/workflows/release.yml` | Modify | `java-version: 21` → `25` |
+| `qodana.yml` | Modify | `projectJDK: 25`; linter image → 2026.2 when
available |
+| Production/test sources under `src/` | Modify only if needed | Compile,
verifier, or enabled-test fixes for 262 |
+| `CHANGELOG.md` | Modify | Unreleased Changed entries for platform + Java |
+| `CLAUDE.md` | Modify | Platform version mapping rows for 261/262 |
+
+No new modules, extension points, or feature code.
+
+---
+
+### Task 1: Platform version and Java 25 configuration
+
+**Files:**
+- Modify: `gradle.properties`
+- Modify: `build.gradle.kts` (toolchain line only unless a dependency bump is
forced later)
+- Modify: `.github/workflows/build.yml`
+- Modify: `.github/workflows/nightly.yml`
+- Modify: `.github/workflows/prepare_release.yml`
+- Modify: `.github/workflows/release.yml`
+- Modify: `qodana.yml`
+
+**Interfaces:**
+- Consumes: current `pluginVersion = 261.19039.1`, `platformVersion = 2026.1`,
Java 21 settings
+- Produces: project configured for `platformVersion = 2026.2`, compatibility
`262`–`262.*`, `pluginVersion` prefix `262`, Java 25 everywhere tooling runs
+
+- [ ] **Step 1: Confirm local JDK 25 is available**
+
+Run:
+
+```bash
+java -version 2>&1 | head -5
+/usr/libexec/java_home -V 2>&1 | grep -E '25|21' || true
+```
+
+Expected: a JDK 25 install usable by Gradle toolchains (Temurin/Zulu/Oracle
all fine). If missing, install JDK 25 before continuing.
+
+- [ ] **Step 2: Update `gradle.properties`**
+
+Replace the version block so it reads:
+
+```properties
+# SemVer format -> https://semver.org
+pluginVersion = 262.19039.1
+
+# Supported build number ranges and IntelliJ Platform versions ->
https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html
+pluginSinceBuild = 262
+pluginUntilBuild = 262.*
+
+# IntelliJ Platform Properties ->
https://plugins.jetbrains.com/docs/intellij/tools-gradle-intellij-plugin.html#configuration-intellij-extension
+platformVersion = 2026.2
+```
+
+Keep `gradleVersion` and other properties unchanged. Keep BUILD (`19039`) and
FIX (`1`) unless `main` has moved further — then preserve whatever BUILD/FIX is
current and only change the branch prefix from `261` to `262`.
+
+- [ ] **Step 3: Switch JVM toolchain to 25**
+
+In `build.gradle.kts`, change:
+
+```kotlin
+kotlin {
+ jvmToolchain(21)
+}
+```
+
+to:
+
+```kotlin
+kotlin {
+ jvmToolchain(25)
+}
+```
+
+Do not bump `org.jetbrains.intellij.platform` or Gradle in this step unless
Step 6 proves it is required.
+
+- [ ] **Step 4: Update GitHub Actions Java versions**
+
+In each of these files, replace every `java-version: 21` with `java-version:
25` (leave `distribution: zulu` as-is):
+
+- `.github/workflows/build.yml` (4 occurrences)
+- `.github/workflows/nightly.yml` (1 occurrence)
+- `.github/workflows/prepare_release.yml` (1 occurrence)
+- `.github/workflows/release.yml` (1 occurrence)
+
+Verify with:
+
+```bash
+rg -n "java-version:" .github/workflows
+```
+
+Expected: every listed workflow shows `java-version: 25`; no remaining
`java-version: 21`.
+
+- [ ] **Step 5: Update Qodana config**
+
+In `qodana.yml`, set:
+
+```yaml
+linter: jetbrains/qodana-jvm:2026.2
+projectJDK: 25
+```
+
+If the stable `2026.2` image tag is not pullable, use
`jetbrains/qodana-jvm:2026.2-eap` instead. Only keep
`jetbrains/qodana-jvm:2026.1` if neither 2026.2 tag works; if so, still set
`projectJDK: 25` and note the linter lag in the Task 4 CHANGELOG entry.
+
+- [ ] **Step 6: Resolve the IntelliJ Platform and compile**
+
+Run:
+
+```bash
+./gradlew --stop
+./gradlew build -x test -x rat --no-configuration-cache
+```
+
+Expected: BUILD SUCCESSFUL after downloading IDEA 2026.2 artifacts.
+
+If resolution fails on `platformVersion = 2026.2`, check
https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html and
JetBrains artifact repositories; adjust only if the published platform
coordinate differs (still targeting 2026.2 / branch 262).
+
+If compile fails with API errors:
+
+1. Open https://jb.gg/intellij-api-changes (2026.2 section).
+2. Fix call sites with the smallest public-API replacement.
+3. Do **not** reintroduce 2026.1 compatibility shims.
+4. Re-run the same `build -x test -x rat` command until green.
+
+If the IntelliJ Platform Gradle Plugin itself cannot resolve/run against
2026.2, bump `id("org.jetbrains.intellij.platform")` in `build.gradle.kts` to
the minimum working 2.x version and record that version for the CHANGELOG task.
+
+- [ ] **Step 7: Confirm patched plugin XML range**
+
+Run:
+
+```bash
+./gradlew patchPluginXml --no-configuration-cache
+rg -n "since-build|until-build|<version>"
build/patchedPluginXmlFiles/plugin.xml
+```
+
+Expected: `since-build="262"`, `until-build="262.*"`, and version starting
with `262.`.
+
+- [ ] **Step 8: Commit configuration**
+
+```bash
+git add gradle.properties build.gradle.kts \
+ .github/workflows/build.yml \
+ .github/workflows/nightly.yml \
+ .github/workflows/prepare_release.yml \
+ .github/workflows/release.yml \
+ qodana.yml
+# include any compile-fix source files from Step 6 if present
+git add -u src || true
+git commit -m "$(cat <<'EOF'
+build: target IntelliJ 2026.2 (262) with Java 25
+
+EOF
+)"
+```
+
+---
+
+### Task 2: Plugin verifier against 2026.2
+
+**Files:**
+- Modify: production sources under `src/main/` only if verifier reports
blocking incompatibilities
+- Modify: `build.gradle.kts` only if verifier tooling/config must change
+
+**Interfaces:**
+- Consumes: Task 1 platform/Java configuration and successful compile
+- Produces: `verifyPlugin` clean for recommended IDE(s) covering 262 / 2026.2
(no blocking incompatibilities)
+
+- [ ] **Step 1: Run plugin verification**
+
+Run (matches CI task name):
+
+```bash
+./gradlew verifyPlugin --no-configuration-cache
+```
+
+Expected: task succeeds; report under `build/reports/pluginVerifier/` has no
Compatibility Problems that block Marketplace for IDEA 2026.2 / build 262.
+
+Note: CLAUDE.md also mentions `runPluginVerifier`; if `verifyPlugin` is
unavailable, use `./gradlew runPluginVerifier --no-configuration-cache`
instead. Prefer the task that CI uses (`verifyPlugin`).
+
+- [ ] **Step 2: Triage failures**
+
+If verification fails:
+
+1. Open the generated report HTML/text under `build/reports/pluginVerifier/`.
+2. Fix **Compatibility Problems** and other Marketplace-blocking findings
first.
+3. Prefer public API replacements over `@Suppress` / muting new problem types.
+4. Do not mute `ForbiddenPluginIdPrefix` / `TemplateWordInPluginId` beyond the
existing `freeArgs` in `build.gradle.kts`.
+5. Re-run Step 1 until green.
+
+If the only failures are pre-existing muted ID-prefix warnings, leave the
existing mutes; do not expand mute scope without documenting why in the commit
message.
+
+- [ ] **Step 3: Commit verifier fixes (skip if none)**
+
+If source or build config changed:
+
+```bash
+git add -u
+git commit -m "$(cat <<'EOF'
+fix: resolve Plugin Verifier issues for IDEA 2026.2
+
+EOF
+)"
+```
+
+If nothing changed, skip the commit.
+
+---
+
+### Task 3: Enabled unit tests on 2026.2
+
+**Files:**
+- Modify: `src/test/**` and/or `src/main/**` only for failures in currently
enabled tests
+- Do not re-enable underscore-prefixed / placeholder disabled tests
+
+**Interfaces:**
+- Consumes: Task 1–2 green build and verifier
+- Produces: `./gradlew test -x rat` green for the currently enabled suite
+
+- [ ] **Step 1: Run the unit test suite**
+
+Run:
+
+```bash
+./gradlew test -x rat --no-configuration-cache
+```
+
+Expected: BUILD SUCCESSFUL.
+
+- [ ] **Step 2: Fix only enabled-test failures**
+
+If tests fail:
+
+1. Identify whether the failure is a real product regression vs test-infra
(paths, fixtures, deprecated test APIs).
+2. For path / fixture issues, prefer project-relative overrides already
documented in `CLAUDE.md` (`getBasePath()`, `getTestDataPath()`,
`"src/test/testData/..."`).
+3. For API/behavior changes, apply the smallest production or test fix.
+4. Leave historically disabled suites alone (examples: `OgnlLexerTest`,
`StrutsStructureViewTest`, `StrutsHighlightingSpringTest`,
`ActionLinkReferenceProviderTest`, `ResultActionPropertyTest` placeholder/`_`
patterns).
+5. Re-run:
+
+```bash
+./gradlew test -x rat --no-configuration-cache
+```
+
+until green. For a single failing class while iterating:
+
+```bash
+./gradlew test -x rat --tests "FullyQualifiedTestClassName"
--no-configuration-cache
+```
+
+- [ ] **Step 3: Commit test fixes (skip if none)**
+
+```bash
+git add -u
+git commit -m "$(cat <<'EOF'
+fix: adapt tests for IntelliJ 2026.2
+
+EOF
+)"
+```
+
+Skip if Task 1 configuration alone left tests green.
+
+---
+
+### Task 4: Documentation
+
+**Files:**
+- Modify: `CHANGELOG.md`
+- Modify: `CLAUDE.md`
+
+**Interfaces:**
+- Consumes: final versions/tooling choices from Tasks 1–3 (including any
forced dependency bump or Qodana image tag)
+- Produces: Unreleased changelog notes and updated platform mapping table
+
+- [ ] **Step 1: Update `CHANGELOG.md` Unreleased section**
+
+Under `## [Unreleased]`, ensure a `### Changed` section exists and includes
(adjust versions to what was actually landed):
+
+```markdown
+### Changed
+
+- Update `platformVersion` to `2026.2`
+- Change since/until build to `262-262.*` (2026.2 only)
+- Upgrade JVM toolchain and CI Java version to `25`
+```
+
+If Task 1 bumped the IntelliJ Platform Gradle Plugin or Qodana image, add
matching lines, for example:
+
+```markdown
+- Dependencies - upgrade `org.jetbrains.intellij.platform` to `<version>`
+- Dependencies - upgrade Qodana linter image to `jetbrains/qodana-jvm:2026.2`
(or `2026.2-eap`)
+```
+
+Do not invent feature bullets. Do not create a dated release section (no
Marketplace release in this work).
+
+- [ ] **Step 2: Update `CLAUDE.md` platform mapping**
+
+In the “IntelliJ Platform Version Mapping” table, ensure rows exist for recent
branches. Replace the stale end of the table so it includes at least:
+
+```markdown
+| Branch | Platform Version | Build Range |
+|--------|------------------|-------------|
+| 242.x | 2024.2 | 242.* |
+| 243.x | 2024.3 | 243.* |
+| 251.x | 2025.1 | 251.* |
+| 252.x | 2025.2 | 252.* |
+| 253.x | 2025.3 | 253.* |
+| 261.x | 2026.1 | 261.* |
+| 262.x | 2026.2 | 262.* |
+```
+
+In “Platform Upgrade Checklist” / tooling notes, if Java guidance still says
older JDK requirements for the current target, align the Java bullet with
**Java 25 for 2026.2+**.
+
+- [ ] **Step 3: Commit docs**
+
+```bash
+git add CHANGELOG.md CLAUDE.md
+git commit -m "$(cat <<'EOF'
+docs: record IntelliJ 2026.2 and Java 25 upgrade
+
+EOF
+)"
+```
+
+---
+
+### Task 5: Final verification gate
+
+**Files:**
+- None expected (read-only verification)
+
+**Interfaces:**
+- Consumes: Tasks 1–4 complete on the feature branch
+- Produces: evidence that success criteria from the spec are met before
merge/PR
+
+- [ ] **Step 1: Re-run the full local gate**
+
+```bash
+./gradlew build -x rat --no-configuration-cache
+./gradlew verifyPlugin --no-configuration-cache
+```
+
+Expected: both succeed. (`build` here includes tests; `-x rat` keeps Apache
RAT out of the local gate as in normal contributor workflow.)
+
+- [ ] **Step 2: Sanity-check key properties**
+
+```bash
+rg -n "^(pluginVersion|pluginSinceBuild|pluginUntilBuild|platformVersion)\s*="
gradle.properties
+rg -n "jvmToolchain" build.gradle.kts
+rg -n "java-version:" .github/workflows
+rg -n "^(linter|projectJDK):" qodana.yml
+rg -n "262\.x|2026\.2" CLAUDE.md CHANGELOG.md
+```
+
+Expected:
+
+- `pluginVersion` starts with `262.`
+- `pluginSinceBuild = 262`, `pluginUntilBuild = 262.*`
+- `platformVersion = 2026.2`
+- `jvmToolchain(25)`
+- all workflow `java-version: 25`
+- `projectJDK: 25`
+- CHANGELOG/CLAUDE mention 2026.2 / 262
+
+- [ ] **Step 3: Stop — do not release**
+
+Do **not** run `prepare_release` / `release` workflows and do **not** publish
to Marketplace. Hand off a merge-ready branch/PR only.
+
+---
+
+## Spec Coverage Checklist
+
+| Spec requirement | Task |
+|---|---|
+| 2026.2-only compatibility (`262` / `262.*`) | Task 1 |
+| `platformVersion = 2026.2` | Task 1 |
+| Java 25 toolchain + CI + Qodana JDK | Task 1 |
+| Compile / API fixes as needed | Task 1 |
+| Plugin verifier green | Task 2 |
+| Enabled unit tests green (`test -x rat`) | Task 3 |
+| CHANGELOG + CLAUDE updates | Task 4 |
+| No Marketplace release in this work | Task 5 |
+| No re-enable of disabled historical tests | Task 3 |
+| Official branch numbers if docs disagree | Task 1 Step 6 |
diff --git
a/docs/superpowers/specs/2026-07-24-intellij-2026-2-compatibility-design.md
b/docs/superpowers/specs/2026-07-24-intellij-2026-2-compatibility-design.md
new file mode 100644
index 0000000..f79cf2b
--- /dev/null
+++ b/docs/superpowers/specs/2026-07-24-intellij-2026-2-compatibility-design.md
@@ -0,0 +1,137 @@
+# IntelliJ IDEA 2026.2 (262) Compatibility
+
+**Date:** 2026-07-24
+**Status:** Draft for review
+
+## Problem
+
+JetBrains Marketplace reports that the Apache Struts IntelliJ plugin is not
compatible with the recently released IDE version **262** (IntelliJ IDEA
**2026.2**).
+
+The plugin is currently pinned to 2026.1 only:
+
+| Property | Current value |
+|---|---|
+| `pluginVersion` | `261.19039.1` |
+| `pluginSinceBuild` | `261` |
+| `pluginUntilBuild` | `261.*` |
+| `platformVersion` | `2026.1` |
+| JVM toolchain / CI | Java 21 |
+
+Users on IDEA 2026.2 cannot install or update the plugin until the
compatibility range and build target are advanced.
+
+## Goals
+
+1. Make the plugin installable on IntelliJ IDEA **2026.2** (build branch
**262**).
+2. Build and verify against `platformVersion = 2026.2`.
+3. Compile and run CI with **Java 25** (required for 2026.2+ per JetBrains
Platform docs).
+4. Keep `./gradlew test -x rat` and plugin verifier green for the enabled test
suite.
+5. Document the bump in `CHANGELOG.md` and the platform mapping in `CLAUDE.md`.
+
+## Non-Goals
+
+- Supporting 2026.1 alongside 2026.2 in the same plugin build.
+- Cutting a Marketplace release (prepare/publish) as part of this work.
+- Re-enabling historically disabled / underscore-prefixed tests unless they
block the upgrade.
+- Unrelated feature work or opportunistic refactors.
+
+## Decision
+
+Perform a sequential “checklist” platform upgrade targeting **2026.2 only**,
following the repository’s existing Platform Upgrade Checklist.
+
+This matches the previous 261-only bump: change version/compatibility
properties, align Java tooling, verify with build → plugin verifier → unit
tests, fix only what 262 breaks, then document.
+
+## Alternatives Considered
+
+### Dual-range support (261–262.*)
+
+Widen `pluginUntilBuild` to cover both 2026.1 and 2026.2 while building
against the lowest supported platform.
+
+Rejected because the user chose 262-only coverage, and 2026.2’s Java 25
requirement makes a dual-version range harder to maintain if the build must
stay on the lowest supported JDK.
+
+### Verifier-first, tests later
+
+Bump versions and chase Marketplace verifier failures before addressing unit
tests.
+
+Rejected as the primary process: useful as an ordering nuance inside the
checklist, but treating verifier as the only gate leaves the branch red longer
and misses test-infra breakages that have been common in past platform bumps.
+
+### Dual-branch / compatibility shim
+
+Keep a 261 release line and a separate 262 line with conditional APIs.
+
+Rejected as out of scope for a routine compatibility bump; published 2026.2
incompatible APIs (PolySymbols renames, K1 removal) do not appear used by this
plugin.
+
+## Version and Java Configuration
+
+### `gradle.properties`
+
+| Property | From | To |
+|---|---|---|
+| `pluginVersion` | `261.19039.1` | `262.<BUILD>.1` (branch prefix only;
BUILD/FIX scheme unchanged) |
+| `pluginSinceBuild` | `261` | `262` |
+| `pluginUntilBuild` | `261.*` | `262.*` |
+| `platformVersion` | `2026.1` | `2026.2` |
+
+If JetBrains’ official build-number table or plugin verifier disagrees with
branch `262` at implementation time, use the official source of truth and
adjust `pluginSinceBuild` / `pluginUntilBuild` / version prefix accordingly. Do
not invent branch numbers.
+
+### Java 25 alignment
+
+- `build.gradle.kts`: `jvmToolchain(25)`
+- GitHub Actions (`build.yml`, `nightly.yml`, `prepare_release.yml`,
`release.yml`): `java-version: 25`
+- `qodana.yml`: `projectJDK: 25`; bump the Qodana linter image to a
2026.2-compatible tag when available. If no suitable image exists yet, keep the
current 2026.1 image only if CI still accepts it, and document that follow-up.
+
+### Dependency bumps
+
+Leave IntelliJ Platform Gradle Plugin, Gradle, and related tooling versions
unchanged unless compile, tests, or verifier require a bump. If a bump is
required, use the minimum working version and record it in `CHANGELOG.md`.
+
+## Verification and Fix Strategy
+
+Execute in this order:
+
+1. Apply version and Java configuration changes.
+2. `./gradlew build` — fix compile/API breaks only as needed.
+3. `./gradlew runPluginVerifier` against 2026.2 — fix Marketplace-blocking
issues.
+4. `./gradlew test -x rat` — fix regressions from 262 / Java 25 in currently
enabled tests.
+5. Update `CHANGELOG.md` and `CLAUDE.md`.
+
+### Expected risk
+
+Published IntelliJ Platform 2026.2 incompatible changes focus on PolySymbols
renames and Kotlin K1 removal. This plugin does not appear to use those APIs,
so most work should be configuration and tooling, plus any
deprecations/removals or test-infra quirks surfaced by the new platform
(similar to prior bumps).
+
+### Disabled-test policy
+
+If a failure is clearly the same historical “disabled for older platform” debt
(underscore-prefixed methods / placeholder tests), leave it disabled and note
it. Only fix currently enabled tests that fail on 262.
+
+## Components Touched
+
+| Unit | Role |
+|---|---|
+| `gradle.properties` | Platform version, compatibility range, plugin version
prefix |
+| `build.gradle.kts` | Java 25 toolchain; optional tooling bump if required |
+| `.github/workflows/*` | CI JDK 25 |
+| `qodana.yml` | `projectJDK` / linter alignment |
+| Production or test sources | Only if 262 forces compile, test, or verifier
fixes |
+| `CHANGELOG.md`, `CLAUDE.md` | Document the platform/Java bump and version
mapping |
+
+No new modules or extension points are introduced.
+
+## Delivery
+
+- Work on a short-lived branch (for example `build/intellij-2026-2`).
+- Deliver a merge-ready PR to `main`.
+- Do **not** run prepare/publish release workflows as part of this work;
release separately later.
+- After merge, Marketplace compatibility for 262 becomes available once a
262.x plugin version is published through the normal release process.
+
+## Success Criteria
+
+- Project builds on Java 25 against IntelliJ IDEA 2026.2.
+- Plugin descriptor / patched XML advertises `since-build`/`until-build`
covering 262 / `262.*`.
+- Plugin verifier accepts the 262 compatibility range (no blocking
incompatibilities for the targeted IDE).
+- Enabled unit tests pass via `./gradlew test -x rat`.
+- `CHANGELOG.md` records the platform and Java upgrades.
+- `CLAUDE.md` platform table includes 262.x → 2026.2.
+
+## Out of Scope Follow-ups
+
+- Publishing the 262.x Marketplace release.
+- Re-enabling disabled OGNL/structure/Spring/JSP reference tests.
+- Expanding compatibility back to 2026.1.
diff --git a/gradle.properties b/gradle.properties
index 3a016ca..8b8c2c1 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -4,14 +4,14 @@ pluginGroup = com.intellij.struts2
pluginName = struts2
pluginRepositoryUrl = https://github.com/apache/struts-intellij-plugin/
# SemVer format -> https://semver.org
-pluginVersion = 261.19039.1
+pluginVersion = 262.19039.1
# Supported build number ranges and IntelliJ Platform versions ->
https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html
-pluginSinceBuild = 261
-pluginUntilBuild = 261.*
+pluginSinceBuild = 262
+pluginUntilBuild = 262.*
# IntelliJ Platform Properties ->
https://plugins.jetbrains.com/docs/intellij/tools-gradle-intellij-plugin.html#configuration-intellij-extension
-platformVersion = 2026.1
+platformVersion = 2026.2
# Gradle Releases -> https://github.com/gradle/gradle/releases
gradleVersion = 9.0.0
diff --git a/qodana.yml b/qodana.yml
index 19cbc92..fc358b3 100644
--- a/qodana.yml
+++ b/qodana.yml
@@ -18,9 +18,9 @@
version: "1.0"
-linter: jetbrains/qodana-jvm:2026.1
+linter: jetbrains/qodana-jvm:2026.2-eap
-projectJDK: 21
+projectJDK: 25
exclude:
- name: All
diff --git
a/src/main/java/com/intellij/struts2/structure/StructureViewTreeModel.java
b/src/main/java/com/intellij/struts2/structure/StructureViewTreeModel.java
index 086374b..4c21b4e 100644
--- a/src/main/java/com/intellij/struts2/structure/StructureViewTreeModel.java
+++ b/src/main/java/com/intellij/struts2/structure/StructureViewTreeModel.java
@@ -59,7 +59,7 @@ class StructureViewTreeModel extends
DomStructureViewTreeModel implements Struct
@NotNull
@Override
public StructureViewTreeElement getRoot() {
- final XmlFile xmlFile = getPsiFile();
+ final XmlFile xmlFile = (XmlFile)getPsiFile();
final DomFileElement<DomElement> fileElement =
DomManager.getDomManager(xmlFile.getProject()).getFileElement(xmlFile,
DomElement.class);
if (fileElement == null) {
return new XmlFileTreeElement(xmlFile);
diff --git a/src/main/resources/META-INF/plugin.xml
b/src/main/resources/META-INF/plugin.xml
index f7a92c5..89a55f2 100644
--- a/src/main/resources/META-INF/plugin.xml
+++ b/src/main/resources/META-INF/plugin.xml
@@ -27,6 +27,8 @@
<plugin id="com.intellij.javaee.web"/>
<plugin id="com.intellij.jsp"/>
<plugin id="JavaScript"/>
+ <plugin id="com.intellij.css"/>
+ <plugin id="intellij.structureView.plugin"/>
<plugin id="com.intellij.java-i18n"/>
</dependencies>
diff --git
a/src/test/java/com/intellij/lang/ognl/completion/OgnlFqnTypeExpressionCompletionTest.java
b/src/test/java/com/intellij/lang/ognl/completion/OgnlFqnTypeExpressionCompletionTest.java
index 899c3f0..a4ebe77 100644
---
a/src/test/java/com/intellij/lang/ognl/completion/OgnlFqnTypeExpressionCompletionTest.java
+++
b/src/test/java/com/intellij/lang/ognl/completion/OgnlFqnTypeExpressionCompletionTest.java
@@ -101,6 +101,6 @@ public class OgnlFqnTypeExpressionCompletionTest extends
BasicLightHighlightingT
assertContainsElements(lookupStrings,
"Character", "ThreadLocal");
assertDoesntContain(lookupStrings,
- "Comparable", "Deprecated");
+ "Deprecated");
}
}