Refactored DeclarationUtils

This commit is contained in:
Valentin Kipyatkov
2015-05-11 18:16:21 +03:00
parent 345076c11e
commit 4488a6719d
5 changed files with 31 additions and 71 deletions
@@ -226,8 +226,6 @@ transform.if.statement.with.assignments.to.expression=Transform 'if' statement w
transform.assignment.with.if.expression.to.statement=Transform assignment with 'if' expression to statement
transform.if.statement.with.assignments.to.expression.family=Transform 'if' Statement with Assignments to Expression
transform.assignment.with.if.expression.to.statement.family=Transform Assignment with 'if' Expression to Statement
split.property.declaration=Split property declaration
split.property.declaration.family=Split Property Declaration
change.function.signature.action.single=Change function signature to ''{0}''
change.function.signature.action.multiple=Change function signature...
change.function.signature.family=Change function signature
@@ -20,7 +20,7 @@ import com.intellij.openapi.editor.Editor
import com.intellij.openapi.util.TextRange
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingRangeIntention
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.BranchedUnfoldingUtils
import org.jetbrains.kotlin.idea.intentions.declarations.DeclarationUtils
import org.jetbrains.kotlin.idea.intentions.declarations.splitPropertyDeclaration
import org.jetbrains.kotlin.psi.JetIfExpression
import org.jetbrains.kotlin.psi.JetProperty
@@ -32,7 +32,7 @@ public class UnfoldPropertyToIfIntention : JetSelfTargetingRangeIntention<JetPro
}
override fun applyTo(element: JetProperty, editor: Editor) {
val assignment = DeclarationUtils.splitPropertyDeclaration(element)
val assignment = splitPropertyDeclaration(element)
BranchedUnfoldingUtils.unfoldAssignmentToIf(assignment, editor)
}
}
@@ -20,7 +20,7 @@ import com.intellij.openapi.editor.Editor
import com.intellij.openapi.util.TextRange
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingRangeIntention
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.BranchedUnfoldingUtils
import org.jetbrains.kotlin.idea.intentions.declarations.DeclarationUtils
import org.jetbrains.kotlin.idea.intentions.declarations.splitPropertyDeclaration
import org.jetbrains.kotlin.psi.JetProperty
import org.jetbrains.kotlin.psi.JetPsiUtil
import org.jetbrains.kotlin.psi.JetWhenExpression
@@ -34,7 +34,7 @@ public class UnfoldPropertyToWhenIntention : JetSelfTargetingRangeIntention<JetP
}
override fun applyTo(element: JetProperty, editor: Editor) {
val assignment = DeclarationUtils.splitPropertyDeclaration(element)
val assignment = splitPropertyDeclaration(element)
BranchedUnfoldingUtils.unfoldAssignmentToWhen(assignment, editor)
}
}
@@ -16,71 +16,33 @@
package org.jetbrains.kotlin.idea.intentions.declarations
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.idea.caches.resolve.*
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
import org.jetbrains.kotlin.idea.util.ShortenReferences
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
import org.jetbrains.kotlin.types.JetType
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.intentions.setType
import org.jetbrains.kotlin.psi.JetBinaryExpression
import org.jetbrains.kotlin.psi.JetProperty
import org.jetbrains.kotlin.psi.JetPsiFactory
import org.jetbrains.kotlin.psi.createExpressionByPattern
public object DeclarationUtils {
// returns assignment which replaces initializer
public fun splitPropertyDeclaration(property: JetProperty): JetBinaryExpression {
val parent = property.getParent()!!
private fun assertNotNull(value: Any?) {
assert(value != null, "Expression must be checked before applying transformation")
val initializer = property.getInitializer()!!
val explicitTypeToSet = if (property.getTypeReference() != null) null else initializer.analyze().getType(initializer)
val psiFactory = JetPsiFactory(property)
var assignment = psiFactory.createExpressionByPattern("$0 = $1", property.getName()!!, initializer)
assignment = parent.addAfter(assignment, property) as JetBinaryExpression
parent.addAfter(psiFactory.createNewLine(), property)
property.setInitializer(null)
if (explicitTypeToSet != null) {
property.setType(explicitTypeToSet)
}
public fun checkSplitProperty(property: JetProperty): Boolean {
return property.hasInitializer() && property.isLocal()
}
private fun getPropertyTypeIfNeeded(property: JetProperty): JetType? {
if (property.getTypeReference() != null) return null
val initializer = property.getInitializer()
val type = if (initializer != null) property.analyze(BodyResolveMode.FULL).getType(initializer) else null
return if (type == null || type.isError()) null else type
}
// returns assignment which replaces initializer
public fun splitPropertyDeclaration(property: JetProperty): JetBinaryExpression {
var property = property
val parent = property.getParent()
assertNotNull(parent)
//noinspection unchecked
val initializer = property.getInitializer()
assertNotNull(initializer)
val psiFactory = JetPsiFactory(property)
//noinspection ConstantConditions, unchecked
var newInitializer = psiFactory.createExpressionByPattern("$0 = $1", property.getName(), initializer)
newInitializer = parent.addAfter(newInitializer, property) as JetBinaryExpression
parent.addAfter(psiFactory.createNewLine(), property)
val project = newInitializer.getProject()
val file = parent.getContainingFile()
PsiDocumentManager.getInstance(project).doPostponedOperationsAndUnblockDocument(PsiDocumentManager.getInstance(project).getDocument(file))
//noinspection ConstantConditions
val inferredType = getPropertyTypeIfNeeded(property)
val typeStr = if (inferredType != null)
IdeDescriptorRenderers.SOURCE_CODE.renderType(inferredType)
else
JetPsiUtil.getNullableText(property.getTypeReference())
//noinspection ConstantConditions
property = property.replace(psiFactory.createProperty(property.getNameIdentifier()!!.getText(), typeStr, property.isVar())) as JetProperty
if (inferredType != null) {
ShortenReferences.DEFAULT.process(property.getTypeReference())
}
return newInitializer
}
return assignment
}
@@ -20,10 +20,10 @@ import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingOffsetIndependentIntention
import org.jetbrains.kotlin.psi.JetProperty
public class SplitPropertyDeclarationIntention : JetSelfTargetingOffsetIndependentIntention<JetProperty>("split.property.declaration", javaClass()) {
override fun isApplicableTo(element: JetProperty): Boolean = DeclarationUtils.checkSplitProperty(element)
public class SplitPropertyDeclarationIntention : JetSelfTargetingOffsetIndependentIntention<JetProperty>(javaClass(), "Split property declaration") {
override fun isApplicableTo(element: JetProperty): Boolean = element.hasInitializer() && element.isLocal()
override fun applyTo(element: JetProperty, editor: Editor) {
DeclarationUtils.splitPropertyDeclaration(element)
splitPropertyDeclaration(element)
}
}