show two levels of hierarchy when grouping find usages by file structure

#KT-9019 Fixed
 #KT-10178 Fixed
This commit is contained in:
Dmitry Jemerov
2016-08-25 19:02:59 +02:00
parent a4978c794f
commit e462a97c64
2 changed files with 25 additions and 21 deletions
+1
View File
@@ -339,6 +339,7 @@
<lang.elementManipulator forClass="org.jetbrains.kotlin.psi.KtStringTemplateExpression"
implementationClass="org.jetbrains.kotlin.psi.psiUtil.KtStringTemplateExpressionManipulator"/>
<fileStructureGroupRuleProvider implementation="org.jetbrains.kotlin.idea.findUsages.KotlinDeclarationGroupRuleProvider"/>
<fileStructureGroupRuleProvider implementation="org.jetbrains.kotlin.idea.findUsages.KotlinDeclarationSecondLevelGroupRuleProvider"/>
<importFilteringRule implementation="org.jetbrains.kotlin.idea.findUsages.KotlinImportFilteringRule"/>
<lang.refactoringSupport language="kotlin" implementationClass="org.jetbrains.kotlin.idea.refactoring.KotlinRefactoringSupportProvider"/>
<lang.surroundDescriptor language="kotlin"
@@ -16,33 +16,36 @@
package org.jetbrains.kotlin.idea.findUsages
import com.intellij.usages.rules.PsiElementUsage
import com.intellij.usages.UsageGroup
import com.intellij.usages.Usage
import com.intellij.psi.util.PsiTreeUtil
import com.intellij.usages.rules.UsageGroupingRule
import org.jetbrains.kotlin.psi.KtNamedDeclaration
import com.intellij.usages.PsiNamedElementUsageGroupBase
import org.jetbrains.kotlin.psi.KtFile
import com.intellij.usages.impl.FileStructureGroupRuleProvider
import com.intellij.openapi.project.Project
import com.intellij.usages.PsiNamedElementUsageGroupBase
import com.intellij.usages.Usage
import com.intellij.usages.UsageGroup
import com.intellij.usages.impl.FileStructureGroupRuleProvider
import com.intellij.usages.rules.PsiElementUsage
import com.intellij.usages.rules.UsageGroupingRule
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtNamedDeclaration
import org.jetbrains.kotlin.psi.psiUtil.parents
class KotlinDeclarationGroupRuleProvider : FileStructureGroupRuleProvider {
class KotlinDeclarationGroupingRule : UsageGroupingRule {
override fun groupUsage(usage: Usage): UsageGroup? {
val element = (usage as? PsiElementUsage)?.element
if (element == null) return null
class KotlinDeclarationGroupingRule(val level: Int) : UsageGroupingRule {
override fun groupUsage(usage: Usage): UsageGroup? {
val element = (usage as? PsiElementUsage)?.element ?: return null
val containingFile = element.containingFile
if (containingFile !is KtFile) return null
val containingFile = element.containingFile
if (containingFile !is KtFile) return null
return PsiTreeUtil.getTopmostParentOfType(element, KtNamedDeclaration::class.java)?.let { container ->
PsiNamedElementUsageGroupBase(container)
}
val parentList = element.parents.filterIsInstance<KtNamedDeclaration>().toList()
if (parentList.size <= level) {
return null
}
return PsiNamedElementUsageGroupBase(parentList[parentList.size - level - 1])
}
override fun getUsageGroupingRule(project: Project): UsageGroupingRule = KotlinDeclarationGroupingRule()
}
class KotlinDeclarationGroupRuleProvider : FileStructureGroupRuleProvider {
override fun getUsageGroupingRule(project: Project): UsageGroupingRule = KotlinDeclarationGroupingRule(0)
}
class KotlinDeclarationSecondLevelGroupRuleProvider : FileStructureGroupRuleProvider {
override fun getUsageGroupingRule(project: Project): UsageGroupingRule = KotlinDeclarationGroupingRule(1)
}