Unwrap light elements before getting FqName

This commit is contained in:
Alexey Sedunov
2014-03-18 21:20:29 +04:00
parent acaa900ee9
commit 05d93df8b8
3 changed files with 28 additions and 26 deletions
@@ -49,14 +49,11 @@ import com.intellij.psi.PsiParameterList
import com.intellij.psi.PsiParameter import com.intellij.psi.PsiParameter
import org.jetbrains.jet.lang.psi.JetQualifiedExpression import org.jetbrains.jet.lang.psi.JetQualifiedExpression
import org.jetbrains.jet.lang.psi.JetUserType import org.jetbrains.jet.lang.psi.JetUserType
import org.jetbrains.jet.lang.resolve.name.FqName
import org.jetbrains.jet.lang.psi.JetCallExpression import org.jetbrains.jet.lang.psi.JetCallExpression
import com.intellij.psi.PsiPackage import com.intellij.psi.PsiPackage
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiMember
import org.jetbrains.jet.lang.psi.JetNamedDeclaration
import com.intellij.psi.JavaDirectoryService import com.intellij.psi.JavaDirectoryService
import com.intellij.psi.PsiDirectory import com.intellij.psi.PsiDirectory
import org.jetbrains.jet.lang.psi.JetModifierListOwner
public fun PsiElement.getParentByTypesAndPredicate<T: PsiElement>( public fun PsiElement.getParentByTypesAndPredicate<T: PsiElement>(
strict : Boolean = false, vararg parentClasses : Class<T>, predicate: (T) -> Boolean strict : Boolean = false, vararg parentClasses : Class<T>, predicate: (T) -> Boolean
@@ -265,20 +262,4 @@ public fun JetSimpleNameExpression.getOutermostNonInterleavingQualifiedElement()
} }
} }
/**
* Returns FqName for given declaration (either Java or Kotlin)
*/
public fun PsiElement.getFqName(): FqName? {
return when (this) {
is PsiPackage -> FqName(getQualifiedName())
is PsiClass -> getQualifiedName()?.let { FqName(it) }
is PsiMember -> getName()?.let { name ->
val prefix = getContainingClass()?.getQualifiedName()
FqName(if (prefix != null) "$prefix.$name" else name)
}
is JetNamedDeclaration -> JetPsiUtil.getFQName(this)
else -> null
}
}
public fun PsiDirectory.getPackage(): PsiPackage? = JavaDirectoryService.getInstance()!!.getPackage(this) public fun PsiDirectory.getPackage(): PsiPackage? = JavaDirectoryService.getInstance()!!.getPackage(this)
@@ -28,11 +28,15 @@ import com.intellij.psi.PsiElement
import com.intellij.openapi.util.Key import com.intellij.openapi.util.Key
import com.intellij.psi.PsiDirectory import com.intellij.psi.PsiDirectory
import org.jetbrains.jet.lang.psi.JetFile import org.jetbrains.jet.lang.psi.JetFile
import com.intellij.psi.PsiFile
import org.jetbrains.jet.plugin.JetFileType
import org.jetbrains.jet.lang.psi.psiUtil.getPackage
import com.intellij.psi.PsiFileFactory import com.intellij.psi.PsiFileFactory
import java.lang.annotation.Target import org.jetbrains.jet.lang.psi.psiUtil.getPackage
import org.jetbrains.jet.plugin.JetFileType
import com.intellij.psi.PsiPackage
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiMember
import org.jetbrains.jet.lang.psi.JetNamedDeclaration
import org.jetbrains.jet.lang.psi.JetPsiUtil
import org.jetbrains.jet.asJava.namedUnwrappedElement
/** /**
* Replace [[JetSimpleNameExpression]] (and its enclosing qualifier) with qualified element given by FqName * Replace [[JetSimpleNameExpression]] (and its enclosing qualifier) with qualified element given by FqName
@@ -74,4 +78,21 @@ fun createKotlinFile(fileName: String, targetDir: PsiDirectory): JetFile {
) )
return targetDir.add(file) as JetFile return targetDir.add(file) as JetFile
}
/**
* Returns FqName for given declaration (either Java or Kotlin)
*/
public fun PsiElement.getKotlinFqName(): FqName? {
val element = namedUnwrappedElement
return when (element) {
is PsiPackage -> FqName(element.getQualifiedName())
is PsiClass -> element.getQualifiedName()?.let { FqName(it) }
is PsiMember -> (element : PsiMember).getName()?.let { name ->
val prefix = element.getContainingClass()?.getQualifiedName()
FqName(if (prefix != null) "$prefix.$name" else name)
}
is JetNamedDeclaration -> JetPsiUtil.getFQName(element)
else -> null
}
} }
@@ -23,11 +23,11 @@ import org.jetbrains.jet.lang.psi.*
import org.jetbrains.jet.lang.resolve.name.FqName import org.jetbrains.jet.lang.resolve.name.FqName
import org.jetbrains.jet.lexer.JetTokens import org.jetbrains.jet.lexer.JetTokens
import org.jetbrains.jet.plugin.codeInsight.ShortenReferences import org.jetbrains.jet.plugin.codeInsight.ShortenReferences
import org.jetbrains.jet.lang.psi.psiUtil.getFqName
import org.jetbrains.jet.plugin.refactoring.changeQualifiedName import org.jetbrains.jet.plugin.refactoring.changeQualifiedName
import org.jetbrains.jet.lang.psi.psiUtil.getQualifiedElementSelector import org.jetbrains.jet.lang.psi.psiUtil.getQualifiedElementSelector
import org.jetbrains.jet.lang.psi.psiUtil.getOutermostNonInterleavingQualifiedElement import org.jetbrains.jet.lang.psi.psiUtil.getOutermostNonInterleavingQualifiedElement
import org.jetbrains.jet.plugin.codeInsight.addToShorteningWaitSet import org.jetbrains.jet.plugin.codeInsight.addToShorteningWaitSet
import org.jetbrains.jet.plugin.refactoring.getKotlinFqName
public class JetSimpleNameReference( public class JetSimpleNameReference(
jetSimpleNameExpression: JetSimpleNameExpression jetSimpleNameExpression: JetSimpleNameExpression
@@ -56,7 +56,7 @@ public class JetSimpleNameReference(
// By default reference binding is delayed // By default reference binding is delayed
override fun bindToElement(element: PsiElement): PsiElement { override fun bindToElement(element: PsiElement): PsiElement {
return element.getFqName()?.let { fqName -> bindToFqName(fqName) } ?: expression return element.getKotlinFqName()?.let { fqName -> bindToFqName(fqName) } ?: expression
} }
public fun bindToFqName(fqName: FqName, shorteningMode: ShorteningMode = ShorteningMode.DELAYED_SHORTENING): PsiElement { public fun bindToFqName(fqName: FqName, shorteningMode: ShorteningMode = ShorteningMode.DELAYED_SHORTENING): PsiElement {