diff --git a/.changes/next-release/bugfix-7c7e1720-545f-4b5e-8d21-511f40fabf38.json b/.changes/next-release/bugfix-7c7e1720-545f-4b5e-8d21-511f40fabf38.json new file mode 100644 index 00000000000..48d19ce1b1d --- /dev/null +++ b/.changes/next-release/bugfix-7c7e1720-545f-4b5e-8d21-511f40fabf38.json @@ -0,0 +1,4 @@ +{ + "type" : "bugfix", + "description" : "Fix LinkageError while attempting to do Amazon Q inline suggestions in certain environments" +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/software/aws/toolkits/gradle/changelog/ChangeLog.kt b/buildSrc/src/main/kotlin/software/aws/toolkits/gradle/changelog/ChangeLog.kt index 1945a839fa5..5101ac7bfc3 100644 --- a/buildSrc/src/main/kotlin/software/aws/toolkits/gradle/changelog/ChangeLog.kt +++ b/buildSrc/src/main/kotlin/software/aws/toolkits/gradle/changelog/ChangeLog.kt @@ -39,7 +39,7 @@ enum class ChangeType(val sectionTitle: String) { class Serializer : StdSerializer(ChangeType::class.java) { override fun serialize(value: ChangeType, gen: JsonGenerator?, provider: SerializerProvider?) { - gen?.writeString(value.name.toLowerCase()) + gen?.writeString(value.name.lowercase()) } } } diff --git a/buildSrc/src/main/kotlin/software/aws/toolkits/gradle/changelog/tasks/NewChange.kt b/buildSrc/src/main/kotlin/software/aws/toolkits/gradle/changelog/tasks/NewChange.kt index c52dcc8cabe..0afde8ee7f8 100644 --- a/buildSrc/src/main/kotlin/software/aws/toolkits/gradle/changelog/tasks/NewChange.kt +++ b/buildSrc/src/main/kotlin/software/aws/toolkits/gradle/changelog/tasks/NewChange.kt @@ -65,7 +65,7 @@ open class NewChange : ChangeLogTask() { ) } - private fun newFile(changeType: ChangeType) = nextReleaseDirectory.file("${changeType.name.toLowerCase()}-${UUID.randomUUID()}.json").get().asFile.apply { + private fun newFile(changeType: ChangeType) = nextReleaseDirectory.file("${changeType.name.lowercase()}-${UUID.randomUUID()}.json").get().asFile.apply { parentFile?.mkdirs() createNewFile() } diff --git a/buildSrc/src/main/kotlin/toolkit-intellij-subplugin.gradle.kts b/buildSrc/src/main/kotlin/toolkit-intellij-subplugin.gradle.kts index 8adcaec7aab..42e4ab2edb6 100644 --- a/buildSrc/src/main/kotlin/toolkit-intellij-subplugin.gradle.kts +++ b/buildSrc/src/main/kotlin/toolkit-intellij-subplugin.gradle.kts @@ -48,9 +48,11 @@ configurations { // Exclude dependencies that ship with iDE exclude(group = "org.slf4j") - // we want kotlinx-coroutines-debug and kotlinx-coroutines-test - exclude(group = "org.jetbrains.kotlinx", "kotlinx-coroutines-core-jvm") - exclude(group = "org.jetbrains.kotlinx", "kotlinx-coroutines-core") + if (!name.startsWith("kotlinCompiler") && !name.startsWith("generateModels") && !name.startsWith("rdGen")) { + // we want kotlinx-coroutines-debug and kotlinx-coroutines-test + exclude(group = "org.jetbrains.kotlinx", "kotlinx-coroutines-core-jvm") + exclude(group = "org.jetbrains.kotlinx", "kotlinx-coroutines-core") + } resolutionStrategy.eachDependency { if (requested.group == "org.jetbrains.kotlinx" && requested.name.startsWith("kotlinx-coroutines")) { diff --git a/buildSrc/src/main/kotlin/toolkit-publishing-conventions.gradle.kts b/buildSrc/src/main/kotlin/toolkit-publishing-conventions.gradle.kts index 7b5994ab3e4..d7815bf6bd8 100644 --- a/buildSrc/src/main/kotlin/toolkit-publishing-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/toolkit-publishing-conventions.gradle.kts @@ -54,7 +54,8 @@ configurations { // Make sure we exclude stuff we either A) ships with IDE, B) we don't use to cut down on size runtimeClasspath { - exclude(group = "org.slf4j") + exclude(group = "com.google.code.gson") + exclude(group = "org.slf4j", module = "slf4j-jdk14") exclude(group = "org.jetbrains.kotlin") exclude(group = "org.jetbrains.kotlinx") } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1d5acb6e703..b9c1bf99a57 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -19,9 +19,10 @@ junit4 = "4.13.2" junit5 = "5.11.0" # https://plugins.jetbrains.com/docs/intellij/kotlin.html#adding-kotlin-support # https://kotlinlang.org/docs/releases.html#release-details -kotlin = "2.0.0" +kotlin = "2.1.20" # set in /settings.gradle.kts kotlinCoroutines = "1.8.0" +lsp4j = "0.24.0" mockito = "5.12.0" mockitoKotlin = "5.4.0" mockk = "1.13.17" @@ -105,6 +106,7 @@ kotlin-coroutinesTest = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-tes kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" } kotlin-stdLibJdk8 = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk8", version.ref = "kotlin" } kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test-junit", version.ref = "kotlin" } +lsp4j = { module = "org.eclipse.lsp4j:org.eclipse.lsp4j", version.ref = "lsp4j" } mockito-core = { module = "org.mockito:mockito-core", version.ref = "mockito" } mockito-junit-jupiter = { module = "org.mockito:mockito-junit-jupiter", version.ref = "mockito" } mockito-kotlin = { module = "org.mockito.kotlin:mockito-kotlin", version.ref = "mockitoKotlin" } diff --git a/plugins/amazonq/build.gradle.kts b/plugins/amazonq/build.gradle.kts index f3caa6e678e..c85cbfbd66f 100644 --- a/plugins/amazonq/build.gradle.kts +++ b/plugins/amazonq/build.gradle.kts @@ -36,6 +36,7 @@ dependencies { implementation(project(":plugin-amazonq:codewhisperer")) implementation(project(":plugin-amazonq:mynah-ui")) implementation(project(":plugin-amazonq:shared")) + implementation(libs.lsp4j) testImplementation(project(":plugin-core")) } diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/tstFixtures/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererTestUtil.kt b/plugins/amazonq/codewhisperer/jetbrains-community/tstFixtures/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererTestUtil.kt index 1178a7ff967..b806ee78842 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/tstFixtures/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererTestUtil.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/tstFixtures/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererTestUtil.kt @@ -172,10 +172,10 @@ object CodeWhispererTestUtil { const val leftContext_success_Iac = "# Create an S3 Bucket named CodeWhisperer in CloudFormation" const val leftContext_failure_Iac = "Create an S3 Bucket named CodeWhisperer" - internal fun pythonResponseWithToken(token: String): GenerateCompletionsResponse = + fun pythonResponseWithToken(token: String): GenerateCompletionsResponse = pythonResponse.toBuilder().nextToken(token).build() - internal fun generateMockCompletionDetail(content: String): Completion { + fun generateMockCompletionDetail(content: String): Completion { val referenceInfo = getReferenceInfo() return Completion.builder().content(content) .references( @@ -184,9 +184,9 @@ object CodeWhispererTestUtil { .build() } - internal fun getReferenceInfo() = testReferenceInfoPair[Random.nextInt(testReferenceInfoPair.size)] + fun getReferenceInfo() = testReferenceInfoPair[Random.nextInt(testReferenceInfoPair.size)] - internal fun generateMockCompletionDetail( + fun generateMockCompletionDetail( content: String, licenseName: String, repository: String, diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/tstFixtures/software/aws/toolkits/jetbrains/services/codewhisperer/importadder/CodeWhispererImportAdderTestBase.kt b/plugins/amazonq/codewhisperer/jetbrains-community/tstFixtures/software/aws/toolkits/jetbrains/services/codewhisperer/importadder/CodeWhispererImportAdderTestBase.kt index b9785908658..1393efdbbe2 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/tstFixtures/software/aws/toolkits/jetbrains/services/codewhisperer/importadder/CodeWhispererImportAdderTestBase.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/tstFixtures/software/aws/toolkits/jetbrains/services/codewhisperer/importadder/CodeWhispererImportAdderTestBase.kt @@ -18,7 +18,7 @@ import kotlin.test.fail open class CodeWhispererImportAdderTestBase( val importAdder: CodeWhispererImportAdder, @Rule @JvmField val projectRule: CodeInsightTestFixtureRule, - internal val fileExtension: String, + val fileExtension: String, ) { fun testCreateNewImportPsiElementReturnValueForStatements( diff --git a/plugins/core/build.gradle.kts b/plugins/core/build.gradle.kts index 9070ef01516..51c191fa3f4 100644 --- a/plugins/core/build.gradle.kts +++ b/plugins/core/build.gradle.kts @@ -15,6 +15,7 @@ dependencies { implementation(project(":plugin-core:resources")) implementation(project(":plugin-core:sdk-codegen")) implementation(project(":plugin-core:webview")) + implementation(libs.slf4j.api) } tasks.check { diff --git a/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/utils/TextUtils.kt b/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/utils/TextUtils.kt index d723e62d0aa..dd247556d10 100644 --- a/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/utils/TextUtils.kt +++ b/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/utils/TextUtils.kt @@ -29,7 +29,7 @@ fun formatText(project: Project, language: Language, content: String): String { * Designed to convert underscore separated words (e.g. UPDATE_COMPLETE) into title cased human readable text * (e.g. Update Complete) */ -fun String.toHumanReadable() = StringUtil.toTitleCase(toLowerCase().replace('_', ' ')) +fun String.toHumanReadable() = StringUtil.toTitleCase(lowercase().replace('_', ' ')) fun generateUnifiedPatch(patch: String, filePath: String): TextFilePatch { val unifiedPatch = "--- $filePath\n+++ $filePath\n$patch" diff --git a/plugins/core/jetbrains-community/tst/software/aws/toolkits/jetbrains/core/AwsResourceCacheTest.kt b/plugins/core/jetbrains-community/tst/software/aws/toolkits/jetbrains/core/AwsResourceCacheTest.kt index 42c7a3092f1..ec06877bbab 100644 --- a/plugins/core/jetbrains-community/tst/software/aws/toolkits/jetbrains/core/AwsResourceCacheTest.kt +++ b/plugins/core/jetbrains-community/tst/software/aws/toolkits/jetbrains/core/AwsResourceCacheTest.kt @@ -243,7 +243,7 @@ class AwsResourceCacheTest { whenever(mockResource.fetch(any())).thenReturn("hello") val viewResource = Resource.view(mockResource) { toList() } - val filteredAndMapped = viewResource.filter { it != 'l' }.map { it.toUpperCase() } + val filteredAndMapped = viewResource.filter { it != 'l' }.map { it.uppercaseChar() } assertThat(sut.getResource(filteredAndMapped, connectionSettings)).hasValue(listOf('H', 'E', 'O')) val find = viewResource.find { it == 'l' } diff --git a/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/PathMapper.kt b/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/PathMapper.kt index 8c0c0ee213d..806886988d9 100644 --- a/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/PathMapper.kt +++ b/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/PathMapper.kt @@ -55,7 +55,7 @@ class PathMapper(private val mappings: List) { fun normalizeLocal(localPath: String): String { val updatedPath = if (SystemInfo.isWindows) { - localPath.toLowerCase() + localPath.lowercase() } else { localPath } diff --git a/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/cloudformation/CloudFormationTemplate.kt b/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/cloudformation/CloudFormationTemplate.kt index 3a14983236d..50d4db2867a 100644 --- a/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/cloudformation/CloudFormationTemplate.kt +++ b/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/cloudformation/CloudFormationTemplate.kt @@ -40,7 +40,7 @@ interface CloudFormationTemplate { } private fun isYaml(templateFile: VirtualFile): Boolean = templateFile.fileType == YAMLFileType.YML || - templateFile.extension?.toLowerCase() in YAML_EXTENSIONS + templateFile.extension?.lowercase() in YAML_EXTENSIONS private val YAML_EXTENSIONS = setOf("yaml", "yml") } diff --git a/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/dynamic/DynamicResourceStateChangedNotificationHandler.kt b/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/dynamic/DynamicResourceStateChangedNotificationHandler.kt index cec97d2fd03..a018ddf79be 100644 --- a/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/dynamic/DynamicResourceStateChangedNotificationHandler.kt +++ b/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/dynamic/DynamicResourceStateChangedNotificationHandler.kt @@ -25,12 +25,12 @@ class DynamicResourceStateChangedNotificationHandler(private val project: Projec message( "dynamic_resources.operation_status_notification_title", state.resourceIdentifier ?: state.resourceType, - state.operation.name.toLowerCase() + state.operation.name.lowercase() ), message( "dynamic_resources.operation_status_success", state.resourceIdentifier ?: state.resourceType, - state.operation.name.toLowerCase() + state.operation.name.lowercase() ), project ) @@ -48,7 +48,7 @@ class DynamicResourceStateChangedNotificationHandler(private val project: Projec message( "dynamic_resources.operation_status_failed_no_message", state.resourceIdentifier ?: state.resourceType, - state.operation.name.toLowerCase() + state.operation.name.lowercase() ) ) } else { @@ -57,7 +57,7 @@ class DynamicResourceStateChangedNotificationHandler(private val project: Projec message( "dynamic_resources.operation_status_failed", state.resourceIdentifier ?: state.resourceType, - state.operation.name.toLowerCase(), + state.operation.name.lowercase(), state.message ) ) @@ -79,7 +79,7 @@ class DynamicResourceStateChangedNotificationHandler(private val project: Projec message( "dynamic_resources.operation_status_notification_title", state.resourceIdentifier ?: state.resourceType, - state.operation.name.toLowerCase() + state.operation.name.lowercase() ), errorMessage, project diff --git a/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/dynamic/DynamicResourcesUpdateManager.kt b/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/dynamic/DynamicResourcesUpdateManager.kt index 594edb003fc..1f11d79890e 100644 --- a/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/dynamic/DynamicResourcesUpdateManager.kt +++ b/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/dynamic/DynamicResourcesUpdateManager.kt @@ -50,7 +50,7 @@ internal class DynamicResourceUpdateManager(private val project: Project) { message( "dynamic_resources.operation_status_notification_title", dynamicResourceIdentifier.resourceIdentifier, - message("general.delete").toLowerCase() + message("general.delete").lowercase() ), project ) @@ -80,7 +80,7 @@ internal class DynamicResourceUpdateManager(private val project: Project) { message( "dynamic_resources.operation_status_notification_title", dynamicResourceIdentifier.resourceIdentifier, - message("dynamic_resources.editor.submitResourceUpdateRequest_text").toLowerCase() + message("dynamic_resources.editor.submitResourceUpdateRequest_text").lowercase() ), project ) @@ -152,7 +152,7 @@ internal class DynamicResourceUpdateManager(private val project: Project) { message( "dynamic_resources.operation_status_notification_title", mutation.resourceIdentifier ?: mutation.resourceType, - mutation.operation.name.toLowerCase() + mutation.operation.name.lowercase() ), project ) diff --git a/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/lambda/wizard/SchemaCodeGenUtils.kt b/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/lambda/wizard/SchemaCodeGenUtils.kt index 211a3f19d0b..5fde8e5ef95 100644 --- a/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/lambda/wizard/SchemaCodeGenUtils.kt +++ b/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/lambda/wizard/SchemaCodeGenUtils.kt @@ -64,7 +64,7 @@ class SchemaCodeGenUtils { if (builder.isNotEmpty()) { builder.append(IdentifierFormatter.PACKAGE_SEPARATOR) } - builder.append(IdentifierFormatter.toValidIdentifier(segment.toLowerCase())) + builder.append(IdentifierFormatter.toValidIdentifier(segment.lowercase())) return this } diff --git a/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/s3/editor/S3TreeTable.kt b/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/s3/editor/S3TreeTable.kt index d1fa6c597bc..fa0ab92e727 100644 --- a/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/s3/editor/S3TreeTable.kt +++ b/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/s3/editor/S3TreeTable.kt @@ -160,7 +160,7 @@ class S3TreeTable( TreeSpeedSearch.installOn( tree, false, - Function { obj -> + Function { obj -> val node = obj.lastPathComponent as DefaultMutableTreeNode val userObject = node.userObject as? S3TreeNode ?: return@Function null return@Function if (userObject !is S3TreeContinuationNode<*>) { diff --git a/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/ui/ResourceSelector.kt b/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/ui/ResourceSelector.kt index 64ef26aa7c4..1478bd32718 100644 --- a/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/ui/ResourceSelector.kt +++ b/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/ui/ResourceSelector.kt @@ -160,7 +160,7 @@ class ResourceSelector private constructor( setEditable(false) if (sortOnLoad) { - model.replaceAll(value.sortedBy { it.toString().toLowerCase() }) + model.replaceAll(value.sortedBy { it.toString().lowercase() }) } else { model.replaceAll(value.toList()) } diff --git a/plugins/toolkit/jetbrains-gateway/src/software/aws/toolkits/jetbrains/gateway/Workspace.kt b/plugins/toolkit/jetbrains-gateway/src/software/aws/toolkits/jetbrains/gateway/Workspace.kt index 0b1262db684..f5bf4cb3179 100644 --- a/plugins/toolkit/jetbrains-gateway/src/software/aws/toolkits/jetbrains/gateway/Workspace.kt +++ b/plugins/toolkit/jetbrains-gateway/src/software/aws/toolkits/jetbrains/gateway/Workspace.kt @@ -37,7 +37,7 @@ data class Workspace( // TODO: probably need to model the @sha:[...] case better val (productCode, buildNumber) = ide.runtime().substringAfter("$JB_ECR_DOMAIN/").split(':', limit = 2) - productCode.substringBefore("@sha").toUpperCase() to buildNumber + productCode.substringBefore("@sha").uppercase() to buildNumber } val platformProduct = build?.let { IntelliJPlatformProduct.fromProductCode(it.first) } diff --git a/plugins/toolkit/jetbrains-rider/build.gradle.kts b/plugins/toolkit/jetbrains-rider/build.gradle.kts index a42162c8fdd..e92ce552736 100644 --- a/plugins/toolkit/jetbrains-rider/build.gradle.kts +++ b/plugins/toolkit/jetbrains-rider/build.gradle.kts @@ -388,7 +388,7 @@ tasks.withType().configureEach { } configurations.all { - if (name.contains("detekt")) { + if (name.contains("detekt") || name.contains("kotlinCompiler") || name.contains("rdGen")) { return@all } diff --git a/plugins/toolkit/jetbrains-ultimate/it/software/aws/toolkits/jetbrains/services/lambda/go/GoLocalRunConfigurationIntegrationTest.kt b/plugins/toolkit/jetbrains-ultimate/it/software/aws/toolkits/jetbrains/services/lambda/go/GoLocalRunConfigurationIntegrationTest.kt index ae041425018..6f25cb4716a 100644 --- a/plugins/toolkit/jetbrains-ultimate/it/software/aws/toolkits/jetbrains/services/lambda/go/GoLocalRunConfigurationIntegrationTest.kt +++ b/plugins/toolkit/jetbrains-ultimate/it/software/aws/toolkits/jetbrains/services/lambda/go/GoLocalRunConfigurationIntegrationTest.kt @@ -240,7 +240,7 @@ class GoLocalRunConfigurationIntegrationTest(private val runtime: LambdaRuntime) val executeLambda = executeRunConfigurationAndWait(runConfiguration, DefaultDebugExecutor.EXECUTOR_ID) assertThat(executeLambda.exitCode).isEqualTo(0) - assertThat(executeLambda.stdout).contains(input.toUpperCase()) + assertThat(executeLambda.stdout).contains(input.uppercase()) assertThat(debuggerIsHit.get()).isTrue } @@ -281,7 +281,7 @@ class GoLocalRunConfigurationIntegrationTest(private val runtime: LambdaRuntime) runtime = runtime, mockCredentialsId = mockId, input = input, - expectedOutput = input.toUpperCase() + expectedOutput = input.uppercase() ) @Test