From bb19d4c5989372eb7fc05fbda9d5f41a258db449 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 2 Oct 2018 18:31:03 +0300 Subject: [PATCH] Do not create expect / actual markers for parameters & enum entries Part of KT-26957 --- .../markers/KotlinLineMarkerProvider.kt | 31 +++++++++++++++++-- .../common/common.kt | 7 +++++ .../jvm/jvm.kt | 1 + .../common/common.kt | 5 +++ .../actualEnumEntriesInOneLine/jvm/jvm.kt | 3 ++ .../common/common.kt | 5 +++ .../jvm/jvm.kt | 3 ++ .../common/common.kt | 3 ++ .../expectEnumEntriesInOneLine/jvm/jvm.kt | 4 +++ .../MultiModuleLineMarkerTestGenerated.java | 20 ++++++++++++ 10 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 idea/testData/multiModuleLineMarker/actualConstructorWithProperties/common/common.kt create mode 100644 idea/testData/multiModuleLineMarker/actualConstructorWithProperties/jvm/jvm.kt create mode 100644 idea/testData/multiModuleLineMarker/actualEnumEntriesInOneLine/common/common.kt create mode 100644 idea/testData/multiModuleLineMarker/actualEnumEntriesInOneLine/jvm/jvm.kt create mode 100644 idea/testData/multiModuleLineMarker/expectConstructorWithProperties/common/common.kt create mode 100644 idea/testData/multiModuleLineMarker/expectConstructorWithProperties/jvm/jvm.kt create mode 100644 idea/testData/multiModuleLineMarker/expectEnumEntriesInOneLine/common/common.kt create mode 100644 idea/testData/multiModuleLineMarker/expectEnumEntriesInOneLine/jvm/jvm.kt 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 8dc03b81173..d910ef7804b 100644 --- a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/KotlinLineMarkerProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/KotlinLineMarkerProvider.kt @@ -13,6 +13,7 @@ import com.intellij.codeInsight.daemon.impl.PsiElementListNavigator import com.intellij.codeInsight.navigation.ListBackgroundUpdaterTask import com.intellij.icons.AllIcons import com.intellij.openapi.actionSystem.IdeActions +import com.intellij.openapi.editor.Document import com.intellij.openapi.editor.colors.CodeInsightColors import com.intellij.openapi.editor.colors.EditorColorsManager import com.intellij.openapi.editor.markup.GutterIconRenderer @@ -37,11 +38,13 @@ import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor import org.jetbrains.kotlin.idea.core.isInheritable import org.jetbrains.kotlin.idea.core.isOverridable import org.jetbrains.kotlin.idea.core.toDescriptor +import org.jetbrains.kotlin.idea.editor.fixers.startLine import org.jetbrains.kotlin.idea.presentation.DeclarationByModuleRenderer import org.jetbrains.kotlin.idea.search.declarationsSearch.toPossiblyFakeLightMethods import org.jetbrains.kotlin.idea.util.* import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject import org.jetbrains.kotlin.psi.psiUtil.getPrevSiblingIgnoringWhitespaceAndComments import java.awt.event.MouseEvent import java.util.* @@ -340,11 +343,35 @@ private fun collectMultiplatformMarkers( } } +private fun Document?.areAnchorsOnOneLine( + first: KtNamedDeclaration, + second: KtNamedDeclaration? +): Boolean { + if (this == null || second == null) return false + val firstAnchor = first.expectOrActualAnchor + val secondAnchor = second.expectOrActualAnchor + return firstAnchor.startLine(this) == secondAnchor.startLine(this) +} + +private fun KtNamedDeclaration.requiresNoMarkers(): Boolean { + val document = PsiDocumentManager.getInstance(project).getDocument(containingFile) + when (this) { + is KtPrimaryConstructor -> { + return true + } + is KtParameter, + is KtEnumEntry -> if (document.areAnchorsOnOneLine(this, containingClassOrObject)) { + return true + } + } + return false +} + private fun collectActualMarkers( declaration: KtNamedDeclaration, result: MutableCollection> ) { - if (declaration is KtPrimaryConstructor) return + if (declaration.requiresNoMarkers()) return val descriptor = declaration.toDescriptor() as? MemberDescriptor ?: return val commonModuleDescriptor = declaration.containingKtFile.findModuleDescriptor() @@ -374,7 +401,7 @@ private fun collectExpectedMarkers( declaration: KtNamedDeclaration, result: MutableCollection> ) { - if (declaration is KtPrimaryConstructor) return + if (declaration.requiresNoMarkers()) return val descriptor = declaration.toDescriptor() as? MemberDescriptor ?: return val platformModuleDescriptor = declaration.containingKtFile.findModuleDescriptor() diff --git a/idea/testData/multiModuleLineMarker/actualConstructorWithProperties/common/common.kt b/idea/testData/multiModuleLineMarker/actualConstructorWithProperties/common/common.kt new file mode 100644 index 00000000000..d439590fd92 --- /dev/null +++ b/idea/testData/multiModuleLineMarker/actualConstructorWithProperties/common/common.kt @@ -0,0 +1,7 @@ +// !CHECK_HIGHLIGHTING + +expect class WithConstructor(x: Int, s: String) { + val x: Int + + val s: String +} \ No newline at end of file diff --git a/idea/testData/multiModuleLineMarker/actualConstructorWithProperties/jvm/jvm.kt b/idea/testData/multiModuleLineMarker/actualConstructorWithProperties/jvm/jvm.kt new file mode 100644 index 00000000000..b7e353ffa64 --- /dev/null +++ b/idea/testData/multiModuleLineMarker/actualConstructorWithProperties/jvm/jvm.kt @@ -0,0 +1 @@ +actual class WithConstructor actual constructor(actual val x: Int, actual val s: String) diff --git a/idea/testData/multiModuleLineMarker/actualEnumEntriesInOneLine/common/common.kt b/idea/testData/multiModuleLineMarker/actualEnumEntriesInOneLine/common/common.kt new file mode 100644 index 00000000000..c84a85da665 --- /dev/null +++ b/idea/testData/multiModuleLineMarker/actualEnumEntriesInOneLine/common/common.kt @@ -0,0 +1,5 @@ +// !CHECK_HIGHLIGHTING + +package test + +expect enum class Enum { A, B, C } \ No newline at end of file diff --git a/idea/testData/multiModuleLineMarker/actualEnumEntriesInOneLine/jvm/jvm.kt b/idea/testData/multiModuleLineMarker/actualEnumEntriesInOneLine/jvm/jvm.kt new file mode 100644 index 00000000000..ca49aaa4b60 --- /dev/null +++ b/idea/testData/multiModuleLineMarker/actualEnumEntriesInOneLine/jvm/jvm.kt @@ -0,0 +1,3 @@ +package test + +actual enum class Enum { A, B, C } \ No newline at end of file diff --git a/idea/testData/multiModuleLineMarker/expectConstructorWithProperties/common/common.kt b/idea/testData/multiModuleLineMarker/expectConstructorWithProperties/common/common.kt new file mode 100644 index 00000000000..7a5e725d644 --- /dev/null +++ b/idea/testData/multiModuleLineMarker/expectConstructorWithProperties/common/common.kt @@ -0,0 +1,5 @@ +expect class WithConstructor(x: Int, s: String) { + val x: Int + + val s: String +} \ No newline at end of file diff --git a/idea/testData/multiModuleLineMarker/expectConstructorWithProperties/jvm/jvm.kt b/idea/testData/multiModuleLineMarker/expectConstructorWithProperties/jvm/jvm.kt new file mode 100644 index 00000000000..d15170bc825 --- /dev/null +++ b/idea/testData/multiModuleLineMarker/expectConstructorWithProperties/jvm/jvm.kt @@ -0,0 +1,3 @@ +// !CHECK_HIGHLIGHTING + +actual class WithConstructor actual constructor(actual val x: Int, actual val s: String) diff --git a/idea/testData/multiModuleLineMarker/expectEnumEntriesInOneLine/common/common.kt b/idea/testData/multiModuleLineMarker/expectEnumEntriesInOneLine/common/common.kt new file mode 100644 index 00000000000..1cd143e045b --- /dev/null +++ b/idea/testData/multiModuleLineMarker/expectEnumEntriesInOneLine/common/common.kt @@ -0,0 +1,3 @@ +package test + +expect enum class Enum { A, B, C, D } \ No newline at end of file diff --git a/idea/testData/multiModuleLineMarker/expectEnumEntriesInOneLine/jvm/jvm.kt b/idea/testData/multiModuleLineMarker/expectEnumEntriesInOneLine/jvm/jvm.kt new file mode 100644 index 00000000000..1f8b92815fa --- /dev/null +++ b/idea/testData/multiModuleLineMarker/expectEnumEntriesInOneLine/jvm/jvm.kt @@ -0,0 +1,4 @@ +// !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 1733b7d6321..b14a58e08b6 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiModuleLineMarkerTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiModuleLineMarkerTestGenerated.java @@ -25,6 +25,11 @@ public class MultiModuleLineMarkerTestGenerated extends AbstractMultiModuleLineM KotlinTestUtils.runTest(this::doTest, TargetBackend.ANY, testDataFilePath); } + @TestMetadata("actualConstructorWithProperties") + public void testActualConstructorWithProperties() throws Exception { + runTest("idea/testData/multiModuleLineMarker/actualConstructorWithProperties/"); + } + @TestMetadata("actualDerived") public void testActualDerived() throws Exception { runTest("idea/testData/multiModuleLineMarker/actualDerived/"); @@ -35,15 +40,30 @@ public class MultiModuleLineMarkerTestGenerated extends AbstractMultiModuleLineM runTest("idea/testData/multiModuleLineMarker/actualEnumEntries/"); } + @TestMetadata("actualEnumEntriesInOneLine") + public void testActualEnumEntriesInOneLine() throws Exception { + runTest("idea/testData/multiModuleLineMarker/actualEnumEntriesInOneLine/"); + } + public void testAllFilesPresentInMultiModuleLineMarker() throws Exception { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/multiModuleLineMarker"), Pattern.compile("^([^\\.]+)$"), TargetBackend.ANY, false); } + @TestMetadata("expectConstructorWithProperties") + public void testExpectConstructorWithProperties() throws Exception { + runTest("idea/testData/multiModuleLineMarker/expectConstructorWithProperties/"); + } + @TestMetadata("expectEnumEntries") public void testExpectEnumEntries() throws Exception { runTest("idea/testData/multiModuleLineMarker/expectEnumEntries/"); } + @TestMetadata("expectEnumEntriesInOneLine") + public void testExpectEnumEntriesInOneLine() throws Exception { + runTest("idea/testData/multiModuleLineMarker/expectEnumEntriesInOneLine/"); + } + @TestMetadata("fromActualAnnotation") public void testFromActualAnnotation() throws Exception { runTest("idea/testData/multiModuleLineMarker/fromActualAnnotation/");