Skip to content

Commit ec50363

Browse files
committed
Merge remote-tracking branch 'origin/feature/q-lsp-chat' into HEAD
2 parents 5ae53fb + f6c58f5 commit ec50363

File tree

17 files changed

+173
-56
lines changed

17 files changed

+173
-56
lines changed

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/QRefreshPanelAction.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import com.intellij.openapi.project.DumbAwareAction
1111
import com.intellij.util.messages.Topic
1212
import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AmazonQToolWindow
1313
import software.aws.toolkits.resources.AmazonQBundle
14-
import software.aws.toolkits.resources.message
1514
import java.util.EventListener
1615

1716
class QRefreshPanelAction : DumbAwareAction(AmazonQBundle.message("amazonq.refresh.panel"), null, AllIcons.Actions.Refresh) {

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindow.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ class AmazonQToolWindow private constructor(
2424

2525
val component
2626
get() = chatPanel.component
27-
2827
fun disposeAndRecreate() {
2928
Disposer.dispose(chatPanel)
3029
chatPanel = AmazonQPanel(project, scope)

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
6666
ToolkitConnectionManager.getInstance(project).activeConnectionForFeature(QConnection.getInstance())?.let { qConn ->
6767
openMeetQPage(project)
6868
}
69-
prepareChatContent(project, qPanel)
69+
preparePanelContent(project, qPanel)
7070
}
7171
}
7272
)
@@ -75,7 +75,7 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
7575
RefreshQChatPanelButtonPressedListener.TOPIC,
7676
object : RefreshQChatPanelButtonPressedListener {
7777
override fun onRefresh() {
78-
prepareChatContent(project, qPanel)
78+
preparePanelContent(project, qPanel)
7979
}
8080
}
8181
)
@@ -85,8 +85,7 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
8585
object : BearerTokenProviderListener {
8686
override fun onChange(providerId: String, newScopes: List<String>?) {
8787
if (ToolkitConnectionManager.getInstance(project).connectionStateForFeature(QConnection.getInstance()) == BearerTokenAuthState.AUTHORIZED) {
88-
AmazonQToolWindow.getInstance(project).disposeAndRecreate()
89-
prepareChatContent(project, qPanel)
88+
preparePanelContent(project, qPanel)
9089
}
9190
}
9291
}
@@ -98,13 +97,12 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
9897
// note we name myProject intentionally ow it will shadow the "project" provided by the IDE
9998
override fun onProfileSelected(myProject: Project, profile: QRegionProfile?) {
10099
if (project.isDisposed) return
101-
AmazonQToolWindow.getInstance(project).disposeAndRecreate()
102-
prepareChatContent(project, qPanel)
100+
preparePanelContent(project, qPanel)
103101
}
104102
}
105103
)
106104

107-
prepareChatContent(project, qPanel)
105+
preparePanelContent(project, qPanel)
108106

109107
val content = contentManager.factory.createContent(mainPanel, null, false).also {
110108
it.isCloseable = true
@@ -114,7 +112,7 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
114112
contentManager.addContent(content)
115113
}
116114

117-
private fun prepareChatContent(
115+
private fun preparePanelContent(
118116
project: Project,
119117
qPanel: Wrapper,
120118
) {

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/ActionRegistrar.kt

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ import kotlinx.coroutines.flow.asSharedFlow
1111
import kotlinx.coroutines.runBlocking
1212
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AsyncChatUiListener
1313
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.FlareUiMessage
14+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GENERIC_COMMAND
1415
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GenericCommandParams
16+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_TO_PROMPT
1517
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SendToPromptParams
1618
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TriggerType
1719
import software.aws.toolkits.jetbrains.services.amazonq.messages.AmazonQMessage
@@ -36,23 +38,19 @@ class ActionRegistrar {
3638
val fileContext = contextExtractor.extractContextForTrigger(ExtractionTriggerType.ContextMenu)
3739
val codeSelection = "\n```\n${fileContext.focusAreaContext?.codeSelection?.trimIndent()?.trim()}\n```\n"
3840
var uiMessage: FlareUiMessage? = null
39-
if (command.verb != "sendToPrompt") {
41+
if (command.verb != SEND_TO_PROMPT) {
4042
val params = GenericCommandParams(selection = codeSelection, triggerType = TriggerType.CONTEXT_MENU, genericCommand = command.name)
41-
uiMessage = FlareUiMessage(command = "genericCommand", params = params)
43+
uiMessage = FlareUiMessage(command = GENERIC_COMMAND, params = params)
4244
} else {
4345
val params = SendToPromptParams(selection = codeSelection, triggerType = TriggerType.CONTEXT_MENU)
44-
uiMessage = FlareUiMessage(command = "sendToPrompt", params = params)
46+
uiMessage = FlareUiMessage(command = SEND_TO_PROMPT, params = params)
4547
}
4648
AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage)
4749
}
4850
}
4951
}
5052
}
5153

