From 9290ec34dba16fecfaa00f31e916ac1a8e67917d Mon Sep 17 00:00:00 2001 From: Dmitry Savvinov Date: Mon, 12 Aug 2019 17:20:25 +0300 Subject: [PATCH] Provide proper platformSpecficContainer in CompositePlatformConfigurator Now, call 'configureDefaultCheckers' and 'configureExtensionsAndCheckers' from all childs configurators, instead of taking just container from CommonPlatformAnalyzerServices This is needed because some IDE services tend to re-create containers (in particular, PerFileAnalysisCache and ResolveElementCache do that to re-inject new trace) and use usual injection DSL, which, in particular, takes 'platformSpecificContainer'. Returning 'common'-conatiner leads to losing all platform-specific checkers. On the other hand, calling exactly 'configureDefaultCheckers' + 'configureExtensionsAndCheckers' should be correct, because that's how single-platform 'platformSpecificContainer' is composed (see PlatformConfiguratorBase), and in 'createContainerForCompositePlatform' we don't use 'platformSpecificContainer' anyways ^KT-23305 Fixed --- .../resolve/CompositeResolverForModuleFactory.kt | 11 ++++++----- .../platformSpecificChecksInCommon/common/common.kt | 7 +++++++ .../platformSpecificChecksInCommon/dependencies.txt | 1 + .../resolve/MultiplatformAnalysisTestGenerated.java | 5 +++++ 4 files changed, 19 insertions(+), 5 deletions(-) create mode 100644 idea/testData/multiplatform/platformSpecificChecksInCommon/common/common.kt create mode 100644 idea/testData/multiplatform/platformSpecificChecksInCommon/dependencies.txt diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/CompositeResolverForModuleFactory.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/CompositeResolverForModuleFactory.kt index ef08bebbd91..7627ec01f35 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/CompositeResolverForModuleFactory.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/CompositeResolverForModuleFactory.kt @@ -236,12 +236,13 @@ class CompositeAnalyzerServices(val services: List) : PlatformConfigurator { - // TODO(dsavvinov): this is actually a hack. Review callers of that method, think about how to refactor it - // Unfortunately, clients of that container will inject additional services into them, - // without knowing about composite platform (see LocalClassifierAnalyzer), so we can't just use [createContainerForCompositePlatform] - // here. Hopefully, platformSpecific container won't at least make things worse. override val platformSpecificContainer: StorageComponentContainer - get() = CommonPlatformAnalyzerServices.platformConfigurator.platformSpecificContainer + get() = composeContainer(this::class.java.simpleName) { + configureDefaultCheckers() + for (configurator in componentConfigurators) { + (configurator as PlatformConfiguratorBase).configureExtensionsAndCheckers(this) + } + } override fun configureModuleComponents(container: StorageComponentContainer) { componentConfigurators.forEach { it.configureModuleComponents(container) } diff --git a/idea/testData/multiplatform/platformSpecificChecksInCommon/common/common.kt b/idea/testData/multiplatform/platformSpecificChecksInCommon/common/common.kt new file mode 100644 index 00000000000..591ba308e21 --- /dev/null +++ b/idea/testData/multiplatform/platformSpecificChecksInCommon/common/common.kt @@ -0,0 +1,7 @@ +// !DIAGNOSTICS: -ABSTRACT_MEMBER_NOT_IMPLEMENTED + +// Implementing kotlin functions isn't allowed on JS +class A : (Int) -> Int + +// Array as upper bound isn't allowed on JVM +class B<T : Array<*>> \ No newline at end of file diff --git a/idea/testData/multiplatform/platformSpecificChecksInCommon/dependencies.txt b/idea/testData/multiplatform/platformSpecificChecksInCommon/dependencies.txt new file mode 100644 index 00000000000..2728b311acc --- /dev/null +++ b/idea/testData/multiplatform/platformSpecificChecksInCommon/dependencies.txt @@ -0,0 +1 @@ +MODULE common { platform=[JS, JVM, Native] } diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiplatformAnalysisTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiplatformAnalysisTestGenerated.java index 64aceb5f577..e4101e3904b 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiplatformAnalysisTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiplatformAnalysisTestGenerated.java @@ -94,6 +94,11 @@ public class MultiplatformAnalysisTestGenerated extends AbstractMultiplatformAna runTest("idea/testData/multiplatform/multilevelParents/"); } + @TestMetadata("platformSpecificChecksInCommon") + public void testPlatformSpecificChecksInCommon() throws Exception { + runTest("idea/testData/multiplatform/platformSpecificChecksInCommon/"); + } + @TestMetadata("qualifiedReceiver") public void testQualifiedReceiver() throws Exception { runTest("idea/testData/multiplatform/qualifiedReceiver/");