From 5ddb7c71d13459540ff6d6f352aa21a345a320a7 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Thu, 19 Apr 2018 15:27:33 +0200 Subject: [PATCH] Mpp resolve: fix actual/expect declaration lookup Previously we would look fo expect declaration in common dependencies as opposed to looking inside the module exclusively --- .../resolve/multiplatform/ExpectedActualResolver.kt | 11 ++++++++--- .../multiplatform/depends/a_common/common.kt | 1 + .../multiplatform/depends/b_jvm_dep(a-common)/jvm.kt | 3 ++- .../multiplatform/triangle/base_common/My.kt | 3 ++- .../triangle/derived_jvm_dep(base-common)/impl.kt | 3 +++ .../triangleWithDependency/base_common/My.kt | 4 +++- .../derived_jvm_dep(base-common)/impl.kt | 3 ++- 7 files changed, 21 insertions(+), 7 deletions(-) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/multiplatform/ExpectedActualResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/multiplatform/ExpectedActualResolver.kt index 4c6108316ef..b64dd9ed690 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/multiplatform/ExpectedActualResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/multiplatform/ExpectedActualResolver.kt @@ -125,11 +125,12 @@ object ExpectedActualResolver { is FunctionDescriptor -> scopes.flatMap { it.getContributedFunctions(name, NoLookupLocation.FOR_ALREADY_TRACKED) } is PropertyDescriptor -> scopes.flatMap { it.getContributedVariables(name, NoLookupLocation.FOR_ALREADY_TRACKED) } else -> throw AssertionError("Unsupported declaration: $this") - } + }.onlyFromThis(module) } private fun ClassifierDescriptorWithTypeParameters.findClassifiersFromModule( - module: ModuleDescriptor + module: ModuleDescriptor, + includeDependencies: Boolean = false ): Collection { val classId = classId ?: return emptyList() @@ -139,6 +140,7 @@ object ExpectedActualResolver { val segments = classId.relativeClassName.pathSegments() var classifiers = module.getPackage(classId.packageFqName).memberScope.getAllClassifiers(segments.first()) + if (!includeDependencies) classifiers = classifiers.onlyFromThis(module) for (name in segments.subList(1, segments.size)) { classifiers = classifiers.mapNotNull { classifier -> @@ -151,6 +153,9 @@ object ExpectedActualResolver { return classifiers } + private fun Iterable.onlyFromThis(module: ModuleDescriptor): List = + filter { it.module == module } + sealed class Compatibility { // For IncompatibilityKind.STRONG `actual` declaration is considered as overload and error reports on expected declaration enum class IncompatibilityKind { @@ -322,7 +327,7 @@ object ExpectedActualResolver { return expected is ClassifierDescriptorWithTypeParameters && expected.isExpect && actual is ClassifierDescriptorWithTypeParameters && - expected.findClassifiersFromModule(platformModule).any { classifier -> + expected.findClassifiersFromModule(platformModule, includeDependencies = true).any { classifier -> // Note that it's fine to only check that this "actual typealias" expands to the expected class, without checking // whether the type arguments in the expansion are in the correct order or have the correct variance, because we only // allow simple cases like "actual typealias Foo = FooImpl", see DeclarationsChecker#checkActualTypeAlias diff --git a/idea/testData/multiModuleHighlighting/multiplatform/depends/a_common/common.kt b/idea/testData/multiModuleHighlighting/multiplatform/depends/a_common/common.kt index 2b091d063d1..87831ad72f6 100644 --- a/idea/testData/multiModuleHighlighting/multiplatform/depends/a_common/common.kt +++ b/idea/testData/multiModuleHighlighting/multiplatform/depends/a_common/common.kt @@ -1 +1,2 @@ expect class My +expect fun bar() \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/multiplatform/depends/b_jvm_dep(a-common)/jvm.kt b/idea/testData/multiModuleHighlighting/multiplatform/depends/b_jvm_dep(a-common)/jvm.kt index 43ec49aaf7a..01aabd94c4c 100644 --- a/idea/testData/multiModuleHighlighting/multiplatform/depends/b_jvm_dep(a-common)/jvm.kt +++ b/idea/testData/multiModuleHighlighting/multiplatform/depends/b_jvm_dep(a-common)/jvm.kt @@ -1 +1,2 @@ -class My \ No newline at end of file +class My +fun bar() {} \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/multiplatform/triangle/base_common/My.kt b/idea/testData/multiModuleHighlighting/multiplatform/triangle/base_common/My.kt index 023d50bcba5..87831ad72f6 100644 --- a/idea/testData/multiModuleHighlighting/multiplatform/triangle/base_common/My.kt +++ b/idea/testData/multiModuleHighlighting/multiplatform/triangle/base_common/My.kt @@ -1 +1,2 @@ -expect class My \ No newline at end of file +expect class My +expect fun bar() \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/multiplatform/triangle/derived_jvm_dep(base-common)/impl.kt b/idea/testData/multiModuleHighlighting/multiplatform/triangle/derived_jvm_dep(base-common)/impl.kt index 24e8106e93f..f473934d4a0 100644 --- a/idea/testData/multiModuleHighlighting/multiplatform/triangle/derived_jvm_dep(base-common)/impl.kt +++ b/idea/testData/multiModuleHighlighting/multiplatform/triangle/derived_jvm_dep(base-common)/impl.kt @@ -1,3 +1,6 @@ class My +fun bar() { + +} actual fun foo(my: Any) {} \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/multiplatform/triangleWithDependency/base_common/My.kt b/idea/testData/multiModuleHighlighting/multiplatform/triangleWithDependency/base_common/My.kt index 023d50bcba5..817309d72f3 100644 --- a/idea/testData/multiModuleHighlighting/multiplatform/triangleWithDependency/base_common/My.kt +++ b/idea/testData/multiModuleHighlighting/multiplatform/triangleWithDependency/base_common/My.kt @@ -1 +1,3 @@ -expect class My \ No newline at end of file +expect class My + +expect fun bar() \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/multiplatform/triangleWithDependency/derived_jvm_dep(base-common)/impl.kt b/idea/testData/multiModuleHighlighting/multiplatform/triangleWithDependency/derived_jvm_dep(base-common)/impl.kt index c79e944e0ce..588abee1bcd 100644 --- a/idea/testData/multiModuleHighlighting/multiplatform/triangleWithDependency/derived_jvm_dep(base-common)/impl.kt +++ b/idea/testData/multiModuleHighlighting/multiplatform/triangleWithDependency/derived_jvm_dep(base-common)/impl.kt @@ -1,3 +1,4 @@ -class My +class My +fun bar() {} actual fun foo(my: My) {} \ No newline at end of file