override fun getSuggestion()

in src/main/kotlin/org/jetbrains/plugins/feature/suggester/suggesters/IntroduceVariableSuggester.kt [47:105]


    override fun getSuggestion(action: Action): Suggestion {
        val language = action.language ?: return NoSuggestion
        val langSupport = LanguageSupport.getForLanguage(language) ?: return NoSuggestion
        when (action) {
            is BeforeEditorTextRemovedAction -> {
                with(action) {
                    val deletedText = getCopiedContent(textFragment.text) ?: return NoSuggestion
                    val psiFile = this.psiFile ?: return NoSuggestion
                    val contentOffset = caretOffset + textFragment.text.indexOfFirst { it != ' ' && it != '\n' }
                    val curElement = psiFile.findElementAt(contentOffset) ?: return NoSuggestion
                    if (langSupport.isPartOfExpression(curElement)) {
                        val changedStatement =
                            langSupport.getTopmostStatementWithText(curElement, deletedText) ?: return NoSuggestion
                        extractedExprData = ExtractedExpressionData(textFragment.text, changedStatement)
                    }
                }
            }
            is ChildReplacedAction -> {
                if (extractedExprData == null) return NoSuggestion
                with(action) {
                    when {
                        langSupport.isVariableDeclarationAdded(this) -> {
                            extractedExprData!!.declaration = newChild
                        }
                        newChild.text.trim() == extractedExprData!!.changedStatementText -> {
                            extractedExprData!!.changedStatement = newChild
                        }
                        langSupport.isVariableInserted(this) -> {
                            extractedExprData = null
                            return createSuggestion()
                        }
                    }
                }
            }
            is ChildAddedAction -> {
                if (extractedExprData == null) return NoSuggestion
                with(action) {
                    if (langSupport.isVariableDeclarationAdded(this)) {
                        extractedExprData!!.declaration = newChild
                    } else if (newChild.text.trim() == extractedExprData!!.changedStatementText) {
                        extractedExprData!!.changedStatement = newChild
                    } else if (!extractedExprData!!.variableEditingFinished && isVariableEditingFinished()) {
                        extractedExprData!!.variableEditingFinished = true
                    }
                }
            }
            is ChildrenChangedAction -> {
                if (extractedExprData == null) return NoSuggestion
                if (action.parent === extractedExprData!!.declaration &&
                    !extractedExprData!!.variableEditingFinished &&
                    isVariableEditingFinished()
                ) {
                    extractedExprData!!.variableEditingFinished = true
                }
            }
            else -> NoSuggestion
        }
        return NoSuggestion
    }