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
}