From 6dd75f697a2e71ac55d90bb23d2bba273c1f4a8d Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Fri, 10 Feb 2017 15:42:11 +0300 Subject: [PATCH] Fix Show implementation to show inheritance through type-aliases Show implementation(Ctrl-Hover) now should show classes which inherit such class through type-alias #KT-15200 fixed --- .../idea/project/TargetPlatformDetector.java | 8 ++++- .../KotlinDirectInheritorsSearcher.kt | 34 ++++++++++++++++--- .../MultiTypeAlias_verification.xml | 3 ++ .../class/sub/MultiTypeAlias/main.kt | 6 ++++ .../sub/TypeAlias/TypeAlias_verification.xml | 3 ++ .../hierarchy/class/sub/TypeAlias/main.kt | 5 +++ .../MultiTypeAlias_verification.xml | 5 +++ .../class/super/MultiTypeAlias/main.kt | 6 ++++ .../TypeAlias/TypeAlias_verification.xml | 5 +++ .../hierarchy/class/super/TypeAlias/main.kt | 5 +++ .../hierarchy/HierarchyTestGenerated.java | 24 +++++++++++++ 11 files changed, 98 insertions(+), 6 deletions(-) create mode 100644 idea/testData/hierarchy/class/sub/MultiTypeAlias/MultiTypeAlias_verification.xml create mode 100644 idea/testData/hierarchy/class/sub/MultiTypeAlias/main.kt create mode 100644 idea/testData/hierarchy/class/sub/TypeAlias/TypeAlias_verification.xml create mode 100644 idea/testData/hierarchy/class/sub/TypeAlias/main.kt create mode 100644 idea/testData/hierarchy/class/super/MultiTypeAlias/MultiTypeAlias_verification.xml create mode 100644 idea/testData/hierarchy/class/super/MultiTypeAlias/main.kt create mode 100644 idea/testData/hierarchy/class/super/TypeAlias/TypeAlias_verification.xml create mode 100644 idea/testData/hierarchy/class/super/TypeAlias/main.kt diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/TargetPlatformDetector.java b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/TargetPlatformDetector.java index ca5fceb72b9..3e61e8e32f8 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/TargetPlatformDetector.java +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/TargetPlatformDetector.java @@ -51,10 +51,16 @@ public class TargetPlatformDetector { return contextFile instanceof KtFile ? getPlatform((KtFile) contextFile) : JvmPlatform.INSTANCE; } + return getPlatform((PsiFile) file); + } + + public static TargetPlatform getPlatform(@NotNull PsiFile file) { + VirtualFile virtualFile = file.getOriginalFile().getVirtualFile(); if (virtualFile == null) { return getDefaultPlatform(file); } + Module moduleForFile = ProjectFileIndex.SERVICE.getInstance(file.getProject()).getModuleForFile(virtualFile); if (moduleForFile == null) { return getDefaultPlatform(file); @@ -69,7 +75,7 @@ public class TargetPlatformDetector { } @NotNull - private static TargetPlatform getDefaultPlatform(@NotNull KtFile file) { + private static TargetPlatform getDefaultPlatform(@NotNull PsiFile file) { LOG.info("Using default platform for file: " + file.getName()); return JvmPlatform.INSTANCE; } diff --git a/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinDirectInheritorsSearcher.kt b/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinDirectInheritorsSearcher.kt index 46c6cd44dd8..ad4372f1e29 100644 --- a/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinDirectInheritorsSearcher.kt +++ b/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinDirectInheritorsSearcher.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.idea.search.ideaExtensions import com.intellij.openapi.application.QueryExecutorBase +import com.intellij.openapi.progress.ProgressManager import com.intellij.psi.PsiClass import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.searches.DirectClassInheritorsSearch @@ -25,6 +26,7 @@ import org.jetbrains.kotlin.idea.decompiler.navigation.SourceNavigationHelper import org.jetbrains.kotlin.idea.search.fileScope import org.jetbrains.kotlin.idea.stubindex.KotlinSourceFilterScope import org.jetbrains.kotlin.idea.stubindex.KotlinSuperClassIndex +import org.jetbrains.kotlin.idea.stubindex.KotlinTypeAliasByExpansionShortNameIndex import org.jetbrains.kotlin.idea.util.application.runReadAction open class KotlinDirectInheritorsSearcher : QueryExecutorBase(true) { @@ -36,13 +38,35 @@ open class KotlinDirectInheritorsSearcher : QueryExecutorBase SourceNavigationHelper.getOriginalPsiClassOrCreateLightClass(candidate) } - .filter { candidate -> candidate.isInheritor(baseClass, false) } - .forEach { candidate -> consumer.process(candidate) } + + names.forEach { name -> + KotlinSuperClassIndex.getInstance() + .get(name, baseClass.project, noLibrarySourceScope).asSequence() + .mapNotNull { candidate -> SourceNavigationHelper.getOriginalPsiClassOrCreateLightClass(candidate) } + .filter { candidate -> candidate.isInheritor(baseClass, false) } + .forEach { candidate -> consumer.process(candidate) } + } } } } diff --git a/idea/testData/hierarchy/class/sub/MultiTypeAlias/MultiTypeAlias_verification.xml b/idea/testData/hierarchy/class/sub/MultiTypeAlias/MultiTypeAlias_verification.xml new file mode 100644 index 00000000000..5eb28f53f32 --- /dev/null +++ b/idea/testData/hierarchy/class/sub/MultiTypeAlias/MultiTypeAlias_verification.xml @@ -0,0 +1,3 @@ + + + diff --git a/idea/testData/hierarchy/class/sub/MultiTypeAlias/main.kt b/idea/testData/hierarchy/class/sub/MultiTypeAlias/main.kt new file mode 100644 index 00000000000..57823391913 --- /dev/null +++ b/idea/testData/hierarchy/class/sub/MultiTypeAlias/main.kt @@ -0,0 +1,6 @@ +open class A + +typealias TA = A +typealias TTA = A + +class B : TTA() \ No newline at end of file diff --git a/idea/testData/hierarchy/class/sub/TypeAlias/TypeAlias_verification.xml b/idea/testData/hierarchy/class/sub/TypeAlias/TypeAlias_verification.xml new file mode 100644 index 00000000000..5eb28f53f32 --- /dev/null +++ b/idea/testData/hierarchy/class/sub/TypeAlias/TypeAlias_verification.xml @@ -0,0 +1,3 @@ + + + diff --git a/idea/testData/hierarchy/class/sub/TypeAlias/main.kt b/idea/testData/hierarchy/class/sub/TypeAlias/main.kt new file mode 100644 index 00000000000..64726854f08 --- /dev/null +++ b/idea/testData/hierarchy/class/sub/TypeAlias/main.kt @@ -0,0 +1,5 @@ +open class A + +typealias TA = A + +class B : TA() \ No newline at end of file diff --git a/idea/testData/hierarchy/class/super/MultiTypeAlias/MultiTypeAlias_verification.xml b/idea/testData/hierarchy/class/super/MultiTypeAlias/MultiTypeAlias_verification.xml new file mode 100644 index 00000000000..8674422de98 --- /dev/null +++ b/idea/testData/hierarchy/class/super/MultiTypeAlias/MultiTypeAlias_verification.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/idea/testData/hierarchy/class/super/MultiTypeAlias/main.kt b/idea/testData/hierarchy/class/super/MultiTypeAlias/main.kt new file mode 100644 index 00000000000..9093b2af188 --- /dev/null +++ b/idea/testData/hierarchy/class/super/MultiTypeAlias/main.kt @@ -0,0 +1,6 @@ +open class A + +typealias TA = A +typealias TTA = A + +class B : TTA() \ No newline at end of file diff --git a/idea/testData/hierarchy/class/super/TypeAlias/TypeAlias_verification.xml b/idea/testData/hierarchy/class/super/TypeAlias/TypeAlias_verification.xml new file mode 100644 index 00000000000..8674422de98 --- /dev/null +++ b/idea/testData/hierarchy/class/super/TypeAlias/TypeAlias_verification.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/idea/testData/hierarchy/class/super/TypeAlias/main.kt b/idea/testData/hierarchy/class/super/TypeAlias/main.kt new file mode 100644 index 00000000000..808a82a10cc --- /dev/null +++ b/idea/testData/hierarchy/class/super/TypeAlias/main.kt @@ -0,0 +1,5 @@ +open class A + +typealias TA = A + +class B : TA() \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/hierarchy/HierarchyTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/hierarchy/HierarchyTestGenerated.java index af17b208391..1b37e753beb 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/hierarchy/HierarchyTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/hierarchy/HierarchyTestGenerated.java @@ -227,11 +227,23 @@ public class HierarchyTestGenerated extends AbstractHierarchyTest { doSuperClassHierarchyTest(fileName); } + @TestMetadata("MultiTypeAlias") + public void testMultiTypeAlias() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/hierarchy/class/super/MultiTypeAlias/"); + doSuperClassHierarchyTest(fileName); + } + @TestMetadata("TwoTraits") public void testTwoTraits() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/hierarchy/class/super/TwoTraits/"); doSuperClassHierarchyTest(fileName); } + + @TestMetadata("TypeAlias") + public void testTypeAlias() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/hierarchy/class/super/TypeAlias/"); + doSuperClassHierarchyTest(fileName); + } } @TestMetadata("idea/testData/hierarchy/class/sub") @@ -266,6 +278,12 @@ public class HierarchyTestGenerated extends AbstractHierarchyTest { doSubClassHierarchyTest(fileName); } + @TestMetadata("MultiTypeAlias") + public void testMultiTypeAlias() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/hierarchy/class/sub/MultiTypeAlias/"); + doSubClassHierarchyTest(fileName); + } + @TestMetadata("ObjectFromClass") public void testObjectFromClass() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/hierarchy/class/sub/ObjectFromClass/"); @@ -289,6 +307,12 @@ public class HierarchyTestGenerated extends AbstractHierarchyTest { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/hierarchy/class/sub/TraitFromTrait/"); doSubClassHierarchyTest(fileName); } + + @TestMetadata("TypeAlias") + public void testTypeAlias() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/hierarchy/class/sub/TypeAlias/"); + doSubClassHierarchyTest(fileName); + } } @TestMetadata("idea/testData/hierarchy/calls/callers")