in src/main/kotlin/org/jetbrains/plugins/feature/suggester/suggesters/ReplaceCompletionSuggester.kt [62:127]
override fun getSuggestion(action: Action): Suggestion {
val language = action.language ?: return NoSuggestion
val langSupport = LanguageSupport.getForLanguage(language) ?: return NoSuggestion
when (action) {
is BeforeEditorTextRemovedAction -> {
if (action.textFragment.text == ".") {
editedStatementData = langSupport.createEditedStatementData(action, action.caretOffset)
}
}
is BeforeEditorTextInsertedAction -> {
if (editedStatementData != null &&
action.text == "." &&
action.caretOffset == editedStatementData!!.dotOffset
) {
editedStatementData!!.isCompletionStarted = true
}
}
is EditorCodeCompletionAction -> {
val caretOffset = action.caretOffset
if (action.document.getText(TextRange(caretOffset - 1, caretOffset)) == ".") {
editedStatementData = langSupport.createEditedStatementData(action, action.caretOffset)?.apply {
isCompletionStarted = true
}
}
}
is BeforeCompletionChooseItemAction -> {
if (editedStatementData == null || editedStatementData?.isAroundDot(action.caretOffset) != true) {
return NoSuggestion
}
val curElement = action.psiFile?.findElementAt(action.caretOffset) ?: return NoSuggestion
if (langSupport.isIdentifier(curElement)) {
// remove characters that user typed before completion
editedStatementData!!.textToDelete =
curElement.text.substring(action.caretOffset - curElement.startOffset)
}
}
is CompletionChooseItemAction -> {
editedStatementData?.addedExprEndOffset = action.caretOffset
}
is EditorTextInsertedAction -> {
if (editedStatementData?.isCompletionFinished != true) return NoSuggestion
if (action.caretOffset < editedStatementData!!.addedExprEndOffset) {
editedStatementData!!.addedExprEndOffset += action.text.length
}
}
is EditorTextRemovedAction -> {
if (editedStatementData?.isCompletionFinished != true) return NoSuggestion
editedStatementData!!.deletedText += action.textFragment.text
if (editedStatementData!!.isDeletedTooMuch()) {
editedStatementData = null
} else if (editedStatementData!!.isIdentifierNameDeleted(
action.caretOffset,
action.textFragment.text
)
) {
editedStatementData = null
return createSuggestion()
}
}
is EditorEscapeAction -> {
editedStatementData = null
}
}
return NoSuggestion
}