From de7159879458b7a99d1f1a5432338042032fef23 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Thu, 29 Mar 2018 16:16:36 +0200 Subject: [PATCH] Fix line markers for actual enum entries #KT-22632 Fixed --- .../org/jetbrains/kotlin/idea/KotlinIconProvider.kt | 4 ++-- .../jetbrains/kotlin/idea/util/expectActualUtil.kt | 11 +++++++++-- .../goto/KotlinExpectOrActualGotoRelatedProvider.kt | 2 +- .../highlighter/markers/KotlinLineMarkerProvider.kt | 2 +- .../actualEnumEntries/common/common.kt | 9 +++++++++ .../actualEnumEntries/jvm/jvm.kt | 8 ++++++++ .../expectEnumEntries/common/common.kt | 7 +++++++ .../expectEnumEntries/jvm/jvm.kt | 9 +++++++++ .../resolve/MultiModuleLineMarkerTestGenerated.java | 12 ++++++++++++ 9 files changed, 58 insertions(+), 6 deletions(-) create mode 100644 idea/testData/multiModuleLineMarker/actualEnumEntries/common/common.kt create mode 100644 idea/testData/multiModuleLineMarker/actualEnumEntries/jvm/jvm.kt create mode 100644 idea/testData/multiModuleLineMarker/expectEnumEntries/common/common.kt create mode 100644 idea/testData/multiModuleLineMarker/expectEnumEntries/jvm/jvm.kt diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/KotlinIconProvider.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/KotlinIconProvider.kt index dce0bee1756..72ea2565020 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/KotlinIconProvider.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/KotlinIconProvider.kt @@ -28,7 +28,7 @@ import org.jetbrains.kotlin.asJava.classes.KtLightClassForSourceDeclaration import org.jetbrains.kotlin.idea.KotlinIcons.ACTUAL import org.jetbrains.kotlin.idea.KotlinIcons.EXPECT import org.jetbrains.kotlin.idea.caches.lightClasses.KtLightClassForDecompiledDeclaration -import org.jetbrains.kotlin.idea.util.isActualDeclaration +import org.jetbrains.kotlin.idea.util.hasMatchingExpected import org.jetbrains.kotlin.idea.util.isExpectDeclaration import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* @@ -137,7 +137,7 @@ private fun Icon.addExpectActualMarker(element: PsiElement): Icon { val declaration = (element as? KtNamedDeclaration) ?: return this val additionalIcon = when { declaration.isExpectDeclaration() -> EXPECT - declaration.isActualDeclaration() -> ACTUAL + declaration.hasMatchingExpected() -> ACTUAL else -> return this } return RowIcon(2).apply { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/expectActualUtil.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/expectActualUtil.kt index 4578af6071b..c171636d03f 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/expectActualUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/expectActualUtil.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject import org.jetbrains.kotlin.psi.psiUtil.hasActualModifier import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils +import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.multiplatform.ExpectedActualResolver @@ -114,8 +115,14 @@ private fun KtClassOrObject.isExpected(): Boolean { return this.hasExpectModifier() || this.descriptor.safeAs()?.isExpect == true } -fun KtDeclaration.isActualDeclaration(): Boolean { +fun KtDeclaration.hasMatchingExpected() = (toDescriptor() as? MemberDescriptor)?.expectedDescriptor() != null + +fun KtDeclaration.isEffectivelyActual(): Boolean { if (hasActualModifier()) return true - return (toDescriptor() as? MemberDescriptor)?.isActual == true + val descriptor = toDescriptor() as? MemberDescriptor ?: return false + return descriptor.isActual || descriptor.isEnumEntryInActual() } + +private fun MemberDescriptor.isEnumEntryInActual() = + (DescriptorUtils.isEnumEntry(this) && (containingDeclaration as? MemberDescriptor)?.isActual == true) diff --git a/idea/src/org/jetbrains/kotlin/idea/goto/KotlinExpectOrActualGotoRelatedProvider.kt b/idea/src/org/jetbrains/kotlin/idea/goto/KotlinExpectOrActualGotoRelatedProvider.kt index 2cada09af98..83a74985257 100644 --- a/idea/src/org/jetbrains/kotlin/idea/goto/KotlinExpectOrActualGotoRelatedProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/goto/KotlinExpectOrActualGotoRelatedProvider.kt @@ -35,7 +35,7 @@ class KotlinExpectOrActualGotoRelatedProvider : GotoRelatedProvider() { val declaration = psiElement.getParentOfTypeAndBranch { nameIdentifier } ?: return emptyList() val targets = when { declaration.isExpectDeclaration() -> declaration.actualsForExpected() - declaration.isActualDeclaration() -> listOfNotNull(declaration.expectedDeclarationIfAny()) + declaration.isEffectivelyActual() -> listOfNotNull(declaration.expectedDeclarationIfAny()) else -> emptyList() } return targets.map(::ActualOrExpectGotoRelatedItem) diff --git a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/KotlinLineMarkerProvider.kt b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/KotlinLineMarkerProvider.kt index 83cb8d91ef1..c20bcdcdedf 100644 --- a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/KotlinLineMarkerProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/KotlinLineMarkerProvider.kt @@ -123,7 +123,7 @@ class KotlinLineMarkerProvider : LineMarkerProvider { if (element.isExpectDeclaration()) { collectActualMarkers(element, result) } - else if (element.isActualDeclaration()) { + else if (element.isEffectivelyActual()) { collectExpectedMarkers(element, result) } } diff --git a/idea/testData/multiModuleLineMarker/actualEnumEntries/common/common.kt b/idea/testData/multiModuleLineMarker/actualEnumEntries/common/common.kt new file mode 100644 index 00000000000..34cb45a4055 --- /dev/null +++ b/idea/testData/multiModuleLineMarker/actualEnumEntries/common/common.kt @@ -0,0 +1,9 @@ +// !CHECK_HIGHLIGHTING + +package test + +expect enum class Enum { + A, + B, + C +} \ No newline at end of file diff --git a/idea/testData/multiModuleLineMarker/actualEnumEntries/jvm/jvm.kt b/idea/testData/multiModuleLineMarker/actualEnumEntries/jvm/jvm.kt new file mode 100644 index 00000000000..c7848f8b937 --- /dev/null +++ b/idea/testData/multiModuleLineMarker/actualEnumEntries/jvm/jvm.kt @@ -0,0 +1,8 @@ +package test + +actual enum class Enum { + A, + B, + C, + D +} \ No newline at end of file diff --git a/idea/testData/multiModuleLineMarker/expectEnumEntries/common/common.kt b/idea/testData/multiModuleLineMarker/expectEnumEntries/common/common.kt new file mode 100644 index 00000000000..299bd98f447 --- /dev/null +++ b/idea/testData/multiModuleLineMarker/expectEnumEntries/common/common.kt @@ -0,0 +1,7 @@ +package test + +expect enum class Enum { + A, + B, + C +} \ No newline at end of file diff --git a/idea/testData/multiModuleLineMarker/expectEnumEntries/jvm/jvm.kt b/idea/testData/multiModuleLineMarker/expectEnumEntries/jvm/jvm.kt new file mode 100644 index 00000000000..1feb02a477e --- /dev/null +++ b/idea/testData/multiModuleLineMarker/expectEnumEntries/jvm/jvm.kt @@ -0,0 +1,9 @@ +// !CHECK_HIGHLIGHTING +package test + +actual enum class Enum { + A, + B, + C, + D +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiModuleLineMarkerTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiModuleLineMarkerTestGenerated.java index 74e49b0beee..a4622f2d107 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiModuleLineMarkerTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiModuleLineMarkerTestGenerated.java @@ -21,10 +21,22 @@ import java.util.regex.Pattern; @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) public class MultiModuleLineMarkerTestGenerated extends AbstractMultiModuleLineMarkerTest { + @TestMetadata("actualEnumEntries") + public void testActualEnumEntries() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/multiModuleLineMarker/actualEnumEntries/"); + doTest(fileName); + } + public void testAllFilesPresentInMultiModuleLineMarker() throws Exception { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/multiModuleLineMarker"), Pattern.compile("^([^\\.]+)$"), TargetBackend.ANY, false); } + @TestMetadata("expectEnumEntries") + public void testExpectEnumEntries() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/multiModuleLineMarker/expectEnumEntries/"); + doTest(fileName); + } + @TestMetadata("fromActualAnnotation") public void testFromActualAnnotation() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/multiModuleLineMarker/fromActualAnnotation/");