Skip to content

Conversation

@aseemxs
Copy link
Contributor

@aseemxs aseemxs commented Nov 11, 2025

Summary

Add 2025.3 support with latest EAP snapshot (253.28294)

Supersedes #6052 - Complete rewrite with proper version segregation and API compatibility handling.

Changes

Platform Configuration:
• Add 2025.3 profile with build 253.28294
• Configure Kotlin 2.1 and coroutines 1.10.1-intellij-5
• Remove com.jetbrains.codeWithMe bundled plugin dependency for 2025.3 (not available in EAP)
• Bundle collaboration modules for 2025.3 (intellij.platform.collaborationTools, collaborationTools.auth.base, collaborationTools.auth)
• Fix Gateway SDK version to use version string (253.28294-EAP-CANDIDATE-SNAPSHOT) instead of build number

Version Segregation (src-242-252 / src-253+):

Core Platform:
• OTelService.kt - httpPost API signature change (ByteArray overload)
• RebuildDevfileRequiredNotification.kt - Code With Me APIs unavailable

Gateway/Remote Development:
• CawsConnectionProvider.kt, CawsConnectorViewPanels.kt - replace deprecated RD APIs with Kotlin coroutines
• CodeCatalystGatewayClientCustomizer.kt - GatewayClientCustomizationProvider API removed
• DevEnvStatusWatcher.kt - UnattendedStatusUtil API removed

AmazonQ:
• CwmProblemsViewMutator.kt - BackendToolWindowHost → ProblemsView.getToolWindow
• Add LSP4J dependency to amazonq/shared and amazonq/codewhisperer modules

AmazonQ Chat:
• BrowserConnector.kt - VirtualFile nullability fixes (2 locations)
• LanguageExtractor.kt - VirtualFile nullability with plaintext fallback
• FocusAreaContextExtractor.kt - VirtualFile nullability with unknown fallback

Debugger (jetbrains-ultimate):
• GoHelper.kt, NodeJsDebugSupport.kt - debugger APIs changed, stubbed in 253+

VirtualFile Nullability Fixes (no segregation needed):
• CodeWhispererService.kt, CodeWhispererServiceNew.kt
• AmazonQLanguageClientImpl.kt, TextDocumentServiceHandler.kt

Test Migration (tst-242-252 / tst-253+):

JUnit4 HeavyPlatformTestCase migration:
• jetbrains-core: AwsToolkitExplorerToolWindowTest, AwsSettingsPanelTest, AwsConnectionSettingsEditorTest
• jetbrains-community: ToolkitConnectionManagerTest, ToolkitAuthManagerTest, AwsConnectionManagerTest, AwsBearerTokenConnectionTest, AwsToolkitConnectionTest
• amazonq/shared: ArtifactManagerTest, DefaultAuthCredentialsServiceTest
• amazonq/codewhisperer: CodeInsightsSettingsFacadeTest, CodeWhispererUtilTest
• jetbrains-ultimate: RedshiftUtilsTest

CodeInsightTestFixture migration:
• TelemetryHelperTest - manual fixture initialization with mock extensions

Test Fixes:
• AmazonQStreamingClientTest - allow Windows Python SDK paths in VfsRootAccess (@BeforeClass for JUnit4)
• TelemetryHelperTest - allow Windows Python SDK paths in VfsRootAccess (@BeforeAll for JUnit5)

Code Quality:
• Fix detekt trailing whitespace issues in test files

License

I confirm that my contribution is made under the terms of the Apache 2.0 license.

@aseemxs aseemxs changed the title Add 2025.3 refresh feat(jetbrains): Add 2025.3 refresh Nov 12, 2025
- Remove com.jetbrains.codeWithMe from bundledPlugins (not available in 2025.3 EAP)
- Version-segregate RebuildDevfileRequiredNotification to src-253+ (Code With Me APIs unavailable)
Use version string (253.28294-EAP-CANDIDATE-SNAPSHOT) instead of build number (253.28294.92)
OAuth APIs split into separate modules in 253:
- intellij.platform.collaborationTools
- intellij.platform.collaborationTools.auth.base
- intellij.platform.collaborationTools.auth

These must be explicitly bundled for compilation.
httpPost API signature incompatibility in coroutine context.
Use ByteArray overload instead of OutputStream lambda.

- src/: Original implementation for 2024.3-2025.2
- src-253+/: Updated for 2025.3+ using httpPost ByteArray overload
Move OTelService out of base src/ to version-specific folders:
- src-242-252/: Original implementation for 2024.2-2025.2
- src-253+/: Updated implementation for 2025.3+

