From 58ab971fe157e7fa591907645e00d879e5b917ec Mon Sep 17 00:00:00 2001 From: Yang Zhang Date: Wed, 16 Jul 2025 16:01:41 -0700 Subject: [PATCH 1/7] fix(amazonq): change to use withExtensionFilter to hide unallowed files --- .../amazonq/lsp/AmazonQLanguageClientImpl.kt | 46 ++++++++++++++++--- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt index fe5f70bec8d..c38b68746b7 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt @@ -20,6 +20,7 @@ import com.intellij.openapi.vfs.LocalFileSystem import com.intellij.openapi.vfs.VfsUtil import com.intellij.openapi.vfs.VfsUtilCore import com.intellij.openapi.vfs.VirtualFileManager +import com.intellij.openapi.application.ApplicationInfo import migration.software.aws.toolkits.jetbrains.settings.AwsSettings import org.eclipse.lsp4j.ConfigurationParams import org.eclipse.lsp4j.MessageActionItem @@ -308,13 +309,30 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC if (params.filters.isNotEmpty() && !params.canSelectFolders) { // Create a combined list of all allowed extensions val allowedExtensions = params.filters.values.flatten().toSet() - - withFileFilter { virtualFile -> - if (virtualFile.isDirectory) { - true // Always allow directories for navigation - } else { - val extension = virtualFile.extension?.lowercase() - extension != null && allowedExtensions.contains(extension) + if (isExtensionFilterSupported()) { + // Use reflection to call withExtensionFilter which is only available in 2024.3+ + try { + val method = this.javaClass.getMethod("withExtensionFilter", String::class.java, Array::class.java) + method.invoke(this, "Image", allowedExtensions.toTypedArray()) + } catch (e: Exception) { + // Fallback to withFileFilter if reflection fails + withFileFilter { virtualFile -> + if (virtualFile.isDirectory) { + true // Always allow directories for navigation + } else { + val extension = virtualFile.extension?.lowercase() + extension != null && allowedExtensions.contains(extension) + } + } + } + } else { + withFileFilter { virtualFile -> + if (virtualFile.isDirectory) { + true // Always allow directories for navigation + } else { + val extension = virtualFile.extension?.lowercase() + extension != null && allowedExtensions.contains(extension) + } } } } @@ -579,6 +597,20 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC } } + /** + * Checks if the current JetBrains IDE version supports the withExtensionFilter API. + * + * The withExtensionFilter method was introduced in IntelliJ Platform 2024.3 (baseline version 243). + * For older versions, we need to fall back to withFileFilter which provides similar functionality + * but with different UI behavior (files are not visually filtered in the file chooser dialog). + * + * @return true if the IDE version supports withExtensionFilter (2024.3+), false otherwise + */ + private fun isExtensionFilterSupported(): Boolean { + val baselineVersion = ApplicationInfo.getInstance().build.baselineVersion + return baselineVersion >= 243 // 2024.3 or later + } + companion object { val localHistoryPath = Paths.get( UserHomeDirectoryUtils.userHomeDirectory(), From 3b2cee2cefb8ddef3330a26ba3795b56dbdf9a5e Mon Sep 17 00:00:00 2001 From: Yang Zhang Date: Wed, 16 Jul 2025 16:25:58 -0700 Subject: [PATCH 2/7] fix(amazonq): change to use withExtensionFilter --- .../bugfix-7029c1d5-212c-48ac-9513-38f0beca8fa8.json | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .changes/next-release/bugfix-7029c1d5-212c-48ac-9513-38f0beca8fa8.json diff --git a/.changes/next-release/bugfix-7029c1d5-212c-48ac-9513-38f0beca8fa8.json b/.changes/next-release/bugfix-7029c1d5-212c-48ac-9513-38f0beca8fa8.json new file mode 100644 index 00000000000..f02372c000e --- /dev/null +++ b/.changes/next-release/bugfix-7029c1d5-212c-48ac-9513-38f0beca8fa8.json @@ -0,0 +1,4 @@ +{ + "type" : "bugfix", + "description" : "change to use withExtensionFilter to hide unallowed files when selecting image" +} \ No newline at end of file From c2fad6449ee7f1de9f7399ca7b2f7dea6f3ccda0 Mon Sep 17 00:00:00 2001 From: Yang Zhang Date: Tue, 22 Jul 2025 15:32:42 -0700 Subject: [PATCH 3/7] fix(amazonq): optimize imports --- .../services/amazonq/lsp/AmazonQLanguageClientImpl.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt index 0fbcd71ef15..ffec0852896 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt @@ -9,6 +9,7 @@ import com.intellij.diff.requests.SimpleDiffRequest import com.intellij.ide.BrowserUtil import com.intellij.notification.NotificationAction import com.intellij.notification.NotificationType +import com.intellij.openapi.application.ApplicationInfo import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.fileChooser.FileChooser import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory @@ -20,7 +21,6 @@ import com.intellij.openapi.vfs.LocalFileSystem import com.intellij.openapi.vfs.VfsUtil import com.intellij.openapi.vfs.VfsUtilCore import com.intellij.openapi.vfs.VirtualFileManager -import com.intellij.openapi.application.ApplicationInfo import migration.software.aws.toolkits.jetbrains.settings.AwsSettings import org.eclipse.lsp4j.ApplyWorkspaceEditParams import org.eclipse.lsp4j.ApplyWorkspaceEditResponse @@ -616,11 +616,11 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC /** * Checks if the current JetBrains IDE version supports the withExtensionFilter API. - * + * * The withExtensionFilter method was introduced in IntelliJ Platform 2024.3 (baseline version 243). * For older versions, we need to fall back to withFileFilter which provides similar functionality * but with different UI behavior (files are not visually filtered in the file chooser dialog). - * + * * @return true if the IDE version supports withExtensionFilter (2024.3+), false otherwise */ private fun isExtensionFilterSupported(): Boolean { From 56876293ce1ce4353e8be102ee3cb4119f534a89 Mon Sep 17 00:00:00 2001 From: Yang Zhang Date: Thu, 24 Jul 2025 14:24:50 -0700 Subject: [PATCH 4/7] fix(amazonq): comments --- ...-7029c1d5-212c-48ac-9513-38f0beca8fa8.json | 2 +- .../amazonq/lsp/util/FileChooserCompatImpl.kt | 28 ++++++++++++ .../amazonq/lsp/util/FileChooserCompatImpl.kt | 21 +++++++++ .../amazonq/lsp/AmazonQLanguageClientImpl.kt | 44 ++----------------- .../amazonq/lsp/util/FileChooserCompat.kt | 32 ++++++++++++++ 5 files changed, 85 insertions(+), 42 deletions(-) create mode 100644 plugins/amazonq/shared/jetbrains-community/src-242/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompatImpl.kt create mode 100644 plugins/amazonq/shared/jetbrains-community/src-243+/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompatImpl.kt create mode 100644 plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompat.kt diff --git a/.changes/next-release/bugfix-7029c1d5-212c-48ac-9513-38f0beca8fa8.json b/.changes/next-release/bugfix-7029c1d5-212c-48ac-9513-38f0beca8fa8.json index f02372c000e..f74a5086d47 100644 --- a/.changes/next-release/bugfix-7029c1d5-212c-48ac-9513-38f0beca8fa8.json +++ b/.changes/next-release/bugfix-7029c1d5-212c-48ac-9513-38f0beca8fa8.json @@ -1,4 +1,4 @@ { "type" : "bugfix", - "description" : "change to use withExtensionFilter to hide unallowed files when selecting image" + "description" : "Fix unsupported files being shown in file picker when selecting images for adding image context in Windows" } \ No newline at end of file diff --git a/plugins/amazonq/shared/jetbrains-community/src-242/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompatImpl.kt b/plugins/amazonq/shared/jetbrains-community/src-242/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompatImpl.kt new file mode 100644 index 00000000000..a30fc1b5097 --- /dev/null +++ b/plugins/amazonq/shared/jetbrains-community/src-242/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompatImpl.kt @@ -0,0 +1,28 @@ +// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.jetbrains.services.amazonq.lsp.util + +import com.intellij.openapi.fileChooser.FileChooserDescriptor + +/** + * FileChooserCompat implementation for IntelliJ Platform versions before 2024.3 (baseline < 243). + * Uses withFileFilter method which provides filtering functionality but doesn't visually filter + * files in the chooser dialog. + */ +internal class FileChooserCompatImpl : FileChooserCompat { + override fun applyExtensionFilter( + descriptor: FileChooserDescriptor, + filterName: String, + allowedExtensions: Set + ): FileChooserDescriptor { + return descriptor.withFileFilter { virtualFile -> + if (virtualFile.isDirectory) { + true // Always allow directories for navigation + } else { + val extension = virtualFile.extension?.lowercase() + extension != null && allowedExtensions.contains(extension) + } + } + } +} \ No newline at end of file diff --git a/plugins/amazonq/shared/jetbrains-community/src-243+/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompatImpl.kt b/plugins/amazonq/shared/jetbrains-community/src-243+/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompatImpl.kt new file mode 100644 index 00000000000..060a8802073 --- /dev/null +++ b/plugins/amazonq/shared/jetbrains-community/src-243+/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompatImpl.kt @@ -0,0 +1,21 @@ +// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.jetbrains.services.amazonq.lsp.util + +import com.intellij.openapi.fileChooser.FileChooserDescriptor + +/** + * FileChooserCompat implementation for IntelliJ Platform versions 2024.3+ (baseline >= 243). + * Uses withExtensionFilter method which provides both filtering functionality and visual + * filtering in the chooser dialog. + */ +internal class FileChooserCompatImpl : FileChooserCompat { + override fun applyExtensionFilter( + descriptor: FileChooserDescriptor, + filterName: String, + allowedExtensions: Set + ): FileChooserDescriptor { + return descriptor.withExtensionFilter(filterName, *allowedExtensions.toTypedArray()) + } +} \ No newline at end of file diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt index ffec0852896..0e9c61157bc 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt @@ -9,7 +9,6 @@ import com.intellij.diff.requests.SimpleDiffRequest import com.intellij.ide.BrowserUtil import com.intellij.notification.NotificationAction import com.intellij.notification.NotificationType -import com.intellij.openapi.application.ApplicationInfo import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.fileChooser.FileChooser import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory @@ -65,6 +64,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowO import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowSaveFileDialogParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowSaveFileDialogResult import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.ConnectionMetadata +import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.FileChooserCompat import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.LspEditorUtil import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.TelemetryParsingUtil import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator @@ -312,32 +312,8 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC if (params.filters.isNotEmpty() && !params.canSelectFolders) { // Create a combined list of all allowed extensions val allowedExtensions = params.filters.values.flatten().toSet() - if (isExtensionFilterSupported()) { - // Use reflection to call withExtensionFilter which is only available in 2024.3+ - try { - val method = this.javaClass.getMethod("withExtensionFilter", String::class.java, Array::class.java) - method.invoke(this, "Image", allowedExtensions.toTypedArray()) - } catch (e: Exception) { - // Fallback to withFileFilter if reflection fails - withFileFilter { virtualFile -> - if (virtualFile.isDirectory) { - true // Always allow directories for navigation - } else { - val extension = virtualFile.extension?.lowercase() - extension != null && allowedExtensions.contains(extension) - } - } - } - } else { - withFileFilter { virtualFile -> - if (virtualFile.isDirectory) { - true // Always allow directories for navigation - } else { - val extension = virtualFile.extension?.lowercase() - extension != null && allowedExtensions.contains(extension) - } - } - } + val fileChooserCompat = FileChooserCompat.getInstance() + fileChooserCompat.applyExtensionFilter(this, "Images", allowedExtensions) } } @@ -614,20 +590,6 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC } } - /** - * Checks if the current JetBrains IDE version supports the withExtensionFilter API. - * - * The withExtensionFilter method was introduced in IntelliJ Platform 2024.3 (baseline version 243). - * For older versions, we need to fall back to withFileFilter which provides similar functionality - * but with different UI behavior (files are not visually filtered in the file chooser dialog). - * - * @return true if the IDE version supports withExtensionFilter (2024.3+), false otherwise - */ - private fun isExtensionFilterSupported(): Boolean { - val baselineVersion = ApplicationInfo.getInstance().build.baselineVersion - return baselineVersion >= 243 // 2024.3 or later - } - companion object { val localHistoryPath = Paths.get( UserHomeDirectoryUtils.userHomeDirectory(), diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompat.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompat.kt new file mode 100644 index 00000000000..41cfb49b73f --- /dev/null +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompat.kt @@ -0,0 +1,32 @@ +// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.jetbrains.services.amazonq.lsp.util + +import com.intellij.openapi.fileChooser.FileChooserDescriptor + +/** + * Compatibility interface for handling file chooser extension filtering across different IntelliJ Platform versions. + * + * The withExtensionFilter method was introduced in IntelliJ Platform 2024.3 (baseline version 243). + * For older versions, fall back to withFileFilter which provides similar functionality + */ +interface FileChooserCompat { + /** + * Applies file extension filtering to the given FileChooserDescriptor. + * + * @param descriptor The FileChooserDescriptor to apply filtering to + * @param filterName The display name for the filter (e.g., "Images") + * @param allowedExtensions Set of allowed file extensions (e.g., "jpg", "png") + * @return The modified FileChooserDescriptor + */ + fun applyExtensionFilter( + descriptor: FileChooserDescriptor, + filterName: String, + allowedExtensions: Set + ): FileChooserDescriptor + + companion object { + fun getInstance(): FileChooserCompat = FileChooserCompatImpl() + } +} From cfec3f7e815a30afaaff672b02dd1206dd0b39ee Mon Sep 17 00:00:00 2001 From: Yang Zhang Date: Thu, 24 Jul 2025 16:54:19 -0700 Subject: [PATCH 5/7] fix(amazonq): fix detekt --- .../amazonq/lsp/util/FileChooserCompatImpl.kt | 18 ++++++++---------- .../amazonq/lsp/util/FileChooserCompatImpl.kt | 8 +++----- .../amazonq/lsp/util/FileChooserCompat.kt | 6 +++--- 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/plugins/amazonq/shared/jetbrains-community/src-242/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompatImpl.kt b/plugins/amazonq/shared/jetbrains-community/src-242/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompatImpl.kt index a30fc1b5097..3132b06a0c9 100644 --- a/plugins/amazonq/shared/jetbrains-community/src-242/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompatImpl.kt +++ b/plugins/amazonq/shared/jetbrains-community/src-242/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompatImpl.kt @@ -14,15 +14,13 @@ internal class FileChooserCompatImpl : FileChooserCompat { override fun applyExtensionFilter( descriptor: FileChooserDescriptor, filterName: String, - allowedExtensions: Set - ): FileChooserDescriptor { - return descriptor.withFileFilter { virtualFile -> - if (virtualFile.isDirectory) { - true // Always allow directories for navigation - } else { - val extension = virtualFile.extension?.lowercase() - extension != null && allowedExtensions.contains(extension) - } + allowedExtensions: Set, + ): FileChooserDescriptor = descriptor.withFileFilter { virtualFile -> + if (virtualFile.isDirectory) { + true // Always allow directories for navigation + } else { + val extension = virtualFile.extension?.lowercase() + extension != null && allowedExtensions.contains(extension) } } -} \ No newline at end of file +} diff --git a/plugins/amazonq/shared/jetbrains-community/src-243+/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompatImpl.kt b/plugins/amazonq/shared/jetbrains-community/src-243+/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompatImpl.kt index 060a8802073..5444445ac38 100644 --- a/plugins/amazonq/shared/jetbrains-community/src-243+/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompatImpl.kt +++ b/plugins/amazonq/shared/jetbrains-community/src-243+/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompatImpl.kt @@ -14,8 +14,6 @@ internal class FileChooserCompatImpl : FileChooserCompat { override fun applyExtensionFilter( descriptor: FileChooserDescriptor, filterName: String, - allowedExtensions: Set - ): FileChooserDescriptor { - return descriptor.withExtensionFilter(filterName, *allowedExtensions.toTypedArray()) - } -} \ No newline at end of file + allowedExtensions: Set, + ): FileChooserDescriptor = descriptor.withExtensionFilter(filterName, *allowedExtensions.toTypedArray()) +} diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompat.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompat.kt index 41cfb49b73f..5ab34953495 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompat.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompat.kt @@ -7,14 +7,14 @@ import com.intellij.openapi.fileChooser.FileChooserDescriptor /** * Compatibility interface for handling file chooser extension filtering across different IntelliJ Platform versions. - * + * * The withExtensionFilter method was introduced in IntelliJ Platform 2024.3 (baseline version 243). * For older versions, fall back to withFileFilter which provides similar functionality */ interface FileChooserCompat { /** * Applies file extension filtering to the given FileChooserDescriptor. - * + * * @param descriptor The FileChooserDescriptor to apply filtering to * @param filterName The display name for the filter (e.g., "Images") * @param allowedExtensions Set of allowed file extensions (e.g., "jpg", "png") @@ -23,7 +23,7 @@ interface FileChooserCompat { fun applyExtensionFilter( descriptor: FileChooserDescriptor, filterName: String, - allowedExtensions: Set + allowedExtensions: Set, ): FileChooserDescriptor companion object { From 4578b57f0c03e6ec5df123bf4359d4e3b8cc00ac Mon Sep 17 00:00:00 2001 From: Yang Zhang Date: Fri, 25 Jul 2025 16:03:01 -0700 Subject: [PATCH 6/7] fix(amazonq): remove interface and rename --- .../amazonq/lsp/util/FileChooserCompatImpl.kt | 26 --------------- .../amazonq/lsp/util/FileChooserFilters.kt | 29 +++++++++++++++++ .../amazonq/lsp/util/FileChooserCompatImpl.kt | 19 ----------- .../amazonq/lsp/util/FileChooserFilters.kt | 22 +++++++++++++ .../amazonq/lsp/AmazonQLanguageClientImpl.kt | 5 ++- .../amazonq/lsp/util/FileChooserCompat.kt | 32 ------------------- 6 files changed, 53 insertions(+), 80 deletions(-) delete mode 100644 plugins/amazonq/shared/jetbrains-community/src-242/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompatImpl.kt create mode 100644 plugins/amazonq/shared/jetbrains-community/src-242/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserFilters.kt delete mode 100644 plugins/amazonq/shared/jetbrains-community/src-243+/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompatImpl.kt create mode 100644 plugins/amazonq/shared/jetbrains-community/src-243+/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserFilters.kt delete mode 100644 plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompat.kt diff --git a/plugins/amazonq/shared/jetbrains-community/src-242/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompatImpl.kt b/plugins/amazonq/shared/jetbrains-community/src-242/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompatImpl.kt deleted file mode 100644 index 3132b06a0c9..00000000000 --- a/plugins/amazonq/shared/jetbrains-community/src-242/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompatImpl.kt +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package software.aws.toolkits.jetbrains.services.amazonq.lsp.util - -import com.intellij.openapi.fileChooser.FileChooserDescriptor - -/** - * FileChooserCompat implementation for IntelliJ Platform versions before 2024.3 (baseline < 243). - * Uses withFileFilter method which provides filtering functionality but doesn't visually filter - * files in the chooser dialog. - */ -internal class FileChooserCompatImpl : FileChooserCompat { - override fun applyExtensionFilter( - descriptor: FileChooserDescriptor, - filterName: String, - allowedExtensions: Set, - ): FileChooserDescriptor = descriptor.withFileFilter { virtualFile -> - if (virtualFile.isDirectory) { - true // Always allow directories for navigation - } else { - val extension = virtualFile.extension?.lowercase() - extension != null && allowedExtensions.contains(extension) - } - } -} diff --git a/plugins/amazonq/shared/jetbrains-community/src-242/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserFilters.kt b/plugins/amazonq/shared/jetbrains-community/src-242/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserFilters.kt new file mode 100644 index 00000000000..e479f8ab783 --- /dev/null +++ b/plugins/amazonq/shared/jetbrains-community/src-242/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserFilters.kt @@ -0,0 +1,29 @@ +// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.jetbrains.services.amazonq.lsp.util + +import com.intellij.openapi.fileChooser.FileChooserDescriptor + +/** + * Applies file extension filtering to the given FileChooserDescriptor for IntelliJ Platform versions before 2024.3 (baseline < 243). + * Uses withFileFilter method which provides filtering functionality but doesn't visually filter + * files in the chooser dialog. + * + * @param descriptor The FileChooserDescriptor to apply filtering to + * @param filterName The display name for the filter (e.g., "Images") + * @param allowedExtensions Set of allowed file extensions (e.g., "jpg", "png") + * @return The modified FileChooserDescriptor + */ +fun applyExtensionFilter( + descriptor: FileChooserDescriptor, + filterName: String, + allowedExtensions: Set, +): FileChooserDescriptor = descriptor.withFileFilter { virtualFile -> + if (virtualFile.isDirectory) { + true // Always allow directories for navigation + } else { + val extension = virtualFile.extension?.lowercase() + extension != null && allowedExtensions.contains(extension) + } +} diff --git a/plugins/amazonq/shared/jetbrains-community/src-243+/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompatImpl.kt b/plugins/amazonq/shared/jetbrains-community/src-243+/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompatImpl.kt deleted file mode 100644 index 5444445ac38..00000000000 --- a/plugins/amazonq/shared/jetbrains-community/src-243+/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompatImpl.kt +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package software.aws.toolkits.jetbrains.services.amazonq.lsp.util - -import com.intellij.openapi.fileChooser.FileChooserDescriptor - -/** - * FileChooserCompat implementation for IntelliJ Platform versions 2024.3+ (baseline >= 243). - * Uses withExtensionFilter method which provides both filtering functionality and visual - * filtering in the chooser dialog. - */ -internal class FileChooserCompatImpl : FileChooserCompat { - override fun applyExtensionFilter( - descriptor: FileChooserDescriptor, - filterName: String, - allowedExtensions: Set, - ): FileChooserDescriptor = descriptor.withExtensionFilter(filterName, *allowedExtensions.toTypedArray()) -} diff --git a/plugins/amazonq/shared/jetbrains-community/src-243+/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserFilters.kt b/plugins/amazonq/shared/jetbrains-community/src-243+/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserFilters.kt new file mode 100644 index 00000000000..bf60e987ebc --- /dev/null +++ b/plugins/amazonq/shared/jetbrains-community/src-243+/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserFilters.kt @@ -0,0 +1,22 @@ +// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.jetbrains.services.amazonq.lsp.util + +import com.intellij.openapi.fileChooser.FileChooserDescriptor + +/** + * Applies file extension filtering to the given FileChooserDescriptor for IntelliJ Platform versions 2024.3+ (baseline >= 243). + * Uses withExtensionFilter method which provides both filtering functionality and visual + * filtering in the chooser dialog. + * + * @param descriptor The FileChooserDescriptor to apply filtering to + * @param filterName The display name for the filter (e.g., "Images") + * @param allowedExtensions Set of allowed file extensions (e.g., "jpg", "png") + * @return The modified FileChooserDescriptor + */ +fun applyExtensionFilter( + descriptor: FileChooserDescriptor, + filterName: String, + allowedExtensions: Set, +): FileChooserDescriptor = descriptor.withExtensionFilter(filterName, *allowedExtensions.toTypedArray()) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt index 0e9c61157bc..edf5bc840b3 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt @@ -64,7 +64,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowO import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowSaveFileDialogParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowSaveFileDialogResult import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.ConnectionMetadata -import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.FileChooserCompat +import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.applyExtensionFilter import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.LspEditorUtil import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.TelemetryParsingUtil import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator @@ -312,8 +312,7 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC if (params.filters.isNotEmpty() && !params.canSelectFolders) { // Create a combined list of all allowed extensions val allowedExtensions = params.filters.values.flatten().toSet() - val fileChooserCompat = FileChooserCompat.getInstance() - fileChooserCompat.applyExtensionFilter(this, "Images", allowedExtensions) + applyExtensionFilter(this, "Images", allowedExtensions) } } diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompat.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompat.kt deleted file mode 100644 index 5ab34953495..00000000000 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserCompat.kt +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package software.aws.toolkits.jetbrains.services.amazonq.lsp.util - -import com.intellij.openapi.fileChooser.FileChooserDescriptor - -/** - * Compatibility interface for handling file chooser extension filtering across different IntelliJ Platform versions. - * - * The withExtensionFilter method was introduced in IntelliJ Platform 2024.3 (baseline version 243). - * For older versions, fall back to withFileFilter which provides similar functionality - */ -interface FileChooserCompat { - /** - * Applies file extension filtering to the given FileChooserDescriptor. - * - * @param descriptor The FileChooserDescriptor to apply filtering to - * @param filterName The display name for the filter (e.g., "Images") - * @param allowedExtensions Set of allowed file extensions (e.g., "jpg", "png") - * @return The modified FileChooserDescriptor - */ - fun applyExtensionFilter( - descriptor: FileChooserDescriptor, - filterName: String, - allowedExtensions: Set, - ): FileChooserDescriptor - - companion object { - fun getInstance(): FileChooserCompat = FileChooserCompatImpl() - } -} From c747a68528314413c4d460dd6749eb783e50a7a2 Mon Sep 17 00:00:00 2001 From: Yang Zhang Date: Fri, 25 Jul 2025 16:13:22 -0700 Subject: [PATCH 7/7] fix(amazonq): detekt --- .../jetbrains/services/amazonq/lsp/util/FileChooserFilters.kt | 4 ++-- .../services/amazonq/lsp/AmazonQLanguageClientImpl.kt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/amazonq/shared/jetbrains-community/src-242/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserFilters.kt b/plugins/amazonq/shared/jetbrains-community/src-242/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserFilters.kt index e479f8ab783..ea9e6a355ce 100644 --- a/plugins/amazonq/shared/jetbrains-community/src-242/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserFilters.kt +++ b/plugins/amazonq/shared/jetbrains-community/src-242/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileChooserFilters.kt @@ -11,13 +11,13 @@ import com.intellij.openapi.fileChooser.FileChooserDescriptor * files in the chooser dialog. * * @param descriptor The FileChooserDescriptor to apply filtering to - * @param filterName The display name for the filter (e.g., "Images") + * @param filterName The display name for the filter (e.g., "Images") - unused in this version * @param allowedExtensions Set of allowed file extensions (e.g., "jpg", "png") * @return The modified FileChooserDescriptor */ fun applyExtensionFilter( descriptor: FileChooserDescriptor, - filterName: String, + @Suppress("UNUSED_PARAMETER") filterName: String, allowedExtensions: Set, ): FileChooserDescriptor = descriptor.withFileFilter { virtualFile -> if (virtualFile.isDirectory) { diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt index edf5bc840b3..47d490cb93d 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt @@ -64,9 +64,9 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowO import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowSaveFileDialogParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowSaveFileDialogResult import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.ConnectionMetadata -import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.applyExtensionFilter import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.LspEditorUtil import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.TelemetryParsingUtil +import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.applyExtensionFilter import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator import software.aws.toolkits.jetbrains.services.telemetry.TelemetryService import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings