Skip to content

Commit 46a24b1

Browse files
authored
Merge branch 'main' into rli/delete-awscaps-provider
2 parents 8d3f137 + 3467e45 commit 46a24b1

File tree

6 files changed

+65
-18
lines changed

6 files changed

+65
-18
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "bugfix",
3+
"description" : "Fix UriError when project is on WSL or a UNC path"
4+
}

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/settings/CodeWhispererConfigurable.kt

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,12 @@ import com.intellij.util.concurrency.EdtExecutorService
2525
import com.intellij.util.execution.ParametersListUtil
2626
import kotlinx.coroutines.launch
2727
import org.eclipse.lsp4j.DidChangeConfigurationParams
28+
import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
2829
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnection
30+
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
2931
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManagerListener
32+
import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
33+
import software.aws.toolkits.jetbrains.core.credentials.sono.isInternalUser
3034
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
3135
import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererLoginType
3236
import software.aws.toolkits.jetbrains.services.codewhisperer.explorer.CodeWhispererExplorerActionManager
@@ -47,6 +51,12 @@ class CodeWhispererConfigurable(private val project: Project) :
4751
private val isSso: Boolean
4852
get() = CodeWhispererExplorerActionManager.getInstance().checkActiveCodeWhispererConnectionType(project) == CodeWhispererLoginType.SSO
4953

54+
private val isInternalUser: Boolean
55+
get() {
56+
val conn = ToolkitConnectionManager.getInstance(project).activeConnectionForFeature(QConnection.getInstance()) as? AwsBearerTokenConnection
57+
return conn?.let { isInternalUser(it.startUrl) } ?: false
58+
}
59+
5060
override fun getId() = "aws.codewhisperer"
5161

5262
override fun createPanel() = panel {
@@ -123,6 +133,21 @@ class CodeWhispererConfigurable(private val project: Project) :
123133
}.enabled(false)
124134
}
125135
}
136+
137+
row {
138+
checkBox(message("aws.settings.codewhisperer.workspace_context")).apply {
139+
connect.subscribe(
140+
ToolkitConnectionManagerListener.TOPIC,
141+
object : ToolkitConnectionManagerListener {
142+
override fun activeConnectionChanged(newConnection: ToolkitConnection?) {
143+
enabled(isCodeWhispererEnabled(project))
144+
}
145+
}
146+
)
147+
enabled(invoke)
148+
bindSelected(codeWhispererSettings::isWorkspaceContextEnabled, codeWhispererSettings::toggleWorkspaceContextEnabled)
149+
}.comment(message("aws.settings.codewhisperer.workspace_context.tooltip"))
150+
}.visible(isInternalUser)
126151
}
127152

128153
group(message("aws.settings.codewhisperer.group.inline_suggestions")) {
@@ -158,20 +183,6 @@ class CodeWhispererConfigurable(private val project: Project) :
158183
}
159184

160185
group(message("aws.settings.codewhisperer.group.q_chat")) {
161-
row {
162-
checkBox(message("aws.settings.codewhisperer.workspace_context")).apply {
163-
connect.subscribe(
164-
ToolkitConnectionManagerListener.TOPIC,
165-
object : ToolkitConnectionManagerListener {
166-
override fun activeConnectionChanged(newConnection: ToolkitConnection?) {
167-
enabled(isCodeWhispererEnabled(project))
168-
}
169-
}
170-
)
171-
enabled(invoke)
172-
bindSelected(codeWhispererSettings::isWorkspaceContextEnabled, codeWhispererSettings::toggleWorkspaceContextEnabled)
173-
}.comment(message("aws.settings.codewhisperer.workspace_context.tooltip"))
174-
}.visible(false)
175186
row {
176187
checkBox(message("aws.settings.codewhisperer.project_context")).apply {
177188
connect.subscribe(

plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererConfigurableTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class CodeWhispererConfigurableTest : CodeWhispererTestBase() {
4040
message("aws.settings.codewhisperer.include_code_with_reference"),
4141
message("aws.settings.codewhisperer.configurable.opt_out.title"),
4242
message("aws.settings.codewhisperer.automatic_import_adder"),
43-
"Workspace context",
43+
"Server-side context",
4444
message("aws.settings.codewhisperer.project_context"),
4545
message("aws.settings.codewhisperer.project_context_gpu")
4646
)

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/LspEditorUtil.kt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,25 @@ object LspEditorUtil {
4747
private fun toUri(file: File): URI {
4848
try {
4949
// URI scheme specified by language server protocol
50-
return URI("file", "", file.absoluteFile.toURI().path, null)
50+
val uri = URI("file", "", file.absoluteFile.toURI().path, null)
51+
val fallback = file.toPath().toAbsolutePath().normalize().toUri()
52+
return if (uri.isCompliant()) uri else fallback
5153
} catch (e: URISyntaxException) {
5254
LOG.warn { "${e.localizedMessage}: $e" }
5355
return file.absoluteFile.toURI()
5456
}
5557
}
5658

59+
private fun URI.isCompliant(): Boolean {
60+
if (!"file".equals(this.scheme, ignoreCase = true)) return true
61+
62+
val path = this.rawPath ?: this.path.orEmpty()
63+
val noAuthority = this.authority.isNullOrEmpty()
64+
65+
// If the authority component is empty, the path cannot begin with two slash characters ("//")
66+
return !(noAuthority && path.startsWith("//"))
67+
}
68+
5769
/**
5870
* Works but is divergent from [FocusAreaContextExtrator]
5971
*/

plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileUriUtilTest.kt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import io.mockk.every
88
import io.mockk.mockk
99
import org.assertj.core.api.Assertions.assertThat
1010
import org.junit.jupiter.api.Test
11+
import org.junit.jupiter.api.condition.EnabledOnOs
12+
import org.junit.jupiter.api.condition.OS
1113
import org.junit.jupiter.api.extension.ExtendWith
1214

1315
@ExtendWith(ApplicationExtension::class)
@@ -96,6 +98,24 @@ class FileUriUtilTest {
9698
}
9799
}
98100

101+
@Test
102+
@EnabledOnOs(OS.WINDOWS)
103+
fun `test wsl-like path`() {
104+
val virtualFile = createMockVirtualFile("//wsl.localhost/Ubuntu/home/user/file.sh")
105+
val result = LspEditorUtil.toUriString(virtualFile)
106+
val expected = normalizeFileUri("file://wsl.localhost/Ubuntu/home/user/file.sh")
107+
assertThat(result).isEqualTo(expected)
108+
}
109+
110+
@Test
111+
@EnabledOnOs(OS.WINDOWS)
112+
fun `test UNC path`() {
113+
val virtualFile = createMockVirtualFile("//server/share/path/to/file.txt")
114+
val result = LspEditorUtil.toUriString(virtualFile)
115+
val expected = normalizeFileUri("file://server/share/path/to/file.txt")
116+
assertThat(result).isEqualTo(expected)
117+
}
118+
99119
@Test
100120
fun `test jar protocol conversion`() {
101121
val virtualFile = createMockVirtualFile(

plugins/core/resources/resources/software/aws/toolkits/resources/MessagesBundle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,8 +301,8 @@ aws.settings.codewhisperer.project_context_index_max_size.tooltip=The maximum si
301301
aws.settings.codewhisperer.project_context_index_thread=Workspace index worker threads
302302
aws.settings.codewhisperer.project_context_index_thread.tooltip=Number of worker threads of Amazon Q local index process. Set to 0 to use system default worker threads for balanced performance. Please restart or reload IntelliJ after changing worker threads.
303303
aws.settings.codewhisperer.warning=To use Amazon Q, login with AWS Builder ID or AWS IAM Identity Center.
304-
aws.settings.codewhisperer.workspace_context=Workspace context
305-
aws.settings.codewhisperer.workspace_context.tooltip=When checked, Amazon Q will enable server side project context.
304+
aws.settings.codewhisperer.workspace_context=Server-side context
305+
aws.settings.codewhisperer.workspace_context.tooltip=Index project files on the server and use as context for higher-quality responses. This feature will activate only if your administrator has opted you in.
306306
aws.settings.dynamic_resources_configurable.clear_all=Clear All
307307
aws.settings.dynamic_resources_configurable.select_all=Select All
308308
aws.settings.dynamic_resources_configurable.suggest_types.dialog.message=Please suggest additional AWS resource types (e.g. AWS::S3::Bucket)\nyou would like to see supported in future releases.\n\n(max length: 2000 chars)

0 commit comments

Comments
 (0)