Gradle source sets include base src/ by default, causing
redeclaration when src-253+ also exists. Files must be
removed from src/ and placed in version ranges.
Move out of base src/ to version-specific folders:
- src-242-252/: Working implementation for 2024.2-2025.2
- src-253+/: Commented out for 2025.3 (Code With Me APIs unavailable)

Same pattern as OTelService - base src/ always included causes
redeclaration when version-specific folders exist.
Replace deprecated RD platform APIs with standard Kotlin coroutines:
- launchChildSyncIOBackground → scope.launch / lifetime.launch
- startChildSyncIOBackgroundAsync → lifetime.launch

Files:
- src-242-252/: Original implementation for 2024.2-2025.2
- src-253+/: Updated for 2025.3+ with standard coroutines

Affects: CawsConnectionProvider.kt, CawsConnectorViewPanels.kt
Functionality: Identical - only internal API changes
JUnit5 ProjectExtension removed in 2025.3.
Migrate to HeavyPlatformTestCase (JUnit4) for affected tests.

Files segregated:
- AwsToolkitExplorerToolWindowTest.kt
- GettingStartedOnStartupTest.kt
- JavaTestUtils.kt

Structure:
- tst-242-252/: Original JUnit5 tests for 2024.2-2025.2
- tst-253+/: Updated JUnit4 tests for 2025.3+
Migrate ProjectExtension tests to HeavyPlatformTestCase for 2025.3.

Files segregated:
- BrowserMessageTest.kt
- LoginBrowserTest.kt
- DefaultToolkitAuthManagerTest.kt
- IdcRolePopupTest.kt
- SetupAuthenticationDialogTest.kt

Structure:
- tst-242-252/: JUnit5 with ProjectExtension (2024.2-2025.2)
- tst-253+/: JUnit4 with HeavyPlatformTestCase (2025.3+)
Auto-corrected formatting and style issues in migrated test files.
- Add api(libs.lsp4j) to amazonq/shared module
- Add implementation(libs.lsp4j) to amazonq/codewhisperer module
- Resolves unresolved reference errors for LSP types
- CodeCatalystGatewayClientCustomizer: GatewayClientCustomizationProvider API removed
- DevEnvStatusWatcher: UnattendedStatusUtil API removed, use fallback values
- GoHelper: Go debugger APIs changed, throw UnsupportedOperationException
- NodeJsDebugSupport: NodeJS debugger APIs changed, stub implementation

src-242-252: Original working implementations
src-253+: Stubbed/disabled implementations with TODOs
- CodeWhispererService/ServiceNew: VirtualFile nullability fixes
- ArtifactManagerTest: ProjectExtension -> HeavyPlatformTestCase
- DefaultAuthCredentialsServiceTest: ProjectExtension -> HeavyPlatformTestCase
- RedshiftUtilsTest: ProjectExtension -> HeavyPlatformTestCase

src-242-252/tst-242-252: Original JUnit5 implementations
src-253+/tst-253+: Fixed implementations with null checks and JUnit4
…e file

Previous commit accidentally copied test file instead of service file to src-253+
These files only have null-safety changes that work in all versions:
- CodeWhispererService.kt, CodeWhispererServiceNew.kt
- AmazonQLanguageClientImpl.kt, TextDocumentServiceHandler.kt

Keep CwmProblemsViewMutator.kt segregated (BackendToolWindowHost API removed)
- BrowserConnector.kt: Fix 2 VirtualFile null checks
- LanguageExtractor.kt: Add null check with plaintext fallback
- FocusAreaContextExtractor.kt: Add null check with unknown fallback
- Segregate CodeInsightsSettingsFacadeTest.kt and CodeWhispererUtilTest.kt (ProjectExtension removed in 2025.3)
Replace ProjectExtension with CodeInsightTestFixture approach:
- Use IdeaTestFixtureFactory to create lightweight fixture
- Manual initialization of mock extensions after fixture setup
- Migrate test methods to JUnit naming convention (test prefix)
- Add proper tearDown to clean up mocks and fixture
Windows Python plugin scans for interpreters during test startup,
needs access to C:/Program Files for PyPy detection
Python plugin scans during IDE startup, before @before runs.
Use @BeforeClass with Disposer.newDisposable() to allow access earlier.
Same issue as AmazonQStreamingClientTest - Python plugin scans for
interpreters during IDE startup, attempting to access paths outside
allowed test roots. Added @BeforeAll method (JUnit5 equivalent of
@BeforeClass) to allow C:/Program Files access on Windows before
IDE initialization.
val requestFromUi = serializer.deserializeChatMessages<SendChatPromptRequest>(node)
val editor = FileEditorManager.getInstance(project).selectedTextEditor
val textDocumentIdentifier = editor?.let { TextDocumentIdentifier(toUriString(it.virtualFile)) }
val textDocumentIdentifier = editor?.virtualFile?.let { TextDocumentIdentifier(toUriString(it)) }
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this method call is obsolete

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this use the relative path approach instead, like in AmazonQLanguageClientImpl.kt?

kotlin                                                                                                                                                                                                                            
val textDocumentIdentifier = editor?.virtualFile?.let { virtualFile ->
   val relativePath = VfsUtilCore.getRelativePath(virtualFile, project.baseDir)
       ?: virtualFile.path
   TextDocumentIdentifier(relativePath)
}

Or is there a different preferred method?

@aseemxs aseemxs marked this pull request as ready for review November 13, 2025 21:07
@aseemxs aseemxs requested a review from a team as a code owner November 13, 2025 21:07
}.orEmpty(),
).apply {
textDocument = TextDocumentIdentifier(toUriString(editor.virtualFile))
textDocument = TextDocumentIdentifier(toUriString(editor.virtualFile ?: return@compute null))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

compute block should not return null

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is a regression

Comment on lines +53 to +56
val output = ByteArrayOutputStream()
item.writeBinaryTo(output)

httpPost(traceUrl, contentType = ContentType.XProtobuf, body = output.toByteArray())
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

follow up: don't need to copy entire file for this change

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

follow up: don't need to copy entire file

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

follow up: don't need to copy entire file

lifetime.launchOnUi {
loadingPanel.startLoading()
var panel: JComponent? = null
CoroutineScope(getCoroutineBgContext() + SupervisorJob()).launch {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

coroutine scope should be injected by service loader, not a new supervisor job


@ExperimentalTime
class CawsConnectionProvider : GatewayConnectionProvider {
private val scope = CoroutineScope(getCoroutineBgContext() + SupervisorJob())
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

coroutine scope should be injected by service loader, not a new supervisor job

@Suppress("UNUSED_VARIABLE")
val fileFinder = RemoteDebuggingFileFinder(mappings, LocalFileSystemFileFinder())

// STUB IMPLEMENTATION: NodeJS debugging temporarily disabled
Copy link
Contributor

@rli rli Nov 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should not be doing this; breaks nodejs 20 debug support

// TODO: GatewayClientCustomizationProvider removed in 2025.3 - investigate new Gateway customization APIs
/*
import com.intellij.openapi.extensions.ExtensionNotApplicableException
import com.jetbrains.rdserver.unattendedHost.customization.controlCenter.GatewayClientCustomizationProvider
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

enable com.jetbrains.codeWithMe
and use com.jetbrains.rdserver.unattendedHost.customization.GatewayClientCustomizationProvider


class CwmProblemsViewMutator : ProblemsViewMutator {
override fun mutateProblemsView(project: Project, runnable: (ToolWindow) -> Unit) {
ProblemsView.getToolWindow(project)?.let { runnable(it) }
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BackendToolWindowHost is available with codeWithMe in the ultimate module

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LifetimedService is available by adding

    intellijPlatform {
        bundledModule("intellij.rd.platform")
    }

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Follow up : can remove 242-252

- Add com.jetbrains.codeWithMe plugin dependency to IdeVersions
- Replace toUriString with relative path calculation in BrowserConnector
- Extract virtualFile validation outside ReadAction in CodeWhisperer services
- Move CwmProblemsViewMutator to jetbrains-ultimate with BackendToolWindowHost
- Update CodeCatalyst Gateway customization to use new property-based API
- Re-enable RebuildDevfileRequiredNotification with updated RD platform APIs

Addresses PR aws#6098 review comments
The intellij.rd.platform bundled module only exists in IDE versions
2025.2 and later. This change makes the dependency conditional to
prevent build failures on earlier IDE versions (2024.3, 2025.1).
Add space after comma in version string list to comply with detekt
code style requirements.
This file was already moved to jetbrains-ultimate but the old version
in src-242-252 was not deleted, causing duplicate class errors in the
coverage report for IDE versions 2024.2-2025.2.
… JaCoCo coverage for IDE versions 2024.2-2025.2
@rli
Copy link
Contributor

rli commented Nov 14, 2025

requires significant follow-up for cleanup

@rli rli merged commit 708d5d8 into aws:main Nov 14, 2025
14 of 15 checks passed
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.

2 participants