Skip to content

Commit 40e0f96

Browse files
committed
remvoe IDE auto trigger logic
1 parent 30a13fa commit 40e0f96

File tree

6 files changed

+5
-261
lines changed

6 files changed

+5
-261
lines changed

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

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -95,17 +95,6 @@ object CodeWhispererEditorUtil {
9595
)
9696
}
9797

98-
fun shouldSkipInvokingBasedOnRightContext(editor: Editor): Boolean {
99-
val caretContext = runReadAction { extractCaretContext(editor) }
100-
val rightContextLines = caretContext.rightFileContext.split(Regex("\r?\n"))
101-
val rightContextCurrentLine = if (rightContextLines.isEmpty()) "" else rightContextLines[0]
102-
103-
return rightContextCurrentLine.isNotEmpty() &&
104-
!rightContextCurrentLine.startsWith(" ") &&
105-
rightContextCurrentLine.trim() != ("}") &&
106-
rightContextCurrentLine.trim() != (")")
107-
}
108-
10998
/**
11099
* Check if left context contains keywords or file name follow config json file naming pattern
111100
*/

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

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import com.intellij.openapi.actionSystem.DataContext
88
import com.intellij.openapi.editor.Caret
99
import com.intellij.openapi.editor.Editor
1010
import com.intellij.openapi.editor.actionSystem.EditorActionHandler
11-
import software.aws.toolkits.jetbrains.services.codewhisperer.editor.CodeWhispererEditorUtil.shouldSkipInvokingBasedOnRightContext
1211
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererAutoTriggerService
1312
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererAutomatedTriggerType
1413
import software.aws.toolkits.jetbrains.utils.pluginAwareExecuteOnPooledThread
@@ -17,12 +16,8 @@ class CodeWhispererEnterHandler(private val originalHandler: EditorActionHandler
1716
override fun executeWriteAction(editor: Editor, caret: Caret?, dataContext: DataContext?) {
1817
originalHandler.execute(editor, caret, dataContext)
1918

20-
if (shouldSkipInvokingBasedOnRightContext(editor)) {
21-
return
22-
}
23-
2419
pluginAwareExecuteOnPooledThread {
25-
CodeWhispererAutoTriggerService.getInstance().tryInvokeAutoTrigger(editor, CodeWhispererAutomatedTriggerType.Enter())
20+
CodeWhispererAutoTriggerService.getInstance().invoke(editor, CodeWhispererAutomatedTriggerType.Enter())
2621
}
2722
}
2823
}

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

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,19 @@ import com.intellij.codeInsight.editorActions.TypedHandlerDelegate
77
import com.intellij.openapi.editor.Editor
88
import com.intellij.openapi.project.Project
99
import com.intellij.psi.PsiFile
10-
import software.aws.toolkits.jetbrains.services.codewhisperer.editor.CodeWhispererEditorUtil.shouldSkipInvokingBasedOnRightContext
1110
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererAutoTriggerService
1211
import software.aws.toolkits.jetbrains.services.codewhisperer.service.CodeWhispererAutomatedTriggerType
1312
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants
1413

