More elegant shortening of user type

This commit is contained in:
Valentin Kipyatkov
2015-01-27 10:28:18 +03:00
parent 3bc2f89a1b
commit 33f979768d
2 changed files with 17 additions and 10 deletions
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.psi;
import com.google.common.collect.Lists;
import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.lexer.JetTokens;
@@ -80,6 +81,15 @@ public class JetUserType extends JetElementImplStub<KotlinUserTypeStub> implemen
return getStubOrPsiChild(JetStubElementTypes.USER_TYPE);
}
public void deleteQualifier() {
JetUserType qualifier = getQualifier();
assert qualifier != null;
PsiElement dot = findChildByType(JetTokens.DOT);
assert dot != null;
qualifier.delete();
dot.delete();
}
@Nullable
public String getReferencedName() {
JetNameReferenceExpression referenceExpression = getReferenceExpression();
@@ -31,11 +31,9 @@ import java.util.Collections
import org.jetbrains.kotlin.analyzer.analyzeInContext
import org.jetbrains.kotlin.resolve.calls.callUtil.getCalleeExpressionIfAny
import java.util.LinkedHashSet
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedElement
import org.jetbrains.kotlin.resolve.descriptorUtil.getImportableDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.ResolutionFacade
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
import org.jetbrains.kotlin.resolve.DescriptorUtils
public object ShortenReferences {
public fun process(element: JetElement) {
@@ -138,7 +136,7 @@ public object ShortenReferences {
protected fun bindingContext(element: JetElement): BindingContext
= preResolveMap[element] ?: resolutionFacade.analyze(element)
protected abstract fun getShortenedElement(element: T): JetElement?
protected abstract fun shortenElement(element: T)
override fun visitElement(element: PsiElement) {
if (elementFilter(element) != FilterResult.SKIP) {
@@ -148,7 +146,7 @@ public object ShortenReferences {
public fun finish() {
for (element in elementsToShorten) {
getShortenedElement(element)?.let { element.replace(it) }
shortenElement(element)
}
}
}
@@ -201,11 +199,8 @@ public object ShortenReferences {
}
}
override fun getShortenedElement(element: JetUserType): JetElement? {
val referenceExpression = element.getReferenceExpression() ?: return null
val typeArgumentList = element.getTypeArgumentList()
val text = referenceExpression.getText() + (if (typeArgumentList != null) typeArgumentList.getText() else "")
return JetPsiFactory(element).createType(text).getTypeElement()!!
override fun shortenElement(element: JetUserType) {
element.deleteQualifier()
}
}
@@ -260,7 +255,9 @@ public object ShortenReferences {
}
}
override fun getShortenedElement(element: JetQualifiedExpression): JetElement = element.getSelectorExpression()!!
override fun shortenElement(element: JetQualifiedExpression) {
element.replace(element.getSelectorExpression()!!)
}
}
private fun DeclarationDescriptor.asString()