Move: Specify conflict containing declaration more precisely

Also do not render class fqname for member declarations

 #KT-17547 Fixed
This commit is contained in:
Alexey Sedunov
2017-04-24 14:52:21 +03:00
parent fba52359ac
commit 0a5f9d8181
16 changed files with 43 additions and 25 deletions
@@ -34,7 +34,9 @@ import org.jetbrains.kotlin.idea.refactoring.rename.RenameJavaSyntheticPropertyH
import org.jetbrains.kotlin.idea.refactoring.rename.RenameKotlinPropertyProcessor
import org.jetbrains.kotlin.idea.util.string.collapseSpaces
import org.jetbrains.kotlin.name.FqNameUnsafe
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
class KotlinElementDescriptionProvider : ElementDescriptionProvider {
@@ -44,7 +46,16 @@ class KotlinElementDescriptionProvider : ElementDescriptionProvider {
return parent
}
private fun KtNamedDeclaration.name() = nameAsName ?: Name.special("<no name provided>")
private fun KtNamedDeclaration.fqName(): FqNameUnsafe {
containingClassOrObject?.let {
if (it is KtObjectDeclaration && it.isCompanion()) {
return it.fqName().child(name())
}
return FqNameUnsafe("${it.name()}.${name()}")
}
val internalSegments = generateSequence(this) { it.parentForFqName() }
.filterIsInstance<KtNamedDeclaration>()
.map { it.name ?: "<no name provided>" }
@@ -142,7 +142,13 @@ fun VirtualFile.toPsiFileOrDirectory(project: Project): PsiFileSystemItem? = if
fun PsiElement.getUsageContext(): PsiElement {
return when (this) {
is KtElement -> PsiTreeUtil.getParentOfType(this, KtPropertyAccessor::class.java, KtNamedDeclaration::class.java, KtFile::class.java)!!
is KtElement -> PsiTreeUtil.getParentOfType(
this,
KtPropertyAccessor::class.java,
KtProperty::class.java,
KtFunction::class.java,
KtClassOrObject::class.java
) ?: containingFile
else -> ConflictsUtil.getContainer(this)
}
}
@@ -170,8 +170,7 @@ class MoveConflictChecker(
val usageFile = element.containingFile
val usageVFile = usageFile.virtualFile ?: continue
val usageModule = ModuleUtilCore.findModuleForFile(usageVFile, project) ?: continue
val container = if (usageFile is PsiJavaFile) ConflictsUtil.getContainer(element) else usageFile
val scopeDescription = RefactoringUIUtil.getDescription(container, true)
val scopeDescription = RefactoringUIUtil.getDescription(element.getUsageContext(), true)
val referencedElement = (if (usage is MoveRenameUsageInfo) usage.referencedElement else usage.element) ?: error(usage)
val message = if (usageModule == targetModule && isInTestSources) {
RefactoringBundle.message("0.referenced.in.1.will.not.be.accessible.from.production.of.module.2",