1514
class CodeWhispererTypedHandler : TypedHandlerDelegate() {
1615
override fun charTyped(c: Char, project: Project, editor: Editor, psiFiles: PsiFile): Result {
17-
if (shouldSkipInvokingBasedOnRightContext(editor)) {
18-
return Result.CONTINUE
19-
}
20-
2116
// Special Char
2217
if (CodeWhispererConstants.SPECIAL_CHARACTERS_LIST.contains(c.toString())) {
23-
CodeWhispererAutoTriggerService.getInstance().tryInvokeAutoTrigger(editor, CodeWhispererAutomatedTriggerType.SpecialChar(c))
18+
CodeWhispererAutoTriggerService.getInstance().invoke(editor, CodeWhispererAutomatedTriggerType.SpecialChar(c))
2419
return Result.CONTINUE
2520
}
2621

27-
CodeWhispererAutoTriggerService.getInstance().tryInvokeAutoTrigger(editor, CodeWhispererAutomatedTriggerType.Classifier())
22+
CodeWhispererAutoTriggerService.getInstance().invoke(editor, CodeWhispererAutomatedTriggerType.Classifier())
2823

2924
return Result.CONTINUE
3025
}

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererAutoTriggerService.kt

Lines changed: 1 addition & 235 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ import com.intellij.openapi.application.runReadAction
88
import com.intellij.openapi.components.Service
99
import com.intellij.openapi.components.service
1010
import com.intellij.openapi.editor.Editor
11-
import com.intellij.openapi.fileEditor.FileDocumentManager
12-
import com.intellij.openapi.util.SystemInfo
1311
import com.intellij.util.Alarm
1412
import com.intellij.util.AlarmFactory
1513
import kotlinx.coroutines.Job
@@ -18,20 +16,11 @@ import org.apache.commons.collections4.queue.CircularFifoQueue
1816
import software.aws.toolkits.jetbrains.core.coroutines.EDT
1917
import software.aws.toolkits.jetbrains.core.coroutines.applicationCoroutineScope
2018
import software.aws.toolkits.jetbrains.services.amazonq.CodeWhispererFeatureConfigService
21-
import software.aws.toolkits.jetbrains.services.codewhisperer.editor.CodeWhispererEditorUtil
22-
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererUnknownLanguage
23-
import software.aws.toolkits.jetbrains.services.codewhisperer.language.programmingLanguage
2419
import software.aws.toolkits.jetbrains.services.codewhisperer.model.LatencyContext
25-
import software.aws.toolkits.jetbrains.services.codewhisperer.telemetry.CodeWhispererTelemetryService
26-
import software.aws.toolkits.jetbrains.services.codewhisperer.telemetry.CodeWhispererTelemetryServiceNew
27-
import software.aws.toolkits.telemetry.CodewhispererAutomatedTriggerType
2820
import software.aws.toolkits.telemetry.CodewhispererPreviousSuggestionState
2921
import software.aws.toolkits.telemetry.CodewhispererTriggerType
3022
import java.time.Duration
3123
import java.time.Instant
32-
import kotlin.math.exp
33-
34-
data class ClassifierResult(val shouldTrigger: Boolean, val calculatedResult: Double = 0.0)
3524

3625
@Service
3726
class CodeWhispererAutoTriggerService : CodeWhispererAutoTriggerHandler, Disposable {
@@ -47,38 +36,9 @@ class CodeWhispererAutoTriggerService : CodeWhispererAutoTriggerHandler, Disposa
4736
scheduleReset()
4837
}
4938

50-
fun addPreviousDecision(decision: CodewhispererPreviousSuggestionState) {
51-
previousUserTriggerDecisions.add(decision)
52-
}
53-
54-
// a util wrapper
55-
fun tryInvokeAutoTrigger(editor: Editor, triggerType: CodeWhispererAutomatedTriggerType): Job? {
56-
// only needed for Classifier group, thus calculate it lazily
57-
timeAtLastCharTyped = System.nanoTime()
58-
val classifierResult: ClassifierResult by lazy { shouldTriggerClassifier(editor, triggerType.telemetryType) }
59-
60-
// we need classifier result for any type of triggering for classifier group for supported languages
61-
triggerType.calculationResult = classifierResult.calculatedResult
62-
63-
return when (triggerType) {
64-
// only invoke service if result > threshold for classifier trigger
65-
is CodeWhispererAutomatedTriggerType.Classifier -> run {
66-
if (classifierResult.shouldTrigger) {
67-
invoke(editor, triggerType)
68-
} else {
69-
null
70-
}
71-
}
72-
73-
// invoke whatever the result is for char / enter based trigger
74-
else -> run {
75-
invoke(editor, triggerType)
76-
}
77-
}
78-
}
79-
8039
// real auto trigger logic
8140
fun invoke(editor: Editor, triggerType: CodeWhispererAutomatedTriggerType): Job? {
41+
timeAtLastCharTyped = System.nanoTime()
8242
if (!(
8343
if (CodeWhispererFeatureConfigService.getInstance().getNewAutoTriggerUX()) {
8444
CodeWhispererServiceNew.getInstance().canDoInvocation(editor, CodewhispererTriggerType.AutoTrigger)
@@ -120,203 +80,9 @@ class CodeWhispererAutoTriggerService : CodeWhispererAutoTriggerHandler, Disposa
12080
}
12181
}
12282

123-
fun shouldTriggerClassifier(
124-
editor: Editor,
125-
automatedTriggerType: CodewhispererAutomatedTriggerType = CodewhispererAutomatedTriggerType.Classifier, // TODO: need this?
126-
): ClassifierResult {
127-
val caretContext = runReadAction { CodeWhispererEditorUtil.extractCaretContext(editor) }
128-
val language = runReadAction {
129-
FileDocumentManager.getInstance().getFile(editor.document)?.programmingLanguage()
130-
} ?: CodeWhispererUnknownLanguage.INSTANCE
131-
val caretPosition = runReadAction { CodeWhispererEditorUtil.getCaretPosition(editor) }
132-
133-
val leftContextLines = caretContext.leftFileContext.split(Regex("\r?\n"))
134-
val leftContextLength = caretContext.leftFileContext.length
135-
val leftContextAtCurrentLine = if (leftContextLines.size - 1 >= 0) leftContextLines[leftContextLines.size - 1] else ""
136-
var keyword = ""
137-
val lastToken = leftContextAtCurrentLine.trim().split(" ").let { tokens ->
138-
if (tokens.size - 1 >= 0) tokens[tokens.size - 1] else ""
139-
}
140-
if (lastToken.length > 1) keyword = lastToken
141-
142-
val lengthOfLeftCurrent = leftContextAtCurrentLine.length
143-
val lengthOfLeftPrev = if (leftContextLines.size - 2 >= 0) {
144-
leftContextLines[leftContextLines.size - 2].length.toDouble()
145-
} else {
146-
0.0
147-
}
148-
149-
val rightContext = caretContext.rightFileContext
150-
val lengthOfRight = rightContext.trim().length
151-
152-
val triggerTypeCoefficient = CodeWhispererClassifierConstants.triggerTypeCoefficientMap[automatedTriggerType] ?: 0.0
153-
154-
val osCoefficient: Double = if (SystemInfo.isMac) {
155-
CodeWhispererClassifierConstants.osMap["Mac OS X"] ?: 0.0
156-
} else if (SystemInfo.isWindows) {
157-
val osVersion = SystemInfo.OS_VERSION
158-
if (osVersion.contains("11", true) || osVersion.contains("10", true)) {
159-
CodeWhispererClassifierConstants.osMap["Windows 10"]
160-
} else {
161-
CodeWhispererClassifierConstants.osMap["Windows"]
162-
}
163-
} else {
164-
0.0
165-
} ?: 0.0
166-
167-
val lastCharCoefficient = if (leftContextAtCurrentLine.length - 1 >= 0) {
168-
CodeWhispererClassifierConstants.coefficientsMap[leftContextAtCurrentLine[leftContextAtCurrentLine.length - 1].toString()] ?: 0.0
169-
} else {
170-
0.0
171-
}
172-
173-
val keywordCoefficient = CodeWhispererClassifierConstants.coefficientsMap[keyword] ?: 0.0
174-
val averageLanguageCoefficient = CodeWhispererClassifierConstants.languageMap.values.average()
175-
val languageCoefficient = CodeWhispererClassifierConstants.languageMap[language] ?: averageLanguageCoefficient
176-
val ideCoefficient = 0.0
177-
178-
var previousOneAccept: Double = 0.0
179-
var previousOneReject: Double = 0.0
180-
var previousOneOther: Double = 0.0
181-
val previousOneDecision =
182-
if (CodeWhispererFeatureConfigService.getInstance().getNewAutoTriggerUX()) {
183-
CodeWhispererTelemetryServiceNew.getInstance().previousUserTriggerDecision
184-
} else {
185-
CodeWhispererTelemetryService.getInstance().previousUserTriggerDecision
186-
}
187-
if (previousOneDecision == null) {
188-
previousOneAccept = 0.0
189-
previousOneReject = 0.0
190-
previousOneOther = 0.0
191-
} else {
192-
previousOneAccept =
193-
if (previousOneDecision == CodewhispererPreviousSuggestionState.Accept) {
194-
CodeWhispererClassifierConstants.prevDecisionAcceptCoefficient
195-
} else {
196-
0.0
197-
}
198-
previousOneReject =
199-
if (previousOneDecision == CodewhispererPreviousSuggestionState.Reject) {
200-
CodeWhispererClassifierConstants.prevDecisionRejectCoefficient
201-
} else {
202-
0.0
203-
}
204-
previousOneOther =
205-
if (
206-
previousOneDecision != CodewhispererPreviousSuggestionState.Accept &&
207-
previousOneDecision != CodewhispererPreviousSuggestionState.Reject
208-
) {
209-
CodeWhispererClassifierConstants.prevDecisionOtherCoefficient
210-
} else {
211-
0.0
212-
}
213-
}
214-
215-
var leftContextLengthCoefficient: Double = 0.0
216-
217-
leftContextLengthCoefficient = when (leftContextLength) {
218-
in 0..4 -> CodeWhispererClassifierConstants.lengthLeft0To5
219-
in 5..9 -> CodeWhispererClassifierConstants.lengthLeft5To10
220-
in 10..19 -> CodeWhispererClassifierConstants.lengthLeft10To20
221-
in 20..29 -> CodeWhispererClassifierConstants.lengthLeft20To30
222-
in 30..39 -> CodeWhispererClassifierConstants.lengthLeft30To40
223-
in 40..49 -> CodeWhispererClassifierConstants.lengthLeft40To50
224-
else -> 0.0
225-
}
226-
227-
val normalizedLengthOfRight = CodeWhispererClassifierConstants.lengthofRightCoefficient * VariableTypeNeedNormalize.LenRight.normalize(
228-
lengthOfRight.toDouble()
229-
)
230-
231-
val normalizedLengthOfLeftCurrent = CodeWhispererClassifierConstants.lengthOfLeftCurrentCoefficient * VariableTypeNeedNormalize.LenLeftCur.normalize(
232-
lengthOfLeftCurrent.toDouble()
233-
)
234-
235-
val normalizedLengthOfPrev = CodeWhispererClassifierConstants.lengthOfLeftPrevCoefficient * VariableTypeNeedNormalize.LenLeftPrev.normalize(
236-
lengthOfLeftPrev
237-
)
238-
239-
val normalizedLineNum = CodeWhispererClassifierConstants.lineNumCoefficient * VariableTypeNeedNormalize.LineNum.normalize(caretPosition.line.toDouble())
240-
241-
val intercept = CodeWhispererClassifierConstants.intercept
242-
243-
val resultBeforeSigmoid =
244-
normalizedLengthOfRight +
245-
normalizedLengthOfLeftCurrent +
246-
normalizedLengthOfPrev +
247-
normalizedLineNum +
248-
languageCoefficient +
249-
osCoefficient +
250-
triggerTypeCoefficient +
251-
lastCharCoefficient +
252-
keywordCoefficient +
253-
ideCoefficient +
254-
previousOneAccept +
255-
previousOneReject +
256-
previousOneOther +
257-
leftContextLengthCoefficient +
258-
intercept
259-
260-
val shouldTrigger = sigmoid(resultBeforeSigmoid) > getThreshold()
261-
262-
return ClassifierResult(shouldTrigger, sigmoid(resultBeforeSigmoid))
263-
}
264-
26583
override fun dispose() {}
26684

26785
companion object {
268-
private const val triggerThreshold: Double = 0.43
269-
27086
fun getInstance(): CodeWhispererAutoTriggerService = service()
271-
272-
fun getThreshold(): Double = triggerThreshold
273-
274-
fun sigmoid(x: Double): Double = 1 / (1 + exp(-x))
275-
}
276-
}
277-
278-
private enum class VariableTypeNeedNormalize {
279-
Cursor {
280-
override fun normalize(value: Double): Double = 0.0
281-
},
282-
LineNum {
283-
override fun normalize(value: Double): Double = (value - minn.lineNum) / (maxx.lineNum - minn.lineNum)
284-
},
285-
LenLeftCur {
286-
override fun normalize(value: Double): Double = (value - minn.lenLeftCur) / (maxx.lenLeftCur - minn.lenLeftCur)
287-
},
288-
LenLeftPrev {
289-
override fun normalize(value: Double): Double = (value - minn.lenLeftPrev) / (maxx.lenLeftPrev - minn.lenLeftPrev)
290-
},
291-
LenRight {
292-
override fun normalize(value: Double): Double = (value - minn.lenRight) / (maxx.lenRight - minn.lenRight)
293-
},
294-
LineDiff {
295-
override fun normalize(value: Double): Double = 0.0
296-
}, ;
297-
298-
abstract fun normalize(toDouble: Double): Double
299-
300-
data class NormalizedCoefficients(
301-
val lineNum: Double,
302-
val lenLeftCur: Double,
303-
val lenLeftPrev: Double,
304-
val lenRight: Double,
305-
)
306-
307-
companion object {
308-
private val maxx = NormalizedCoefficients(
309-
lineNum = 4631.0,
310-
lenLeftCur = 157.0,
311-
lenLeftPrev = 176.0,
312-
lenRight = 10239.0,
313-
)
314-
315-
private val minn = NormalizedCoefficients(
316-
lineNum = 0.0,
317-
lenLeftCur = 0.0,
318-
lenLeftPrev = 0.0,
319-
lenRight = 0.0,
320-
)
32187
}
32288
}

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererAutomatedTriggerType.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import software.aws.toolkits.telemetry.CodewhispererAutomatedTriggerType
77

88
sealed class CodeWhispererAutomatedTriggerType(
99
val telemetryType: CodewhispererAutomatedTriggerType,
10-
var calculationResult: Double? = null,
1110
) {
1211
class Classifier : CodeWhispererAutomatedTriggerType(CodewhispererAutomatedTriggerType.Classifier)
1312
class SpecialChar(val specialChar: Char) :

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/startup/CodeWhispererIntelliSenseAutoTriggerListener.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ object CodeWhispererIntelliSenseAutoTriggerListener : LookupManagerListener {
2929
}
3030

3131
// Classifier
32-
CodeWhispererAutoTriggerService.getInstance().tryInvokeAutoTrigger(editor, CodeWhispererAutomatedTriggerType.IntelliSense())
32+
CodeWhispererAutoTriggerService.getInstance().invoke(editor, CodeWhispererAutomatedTriggerType.IntelliSense())
3333
cleanup()
3434
}
3535
override fun lookupCanceled(event: LookupEvent) {

0 commit comments

Comments
 (0)