override fun getSuggestion()

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
    }