52-
fun reportMessageClick(command: EditorContextCommand, issue: MutableMap<String, String>, project: Project) {
53-
_messages.tryEmit(CodeScanIssueActionMessage(command, issue, project))
54-
}
55-
5654
// provide singleton access
5755
companion object {
5856
val instance = ActionRegistrar()

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/codescan/actions/CodeScanQActions.kt

Lines changed: 0 additions & 25 deletions
This file was deleted.

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/codescan/actions/ExplainCodeIssueAction.kt

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,55 @@
33

44
package software.aws.toolkits.jetbrains.services.cwc.commands.codescan.actions
55

6-
import software.aws.toolkits.jetbrains.services.cwc.commands.EditorContextCommand
6+
import com.intellij.openapi.actionSystem.ActionManager
7+
import com.intellij.openapi.actionSystem.AnAction
8+
import com.intellij.openapi.actionSystem.AnActionEvent
9+
import com.intellij.openapi.actionSystem.DataKey
10+
import com.intellij.openapi.application.ApplicationManager
11+
import com.intellij.openapi.project.DumbAware
12+
import kotlinx.coroutines.runBlocking
13+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AsyncChatUiListener
14+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.FlareUiMessage
15+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatPrompt
16+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_TO_PROMPT
17+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SendToPromptParams
18+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TriggerType
719

8-
class ExplainCodeIssueAction : CodeScanQActions(EditorContextCommand.ExplainCodeScanIssue)
20+
class ExplainCodeIssueAction : AnAction(), DumbAware {
21+
override fun actionPerformed(e: AnActionEvent) {
22+
val issueDataKey = DataKey.create<MutableMap<String, String>>("amazonq.codescan.explainissue")
23+
val issueContext = e.getData(issueDataKey) ?: return
24+
25+
ActionManager.getInstance().getAction("q.openchat").actionPerformed(e)
26+
27+
ApplicationManager.getApplication().executeOnPooledThread {
28+
runBlocking {
29+
// https://github.com/aws/aws-toolkit-vscode/blob/master/packages/amazonq/src/lsp/chat/commands.ts#L30
30+
val codeSelection = "\n```\n${issueContext["code"]?.trimIndent()?.trim()}\n```\n"
31+
32+
val prompt = "Explain the issue \n\n " +
33+
"Issue: \"${issueContext["title"]}\" \n" +
34+
"Code: $codeSelection"
35+
36+
val modelPrompt = "Explain the issue ${issueContext["title"]} \n\n " +
37+
"Issue: \"${issueContext["title"]}\" \n" +
38+
"Description: ${issueContext["description"]} \n" +
39+
"Code: $codeSelection and generate the code demonstrating the fix"
40+
41+
val params = SendToPromptParams(
42+
selection = codeSelection,
43+
triggerType = TriggerType.CONTEXT_MENU,
44+
prompt = ChatPrompt(
45+
prompt = prompt,
46+
escapedPrompt = modelPrompt,
47+
command = null
48+
),
49+
autoSubmit = true
50+
)
51+
52+
val uiMessage = FlareUiMessage(SEND_TO_PROMPT, params)
53+
AsyncChatUiListener.notifyPartialMessageUpdate(uiMessage)
54+
}
55+
}
56+
}
57+
}

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/editor/CodeWhispererEditorUtil.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ object CodeWhispererEditorUtil {
3232
val fileName = getFileName(psiFile)
3333
val programmingLanguage = psiFile.programmingLanguage()
3434
val fileRelativePath = getRelativePathToContentRoot(editor)
35-
return FileContextInfo(caretContext, fileName, programmingLanguage, fileRelativePath)
35+
val fileUri = getFileUri(psiFile)
36+
return FileContextInfo(caretContext, fileName, programmingLanguage, fileRelativePath, fileUri)
3637
}
3738

3839
fun extractCaretContext(editor: Editor): CaretContext {
@@ -73,6 +74,11 @@ object CodeWhispererEditorUtil {
7374
private fun getFileName(psiFile: PsiFile): String =
7475
psiFile.name.substring(0, psiFile.name.length.coerceAtMost(CodeWhispererConstants.FILENAME_CHARS_LIMIT))
7576

77+
private fun getFileUri(psiFile: PsiFile): String? =
78+
psiFile.virtualFile?.takeIf { it.isValid }?.let { vFile ->
79+
vFile.url.substring(0, vFile.url.length.coerceAtMost(CodeWhispererConstants.FILENAME_CHARS_LIMIT))
80+
}
81+
7682
fun getRelativePathToContentRoot(editor: Editor): String? =
7783
editor.project?.let { project ->
7884
FileDocumentManager.getInstance().getFile(editor.document)?.let { vFile ->

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/model/CodeWhispererModel.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ data class FileContextInfo(
4747
val filename: String,
4848
val programmingLanguage: CodeWhispererProgrammingLanguage,
4949
val fileRelativePath: String?,
50+
val fileUri: String?,
5051
)
5152

5253
data class RecommendationContext(

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ class CodeWhispererServiceTest : CodeWhispererTestBase() {
7474
CaretContext(leftFileContext = "", rightFileContext = "public class Main {}", leftContextOnCurrentLine = ""),
7575
"main.java",
7676
CodeWhispererJava.INSTANCE,
77-
"main.java"
77+
"main.java",
78+
file.virtualFile.url
7879
)
7980
)
8081
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ fun aFileContextInfo(language: CodeWhispererProgrammingLanguage? = null): FileCo
127127
CodeWhispererJava.INSTANCE
128128
).random()
129129

130-
return FileContextInfo(caretContextInfo, fileName, programmingLanguage, fileRelativePath)
130+
return FileContextInfo(caretContextInfo, fileName, programmingLanguage, fileRelativePath, null)
131131
}
132132

133133
fun aTriggerType(): CodewhispererTriggerType =

0 commit comments

Comments
 (0)