Skip to content

Commit 63a3076

Browse files
authored
[CodeWhisperer] Make CodeWhispererEnterHandler override EnterHandler (#3251)
1. Currently it's overriding EditorActionHandler which doesn't have access to the indents the EnterHandler makes afterwards, so override the EnterHandler class.
1 parent c45b8d4 commit 63a3076

File tree

3 files changed

+42
-17
lines changed

3 files changed

+42
-17
lines changed

jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/editor/CodeWhispererEnterHandler.kt

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
package software.aws.toolkits.jetbrains.services.codewhisperer.editor
55

6+
import com.intellij.codeInsight.editorActions.EnterHandler
67
import com.intellij.openapi.actionSystem.DataContext
78
import com.intellij.openapi.editor.Caret
89
import com.intellij.openapi.editor.Editor
@@ -11,19 +12,11 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispe
1112
import software.aws.toolkits.telemetry.CodewhispererAutomatedTriggerType
1213
import software.aws.toolkits.telemetry.CodewhispererTriggerType
1314

14-
class CodeWhispererEnterHandler(private val originalHandler: EditorActionHandler) :
15-
EditorActionHandler(),
15+
class CodeWhispererEnterHandler(originalHandler: EditorActionHandler) :
16+
EnterHandler(originalHandler),
1617
CodeWhispererAutoTriggerHandler {
17-
override fun isEnabledForCaret(editor: Editor, caret: Caret, dataContext: DataContext?) =
18-
originalHandler.isEnabled(editor, caret, dataContext)
19-
20-
override fun executeInCommand(editor: Editor, dataContext: DataContext?) =
21-
originalHandler.executeInCommand(editor, dataContext)
22-
23-
override fun doExecute(editor: Editor, caret: Caret?, dataContext: DataContext?) {
24-
if (originalHandler.isEnabled(editor, caret, dataContext)) {
25-
originalHandler.execute(editor, caret, dataContext)
26-
}
18+
override fun executeWriteAction(editor: Editor, caret: Caret?, dataContext: DataContext?) {
19+
super.executeWriteAction(editor, caret, dataContext)
2720
if (!CodeWhispererService.getInstance().canDoInvocation(editor, CodewhispererTriggerType.AutoTrigger)) {
2821
return
2922
}

jetbrains-core/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererTestBase.kt

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ open class CodeWhispererTestBase {
122122
editorManager = CodeWhispererEditorManager.getInstance()
123123
settingsManager = CodeWhispererSettings.getInstance()
124124

125-
projectRule.fixture.configureByText(pythonFileName, pythonTestLeftContext)
125+
setPrompt(pythonFileName, pythonTestLeftContext)
126126

127127
originalExplorerActionState = stateManager.state
128128
originalSettings = settingsManager.state
@@ -139,10 +139,6 @@ open class CodeWhispererTestBase {
139139
value[CodeWhispererConfigurationType.IsIncludeCodeWithReference] = true
140140
}
141141
)
142-
143-
runInEdtAndWait {
144-
projectRule.fixture.editor.caretModel.primaryCaret.moveToOffset(projectRule.fixture.editor.document.textLength)
145-
}
146142
}
147143

148144
@After
@@ -181,4 +177,11 @@ open class CodeWhispererTestBase {
181177
val expected = message("codewhisperer.popup.recommendation_info", selected, total, POPUP_DIM_HEX)
182178
assertThat(actual).isEqualTo(expected)
183179
}
180+
181+
fun setPrompt(filename: String, prompt: String) {
182+
projectRule.fixture.configureByText(filename, prompt)
183+
runInEdtAndWait {
184+
projectRule.fixture.editor.caretModel.primaryCaret.moveToOffset(projectRule.fixture.editor.document.textLength)
185+
}
186+
}
184187
}

jetbrains-core/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererUserActionsTest.kt

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,18 @@ import com.intellij.openapi.actionSystem.IdeActions.ACTION_EDITOR_SELECT_WORD_AT
1313
import com.intellij.openapi.actionSystem.IdeActions.ACTION_EDITOR_TEXT_END_WITH_SELECTION
1414
import com.intellij.openapi.actionSystem.IdeActions.ACTION_EDITOR_TEXT_START_WITH_SELECTION
1515
import com.intellij.openapi.command.WriteCommandAction
16+
import com.intellij.openapi.ui.popup.JBPopup
1617
import com.intellij.testFramework.runInEdtAndWait
1718
import org.junit.Before
1819
import org.junit.Test
1920
import org.mockito.kotlin.any
21+
import org.mockito.kotlin.argumentCaptor
2022
import org.mockito.kotlin.timeout
23+
import org.mockito.kotlin.times
2124
import org.mockito.kotlin.verify
25+
import software.aws.toolkits.jetbrains.services.codewhisperer.CodeWhispererTestUtil.pythonFileName
2226
import software.aws.toolkits.jetbrains.services.codewhisperer.CodeWhispererTestUtil.pythonTestLeftContext
27+
import software.aws.toolkits.jetbrains.services.codewhisperer.explorer.CodeWhispererExplorerActionManager
2328

2429
class CodeWhispererUserActionsTest : CodeWhispererTestBase() {
2530

@@ -86,4 +91,28 @@ class CodeWhispererUserActionsTest : CodeWhispererTestBase() {
8691
}
8792
}
8893
}
94+
95+
@Test
96+
fun `test hitting enter after non-whitespace characters should trigger CodeWhisperer`() {
97+
testHittingEnterAfterWhitespaceCharsShouldTriggerCodeWhisperer(pythonTestLeftContext, 1)
98+
}
99+
100+
@Test
101+
fun `test hitting enter after whitespace characters should trigger CodeWhisperer`() {
102+
testHittingEnterAfterWhitespaceCharsShouldTriggerCodeWhisperer("$pythonTestLeftContext ", 1)
103+
testHittingEnterAfterWhitespaceCharsShouldTriggerCodeWhisperer("$pythonTestLeftContext\t", 2)
104+
testHittingEnterAfterWhitespaceCharsShouldTriggerCodeWhisperer("$pythonTestLeftContext\n", 3)
105+
}
106+
107+
private fun testHittingEnterAfterWhitespaceCharsShouldTriggerCodeWhisperer(prompt: String, times: Int) {
108+
CodeWhispererExplorerActionManager.getInstance().setAutoEnabled(true)
109+
setPrompt(pythonFileName, prompt)
110+
projectRule.fixture.type('\n')
111+
val popupCaptor = argumentCaptor<JBPopup>()
112+
verify(popupManagerSpy, timeout(5000).atLeast(times))
113+
.showPopup(any(), any(), any(), any(), any(), popupCaptor.capture(), any(), any())
114+
runInEdtAndWait {
115+
popupManagerSpy.closePopup(popupCaptor.lastValue)
116+
}
117+
}
89118
}

0 commit comments

Comments
 (0)