Minor: cleanup ChangePackageIntention

This commit is contained in:
Dmitry Gridin
2019-05-31 15:26:23 +07:00
parent 4fa83a2fd7
commit f6a61e8034
@@ -23,8 +23,8 @@ import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.util.TextRange
import com.intellij.psi.PsiDocumentManager
import org.jetbrains.kotlin.idea.core.util.CodeInsightUtils
import org.jetbrains.kotlin.idea.core.quoteSegmentsIfNeeded
import org.jetbrains.kotlin.idea.core.util.CodeInsightUtils
import org.jetbrains.kotlin.idea.intentions.SelfTargetingOffsetIndependentIntention
import org.jetbrains.kotlin.idea.refactoring.hasIdentifiersOnly
import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
@@ -32,9 +32,10 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.FqNameUnsafe
import org.jetbrains.kotlin.psi.KtPackageDirective
class ChangePackageIntention: SelfTargetingOffsetIndependentIntention<KtPackageDirective>(KtPackageDirective::class.java, "Change package") {
class ChangePackageIntention :
SelfTargetingOffsetIndependentIntention<KtPackageDirective>(KtPackageDirective::class.java, "Change package") {
companion object {
private val PACKAGE_NAME_VAR = "PACKAGE_NAME"
private const val PACKAGE_NAME_VAR = "PACKAGE_NAME"
}
override fun isApplicableTo(element: KtPackageDirective) = element.packageNameExpression != null
@@ -54,14 +55,14 @@ class ChangePackageIntention: SelfTargetingOffsetIndependentIntention<KtPackageD
val builder = TemplateBuilderImpl(file)
builder.replaceElement(
nameExpression,
PACKAGE_NAME_VAR,
object: Expression() {
override fun calculateQuickResult(context: ExpressionContext?) = TextResult(currentName)
override fun calculateResult(context: ExpressionContext?) = TextResult(currentName)
override fun calculateLookupItems(context: ExpressionContext?) = arrayOf(LookupElementBuilder.create(currentName))
},
true
nameExpression,
PACKAGE_NAME_VAR,
object : Expression() {
override fun calculateQuickResult(context: ExpressionContext?) = TextResult(currentName)
override fun calculateResult(context: ExpressionContext?) = TextResult(currentName)
override fun calculateLookupItems(context: ExpressionContext?) = arrayOf(LookupElementBuilder.create(currentName))
},
true
)
var enteredName: String? = null
@@ -69,34 +70,38 @@ class ChangePackageIntention: SelfTargetingOffsetIndependentIntention<KtPackageD
editor.caretModel.moveToOffset(0)
TemplateManager.getInstance(project).startTemplate(
editor,
builder.buildInlineTemplate(),
object: TemplateEditingAdapter() {
override fun beforeTemplateFinished(state: TemplateState, template: Template?) {
enteredName = state.getVariableValue(PACKAGE_NAME_VAR)!!.text
affectedRange = state.getSegmentRange(0)
}
override fun templateFinished(template: Template, brokenOff: Boolean) {
if (brokenOff || enteredName == null || affectedRange == null) return
// Restore original name and run refactoring
val document = editor.document
project.executeWriteCommand(text) {
document.replaceString(affectedRange!!.startOffset, affectedRange!!.endOffset, FqName(currentName).quoteSegmentsIfNeeded())
}
PsiDocumentManager.getInstance(project).commitDocument(document)
PsiDocumentManager.getInstance(project).doPostponedOperationsAndUnblockDocument(document)
if (!FqNameUnsafe(enteredName!!).hasIdentifiersOnly()) {
CodeInsightUtils.showErrorHint(project, editor, "$enteredName is not a valid package name", "Change package", null)
return
}
KotlinChangePackageRefactoring(file).run(FqName(enteredName!!))
}
editor,
builder.buildInlineTemplate(),
object : TemplateEditingAdapter() {
override fun beforeTemplateFinished(state: TemplateState, template: Template?) {
enteredName = state.getVariableValue(PACKAGE_NAME_VAR)!!.text
affectedRange = state.getSegmentRange(0)
}
override fun templateFinished(template: Template, brokenOff: Boolean) {
if (brokenOff || enteredName == null || affectedRange == null) return
// Restore original name and run refactoring
val document = editor.document
project.executeWriteCommand(text) {
document.replaceString(
affectedRange!!.startOffset,
affectedRange!!.endOffset,
FqName(currentName).quoteSegmentsIfNeeded()
)
}
PsiDocumentManager.getInstance(project).commitDocument(document)
PsiDocumentManager.getInstance(project).doPostponedOperationsAndUnblockDocument(document)
if (!FqNameUnsafe(enteredName!!).hasIdentifiersOnly()) {
CodeInsightUtils.showErrorHint(project, editor, "$enteredName is not a valid package name", "Change package", null)
return
}
KotlinChangePackageRefactoring(file).run(FqName(enteredName!!))
}
}
)
}
}