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" <lang.elementManipulator forClass="org.jetbrains.kotlin.psi.KtStringTemplateExpression"
implementationClass="org.jetbrains.kotlin.psi.psiUtil.KtStringTemplateExpressionManipulator"/> implementationClass="org.jetbrains.kotlin.psi.psiUtil.KtStringTemplateExpressionManipulator"/>
<fileStructureGroupRuleProvider implementation="org.jetbrains.kotlin.idea.findUsages.KotlinDeclarationGroupRuleProvider"/> <fileStructureGroupRuleProvider implementation="org.jetbrains.kotlin.idea.findUsages.KotlinDeclarationGroupRuleProvider"/>
<fileStructureGroupRuleProvider implementation="org.jetbrains.kotlin.idea.findUsages.KotlinDeclarationSecondLevelGroupRuleProvider"/>
<importFilteringRule implementation="org.jetbrains.kotlin.idea.findUsages.KotlinImportFilteringRule"/> <importFilteringRule implementation="org.jetbrains.kotlin.idea.findUsages.KotlinImportFilteringRule"/>
<lang.refactoringSupport language="kotlin" implementationClass="org.jetbrains.kotlin.idea.refactoring.KotlinRefactoringSupportProvider"/> <lang.refactoringSupport language="kotlin" implementationClass="org.jetbrains.kotlin.idea.refactoring.KotlinRefactoringSupportProvider"/>
<lang.surroundDescriptor language="kotlin" <lang.surroundDescriptor language="kotlin"
@@ -16,33 +16,36 @@
package org.jetbrains.kotlin.idea.findUsages 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.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(val level: Int) : UsageGroupingRule {
class KotlinDeclarationGroupingRule : UsageGroupingRule { override fun groupUsage(usage: Usage): UsageGroup? {
override fun groupUsage(usage: Usage): UsageGroup? { val element = (usage as? PsiElementUsage)?.element ?: return null
val element = (usage as? PsiElementUsage)?.element
if (element == null) return null
val containingFile = element.containingFile val containingFile = element.containingFile
if (containingFile !is KtFile) return null if (containingFile !is KtFile) return null
return PsiTreeUtil.getTopmostParentOfType(element, KtNamedDeclaration::class.java)?.let { container -> val parentList = element.parents.filterIsInstance<KtNamedDeclaration>().toList()
PsiNamedElementUsageGroupBase(container) 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)
}