KtSimpleNameReference: cleanup code

This commit is contained in:
Dmitry Gridin
2019-08-27 12:30:56 +07:00
parent dd2bd320ba
commit 2e781a7a27
@@ -92,7 +92,7 @@ class KtSimpleNameReference(expression: KtSimpleNameExpression) : KtSimpleRefere
} }
override fun canRename(): Boolean { override fun canRename(): Boolean {
if (expression.getParentOfTypeAndBranch<KtWhenConditionInRange>(strict = true){ operationReference } != null) return false if (expression.getParentOfTypeAndBranch<KtWhenConditionInRange>(strict = true) { operationReference } != null) return false
val elementType = expression.getReferencedNameElementType() val elementType = expression.getReferencedNameElementType()
if (elementType == KtTokens.PLUSPLUS || elementType == KtTokens.MINUSMINUS) return false if (elementType == KtTokens.PLUSPLUS || elementType == KtTokens.MINUSMINUS) return false
@@ -104,8 +104,7 @@ class KtSimpleNameReference(expression: KtSimpleNameExpression) : KtSimpleRefere
if (!canRename()) throw IncorrectOperationException() if (!canRename()) throw IncorrectOperationException()
if (newElementName.unquote() == "") { if (newElementName.unquote() == "") {
val qualifiedElement = expression.getQualifiedElement() return when (val qualifiedElement = expression.getQualifiedElement()) {
return when (qualifiedElement) {
is KtQualifiedExpression -> { is KtQualifiedExpression -> {
expression.replace(qualifiedElement.receiverExpression) expression.replace(qualifiedElement.receiverExpression)
qualifiedElement.replaced(qualifiedElement.selectorExpression!!) qualifiedElement.replaced(qualifiedElement.selectorExpression!!)
@@ -127,9 +126,9 @@ class KtSimpleNameReference(expression: KtSimpleNameExpression) : KtSimpleRefere
val psiFactory = KtPsiFactory(expression) val psiFactory = KtPsiFactory(expression)
val element = Extensions.getArea(expression.project).getExtensionPoint(SimpleNameReferenceExtension.EP_NAME).extensions val element = Extensions.getArea(expression.project).getExtensionPoint(SimpleNameReferenceExtension.EP_NAME).extensions
.asSequence() .asSequence()
.map { it.handleElementRename(this, psiFactory, newElementName) } .map { it.handleElementRename(this, psiFactory, newElementName) }
.firstOrNull { it != null } ?: psiFactory.createNameIdentifier(newElementName.quoteIfNeeded()) .firstOrNull { it != null } ?: psiFactory.createNameIdentifier(newElementName.quoteIfNeeded())
val nameElement = expression.getReferencedNameElement() val nameElement = expression.getReferencedNameElement()
@@ -145,8 +144,7 @@ class KtSimpleNameReference(expression: KtSimpleNameExpression) : KtSimpleRefere
if (element.node.elementType == KtTokens.IDENTIFIER) { if (element.node.elementType == KtTokens.IDENTIFIER) {
nameElement.astReplace(element) nameElement.astReplace(element)
} } else {
else {
nameElement.replace(element) nameElement.replace(element)
} }
return expression return expression
@@ -160,12 +158,16 @@ class KtSimpleNameReference(expression: KtSimpleNameExpression) : KtSimpleRefere
// By default reference binding is delayed // By default reference binding is delayed
override fun bindToElement(element: PsiElement): PsiElement = override fun bindToElement(element: PsiElement): PsiElement =
bindToElement(element, ShorteningMode.DELAYED_SHORTENING) bindToElement(element, ShorteningMode.DELAYED_SHORTENING)
fun bindToElement(element: PsiElement, shorteningMode: ShorteningMode): PsiElement = fun bindToElement(element: PsiElement, shorteningMode: ShorteningMode): PsiElement =
element.getKotlinFqName()?.let { fqName -> bindToFqName(fqName, shorteningMode, element) } ?: expression element.getKotlinFqName()?.let { fqName -> bindToFqName(fqName, shorteningMode, element) } ?: expression
fun bindToFqName(fqName: FqName, shorteningMode: ShorteningMode = ShorteningMode.DELAYED_SHORTENING, targetElement: PsiElement? = null): PsiElement { fun bindToFqName(
fqName: FqName,
shorteningMode: ShorteningMode = ShorteningMode.DELAYED_SHORTENING,
targetElement: PsiElement? = null
): PsiElement {
val expression = expression val expression = expression
if (fqName.isRoot) return expression if (fqName.isRoot) return expression
@@ -197,7 +199,10 @@ class KtSimpleNameReference(expression: KtSimpleNameExpression) : KtSimpleRefere
* Result is either the same as original element, or [[KtQualifiedExpression]], or [[KtUserType]] * Result is either the same as original element, or [[KtQualifiedExpression]], or [[KtUserType]]
* Note that FqName may not be empty * Note that FqName may not be empty
*/ */
private fun KtNameReferenceExpression.changeQualifiedName(fqName: FqName, targetElement: PsiElement? = null): KtNameReferenceExpression { private fun KtNameReferenceExpression.changeQualifiedName(
fqName: FqName,
targetElement: PsiElement? = null
): KtNameReferenceExpression {
assert(!fqName.isRoot) { "Can't set empty FqName for element $this" } assert(!fqName.isRoot) { "Can't set empty FqName for element $this" }
val shortName = fqName.shortName().asString() val shortName = fqName.shortName().asString()
@@ -255,8 +260,8 @@ class KtSimpleNameReference(expression: KtSimpleNameExpression) : KtSimpleRefere
} as KtElement } as KtElement
val selector = (newElement as? KtCallableReferenceExpression)?.callableReference val selector = (newElement as? KtCallableReferenceExpression)?.callableReference
?: newElement.getQualifiedElementSelector() ?: newElement.getQualifiedElementSelector()
?: error("No selector for $newElement") ?: error("No selector for $newElement")
return selector as KtNameReferenceExpression return selector as KtNameReferenceExpression
} }
@@ -270,14 +275,13 @@ class KtSimpleNameReference(expression: KtSimpleNameExpression) : KtSimpleRefere
val tokenType = element.operationSignTokenType val tokenType = element.operationSignTokenType
if (tokenType != null) { if (tokenType != null) {
val name = OperatorConventions.getNameForOperationSymbol( val name = OperatorConventions.getNameForOperationSymbol(
tokenType, element.parent is KtUnaryExpression, element.parent is KtBinaryExpression tokenType, element.parent is KtUnaryExpression, element.parent is KtBinaryExpression
) ?: return emptyList() ) ?: return emptyList()
val counterpart = OperatorConventions.ASSIGNMENT_OPERATION_COUNTERPARTS[tokenType] val counterpart = OperatorConventions.ASSIGNMENT_OPERATION_COUNTERPARTS[tokenType]
return if (counterpart != null) { return if (counterpart != null) {
val counterpartName = OperatorConventions.getNameForOperationSymbol(counterpart, false, true)!! val counterpartName = OperatorConventions.getNameForOperationSymbol(counterpart, false, true)!!
listOf(name, counterpartName) listOf(name, counterpartName)
} } else {
else {
listOf(name) listOf(name)
} }
} }