From 6424b6760fc2d75bc7592980b8a38a1e295e30a9 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Thu, 17 Aug 2017 17:33:03 +0300 Subject: [PATCH] Remove StorageComponentContainerContributor::onContainerComposed Rename addDeclarations -> registerModuleComponents Use it to provide SamWithReceiverResolver extensions instead Post construction on container composition can be achieved but manually inserting injections where it seems appropriate is bug prone This fixes a bug where SamWithReceiverPlugin extension was not registered for some containers in IDE which led to incorrect highlighting in IDE Add IDE test for applying SamWithReceiver plugin #KT-18062 Fixed --- .../compiler/TopDownAnalyzerFacadeForJVM.kt | 4 -- .../kotlin/frontend/java/di/injection.kt | 8 ++-- .../java/sam/SamConversionResolverImpl.kt | 7 +++- .../load/java/sam/SamWithReceiverResolver.kt | 16 +------- .../kotlin/resolve/jvm/JvmAnalyzerFacade.kt | 2 - .../jvm/platform/JvmPlatformConfigurator.kt | 2 + .../StorageComponentContainerContributor.kt | 7 +--- .../jetbrains/kotlin/frontend/di/injection.kt | 2 +- .../java/components/SamConversionResolver.kt | 2 +- .../load/kotlin/reflect/RuntimeModuleData.kt | 2 +- idea/idea.iml | 1 + .../m1/annotations.kt | 4 ++ .../m1/javaInterface/API.java | 8 ++++ .../m1/javaInterface/InterfaceM1A.java | 6 +++ .../m1/javaInterface/InterfaceM1B.java | 6 +++ .../samWithReceiverExtension/m1/m1.kt | 31 +++++++++++++++ .../m2/javaInterface/InterfaceM2A.java | 6 +++ .../m2/javaInterface/InterfaceM2B.java | 6 +++ .../samWithReceiverExtension/m2/m2.kt | 31 +++++++++++++++ .../resolve/MultiModuleHighlightingTest.kt | 21 ++++++++++ .../synthetic/AndroidComponentRegistrar.kt | 20 +++++----- plugins/noarg/noarg-cli/src/NoArgPlugin.kt | 11 ++++-- ...IdeStorageComponentContainerContributor.kt | 11 ++++-- .../src/SamWithReceiverPlugin.kt | 17 ++++---- .../src/SamWithReceiverResolverExtension.kt | 4 +- .../IdeSamWithReceiverComponentContributor.kt | 39 ++++++++++++------- 26 files changed, 199 insertions(+), 75 deletions(-) create mode 100644 idea/testData/multiModuleHighlighting/samWithReceiverExtension/m1/annotations.kt create mode 100644 idea/testData/multiModuleHighlighting/samWithReceiverExtension/m1/javaInterface/API.java create mode 100644 idea/testData/multiModuleHighlighting/samWithReceiverExtension/m1/javaInterface/InterfaceM1A.java create mode 100644 idea/testData/multiModuleHighlighting/samWithReceiverExtension/m1/javaInterface/InterfaceM1B.java create mode 100644 idea/testData/multiModuleHighlighting/samWithReceiverExtension/m1/m1.kt create mode 100644 idea/testData/multiModuleHighlighting/samWithReceiverExtension/m2/javaInterface/InterfaceM2A.java create mode 100644 idea/testData/multiModuleHighlighting/samWithReceiverExtension/m2/javaInterface/InterfaceM2B.java create mode 100644 idea/testData/multiModuleHighlighting/samWithReceiverExtension/m2/m2.kt diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/TopDownAnalyzerFacadeForJVM.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/TopDownAnalyzerFacadeForJVM.kt index dbcb05c779e..a9299d41c18 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/TopDownAnalyzerFacadeForJVM.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/TopDownAnalyzerFacadeForJVM.kt @@ -174,8 +174,6 @@ object TopDownAnalyzerFacadeForJVM { packagePartProvider(dependencyScope), moduleClassResolver, jvmTarget, languageVersionSettings, configureJavaClassFinder ) - StorageComponentContainerContributor.getInstances(project).forEach { it.onContainerComposed(dependenciesContainer, null) } - moduleClassResolver.compiledCodeResolver = dependenciesContainer.get() dependenciesContext.setDependencies(listOfNotNull(dependenciesContext.module, optionalBuiltInsModule)) @@ -202,8 +200,6 @@ object TopDownAnalyzerFacadeForJVM { ).apply { initJvmBuiltInsForTopDownAnalysis() (partProvider as? IncrementalPackagePartProvider)?.deserializationConfiguration = get() - - StorageComponentContainerContributor.getInstances(project).forEach { it.onContainerComposed(this, null) } } moduleClassResolver.sourceCodeResolver = container.get() diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/frontend/java/di/injection.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/frontend/java/di/injection.kt index 4b6e5328001..69ed2dcd1b3 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/frontend/java/di/injection.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/frontend/java/di/injection.kt @@ -29,11 +29,11 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.PackagePartProvider import org.jetbrains.kotlin.frontend.di.configureModule import org.jetbrains.kotlin.incremental.components.LookupTracker -import org.jetbrains.kotlin.load.java.* +import org.jetbrains.kotlin.load.java.AbstractJavaClassFinder +import org.jetbrains.kotlin.load.java.InternalFlexibleTypeTransformer +import org.jetbrains.kotlin.load.java.JavaClassFinderImpl import org.jetbrains.kotlin.load.java.components.* import org.jetbrains.kotlin.load.java.lazy.ModuleClassResolver -import org.jetbrains.kotlin.load.java.sam.SamConversionResolverImpl -import org.jetbrains.kotlin.load.java.sam.SamWithReceiverResolver import org.jetbrains.kotlin.load.kotlin.DeserializationComponentsForJava import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory import org.jetbrains.kotlin.platform.JvmBuiltIns @@ -64,8 +64,6 @@ private fun StorageComponentContainer.configureJavaTopDownAnalysis( useImpl() useImpl() useImpl() - useInstance(SamWithReceiverResolver()) - useImpl() useInstance(InternalFlexibleTypeTransformer) useImpl() diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/sam/SamConversionResolverImpl.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/sam/SamConversionResolverImpl.kt index c1411b4de1c..8b99c1c2a72 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/sam/SamConversionResolverImpl.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/sam/SamConversionResolverImpl.kt @@ -21,13 +21,16 @@ import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.types.SimpleType -class SamConversionResolverImpl(val storageManager: StorageManager, val samWithReceiverResolver: SamWithReceiverResolver): SamConversionResolver { +class SamConversionResolverImpl( + storageManager: StorageManager, + private val samWithReceiverResolvers: Iterable +): SamConversionResolver { private val functionTypesForSamInterfaces = storageManager.createCacheWithNullableValues() override fun resolveFunctionTypeIfSamInterface(classDescriptor: JavaClassDescriptor): SimpleType? { return functionTypesForSamInterfaces.computeIfAbsent(classDescriptor) { val abstractMethod = SingleAbstractMethodUtils.getSingleAbstractMethodOrNull(classDescriptor) ?: return@computeIfAbsent null - val shouldConvertFirstParameterToDescriptor = samWithReceiverResolver.shouldConvertFirstSamParameterToReceiver(abstractMethod) + val shouldConvertFirstParameterToDescriptor = samWithReceiverResolvers.any { it.shouldConvertFirstSamParameterToReceiver(abstractMethod) } SingleAbstractMethodUtils.getFunctionTypeForAbstractMethod(abstractMethod, shouldConvertFirstParameterToDescriptor) } } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/sam/SamWithReceiverResolver.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/sam/SamWithReceiverResolver.kt index c80f00d2fac..298dce2ff75 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/sam/SamWithReceiverResolver.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/sam/SamWithReceiverResolver.kt @@ -18,18 +18,6 @@ package org.jetbrains.kotlin.load.java.sam import org.jetbrains.kotlin.descriptors.FunctionDescriptor -class SamWithReceiverResolver { - private val extensions = mutableListOf() - - fun registerExtension(extension: Extension) { - extensions += extension - } - - fun shouldConvertFirstSamParameterToReceiver(function: FunctionDescriptor): Boolean { - return extensions.any { it.shouldConvertFirstSamParameterToReceiver(function) } - } - - interface Extension { - fun shouldConvertFirstSamParameterToReceiver(function: FunctionDescriptor): Boolean - } +interface SamWithReceiverResolver { + fun shouldConvertFirstSamParameterToReceiver(function: FunctionDescriptor): Boolean } \ No newline at end of file diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/JvmAnalyzerFacade.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/JvmAnalyzerFacade.kt index 8a7b4ea4eb5..396074aee87 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/JvmAnalyzerFacade.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/JvmAnalyzerFacade.kt @@ -100,8 +100,6 @@ object JvmAnalyzerFacade : AnalyzerFacade() { useBuiltInsProvider = false // TODO: load built-ins from module dependencies in IDE ) - StorageComponentContainerContributor.getInstances(project).forEach { it.onContainerComposed(container, moduleInfo) } - val resolveSession = container.get() val javaDescriptorResolver = container.get() diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatformConfigurator.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatformConfigurator.kt index e679950ddb2..9326bb48973 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatformConfigurator.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatformConfigurator.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.resolve.jvm.platform import org.jetbrains.kotlin.container.StorageComponentContainer import org.jetbrains.kotlin.container.useImpl import org.jetbrains.kotlin.container.useInstance +import org.jetbrains.kotlin.load.java.sam.SamConversionResolverImpl import org.jetbrains.kotlin.platform.JavaToKotlinClassMap import org.jetbrains.kotlin.resolve.PlatformConfigurator import org.jetbrains.kotlin.resolve.calls.checkers.ReifiedTypeParameterSubstitutionChecker @@ -83,6 +84,7 @@ object JvmPlatformConfigurator : PlatformConfigurator( override fun configureModuleComponents(container: StorageComponentContainer) { container.useImpl() container.useImpl() + container.useImpl() container.useImpl() container.useImpl() container.useImpl() diff --git a/compiler/frontend/src/org/jetbrains/kotlin/extensions/StorageComponentContainerContributor.kt b/compiler/frontend/src/org/jetbrains/kotlin/extensions/StorageComponentContainerContributor.kt index 7065ba5c9e9..ca84a579c79 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/extensions/StorageComponentContainerContributor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/extensions/StorageComponentContainerContributor.kt @@ -16,9 +16,8 @@ package org.jetbrains.kotlin.extensions -import org.jetbrains.kotlin.analyzer.ModuleInfo -import org.jetbrains.kotlin.container.ComponentProvider import org.jetbrains.kotlin.container.StorageComponentContainer +import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.resolve.TargetPlatform interface StorageComponentContainerContributor { @@ -26,7 +25,5 @@ interface StorageComponentContainerContributor { "org.jetbrains.kotlin.storageComponentContainerContributor", StorageComponentContainerContributor::class.java ) - fun addDeclarations(container: StorageComponentContainer, platform: TargetPlatform) {} - - fun onContainerComposed(container: ComponentProvider, moduleInfo: ModuleInfo?) {} + fun registerModuleComponents(container: StorageComponentContainer, platform: TargetPlatform, moduleDescriptor: ModuleDescriptor) {} } \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/kotlin/frontend/di/injection.kt b/compiler/frontend/src/org/jetbrains/kotlin/frontend/di/injection.kt index 0ac7d8320f4..97b3c80befb 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/frontend/di/injection.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/frontend/di/injection.kt @@ -53,7 +53,7 @@ fun StorageComponentContainer.configureModule( platform.platformConfigurator.configureModuleComponents(this) for (extension in StorageComponentContainerContributor.getInstances(moduleContext.project)) { - extension.addDeclarations(this, platform) + extension.registerModuleComponents(this, platform, moduleContext.module) } configurePlatformIndependentComponents() diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/components/SamConversionResolver.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/components/SamConversionResolver.kt index 5ab0f045525..3ba793e2ec1 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/components/SamConversionResolver.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/components/SamConversionResolver.kt @@ -20,7 +20,7 @@ import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor import org.jetbrains.kotlin.types.SimpleType interface SamConversionResolver { - companion object EMPTY : SamConversionResolver { + object Empty : SamConversionResolver { override fun resolveFunctionTypeIfSamInterface(classDescriptor: JavaClassDescriptor): SimpleType? = null } diff --git a/core/descriptors.runtime/src/org/jetbrains/kotlin/load/kotlin/reflect/RuntimeModuleData.kt b/core/descriptors.runtime/src/org/jetbrains/kotlin/load/kotlin/reflect/RuntimeModuleData.kt index d7cdc51d00d..91f099bc17d 100644 --- a/core/descriptors.runtime/src/org/jetbrains/kotlin/load/kotlin/reflect/RuntimeModuleData.kt +++ b/core/descriptors.runtime/src/org/jetbrains/kotlin/load/kotlin/reflect/RuntimeModuleData.kt @@ -63,7 +63,7 @@ class RuntimeModuleData private constructor( val globalJavaResolverContext = JavaResolverComponents( storageManager, ReflectJavaClassFinder(classLoader), reflectKotlinClassFinder, deserializedDescriptorResolver, ExternalAnnotationResolver.EMPTY, SignaturePropagator.DO_NOTHING, RuntimeErrorReporter, javaResolverCache, - JavaPropertyInitializerEvaluator.DoNothing, SamConversionResolver, RuntimeSourceElementFactory, singleModuleClassResolver, + JavaPropertyInitializerEvaluator.DoNothing, SamConversionResolver.Empty, RuntimeSourceElementFactory, singleModuleClassResolver, runtimePackagePartProvider, SupertypeLoopChecker.EMPTY, LookupTracker.DO_NOTHING, module, ReflectionTypes(module, notFoundClasses), annotationTypeQualifierResolver, diff --git a/idea/idea.iml b/idea/idea.iml index 4a9ebb1a2c6..206f2359734 100644 --- a/idea/idea.iml +++ b/idea/idea.iml @@ -70,5 +70,6 @@ + \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/samWithReceiverExtension/m1/annotations.kt b/idea/testData/multiModuleHighlighting/samWithReceiverExtension/m1/annotations.kt new file mode 100644 index 00000000000..0dc060541bb --- /dev/null +++ b/idea/testData/multiModuleHighlighting/samWithReceiverExtension/m1/annotations.kt @@ -0,0 +1,4 @@ +package anno + +annotation class A +annotation class B \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/samWithReceiverExtension/m1/javaInterface/API.java b/idea/testData/multiModuleHighlighting/samWithReceiverExtension/m1/javaInterface/API.java new file mode 100644 index 00000000000..5d291312882 --- /dev/null +++ b/idea/testData/multiModuleHighlighting/samWithReceiverExtension/m1/javaInterface/API.java @@ -0,0 +1,8 @@ +package javaInterface; + +public class API { + public void useM1A(InterfaceM1A m1A); + public void useM1B(InterfaceM1B m1B); + public void useM2A(InterfaceM2A m1A); + public void useM2B(InterfaceM2B m1B); +} \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/samWithReceiverExtension/m1/javaInterface/InterfaceM1A.java b/idea/testData/multiModuleHighlighting/samWithReceiverExtension/m1/javaInterface/InterfaceM1A.java new file mode 100644 index 00000000000..f87b0b69af8 --- /dev/null +++ b/idea/testData/multiModuleHighlighting/samWithReceiverExtension/m1/javaInterface/InterfaceM1A.java @@ -0,0 +1,6 @@ +package javaInterface; + +@anno.A +interface InterfaceM1A { + void foo(T t); +} \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/samWithReceiverExtension/m1/javaInterface/InterfaceM1B.java b/idea/testData/multiModuleHighlighting/samWithReceiverExtension/m1/javaInterface/InterfaceM1B.java new file mode 100644 index 00000000000..491f8df5d63 --- /dev/null +++ b/idea/testData/multiModuleHighlighting/samWithReceiverExtension/m1/javaInterface/InterfaceM1B.java @@ -0,0 +1,6 @@ +package javaInterface; + +@anno.B +interface InterfaceM1B { + void foo(T t); +} \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/samWithReceiverExtension/m1/m1.kt b/idea/testData/multiModuleHighlighting/samWithReceiverExtension/m1/m1.kt new file mode 100644 index 00000000000..25882c2afb1 --- /dev/null +++ b/idea/testData/multiModuleHighlighting/samWithReceiverExtension/m1/m1.kt @@ -0,0 +1,31 @@ +package m1 + +public fun testUseAsReceiver(api: javaInterface.API) { + api.useM1A { + this.length + } + api.useM1B { + this.length + } + api.useM2A { + this.length + } + api.useM2B { + this.length + } +} + +public fun testUseAsParameter(api: javaInterface.API) { + api.useM1A { + it.length + } + api.useM1B { + it.length + } + api.useM2A { + it.length + } + api.useM2B { + it.length + } +} \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/samWithReceiverExtension/m2/javaInterface/InterfaceM2A.java b/idea/testData/multiModuleHighlighting/samWithReceiverExtension/m2/javaInterface/InterfaceM2A.java new file mode 100644 index 00000000000..cd52c785def --- /dev/null +++ b/idea/testData/multiModuleHighlighting/samWithReceiverExtension/m2/javaInterface/InterfaceM2A.java @@ -0,0 +1,6 @@ +package javaInterface; + +@anno.A +interface InterfaceM2A { + void foo(T t); +} \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/samWithReceiverExtension/m2/javaInterface/InterfaceM2B.java b/idea/testData/multiModuleHighlighting/samWithReceiverExtension/m2/javaInterface/InterfaceM2B.java new file mode 100644 index 00000000000..104b87c48e7 --- /dev/null +++ b/idea/testData/multiModuleHighlighting/samWithReceiverExtension/m2/javaInterface/InterfaceM2B.java @@ -0,0 +1,6 @@ +package javaInterface; + +@anno.B +interface InterfaceM2B { + void foo(T t); +} \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/samWithReceiverExtension/m2/m2.kt b/idea/testData/multiModuleHighlighting/samWithReceiverExtension/m2/m2.kt new file mode 100644 index 00000000000..c0ef0806076 --- /dev/null +++ b/idea/testData/multiModuleHighlighting/samWithReceiverExtension/m2/m2.kt @@ -0,0 +1,31 @@ +package m2 + +public fun testUseAsReceiver(api: javaInterface.API) { + api.useM1A { + this.length + } + api.useM1B { + this.length + } + api.useM2A { + this.length + } + api.useM2B { + this.length + } +} + +public fun testUseAsParameter(api: javaInterface.API) { + api.useM1A { + it.length + } + api.useM1B { + it.length + } + api.useM2A { + it.length + } + api.useM2B { + it.length + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiModuleHighlightingTest.kt b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiModuleHighlightingTest.kt index 42e15ea8c57..9096edf509f 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiModuleHighlightingTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/MultiModuleHighlightingTest.kt @@ -44,6 +44,8 @@ import org.jetbrains.kotlin.idea.test.PluginTestCaseBase import org.jetbrains.kotlin.idea.util.application.executeWriteCommand import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.idea.util.projectStructure.sdk +import org.jetbrains.kotlin.samWithReceiver.SamWithReceiverCommandLineProcessor.Companion.ANNOTATION_OPTION +import org.jetbrains.kotlin.samWithReceiver.SamWithReceiverCommandLineProcessor.Companion.PLUGIN_ID import org.jetbrains.kotlin.test.TestJdkKind.FULL_JDK open class MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() { @@ -193,6 +195,25 @@ open class MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() { checkHighlightingInAllFiles() } + fun testSamWithReceiverExtension() { + val module1 = module("m1").setupKotlinFacet { + settings.compilerArguments!!.pluginOptions = + arrayOf("plugin:${PLUGIN_ID}:${ANNOTATION_OPTION.name}=anno.A") + } + + val module2 = module("m2").setupKotlinFacet { + settings.compilerArguments!!.pluginOptions = + arrayOf("plugin:${PLUGIN_ID}:${ANNOTATION_OPTION.name}=anno.B") + } + + + module1.addDependency(module2) + module2.addDependency(module1) + + checkHighlightingInAllFiles() + } + + private fun Module.setupKotlinFacet(configure: KotlinFacetConfiguration.() -> Unit) = apply { runWriteAction { val facet = FacetManager.getInstance(this).addFacet(KotlinFacetType.INSTANCE, KotlinFacetType.NAME, null) diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/AndroidComponentRegistrar.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/AndroidComponentRegistrar.kt index 48a657b183b..337299b7c97 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/AndroidComponentRegistrar.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/AndroidComponentRegistrar.kt @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.android.synthetic import com.intellij.mock.MockProject -import com.intellij.openapi.extensions.Extensions import com.intellij.openapi.project.Project import kotlinx.android.extensions.CacheImplementation import org.jetbrains.kotlin.android.parcel.ParcelableCodegenExtension @@ -25,8 +24,8 @@ import org.jetbrains.kotlin.android.parcel.ParcelableDeclarationChecker import org.jetbrains.kotlin.android.parcel.ParcelableResolveExtension import org.jetbrains.kotlin.android.synthetic.codegen.CliAndroidExtensionsExpressionCodegenExtension import org.jetbrains.kotlin.android.synthetic.codegen.CliAndroidOnDestroyClassBuilderInterceptorExtension +import org.jetbrains.kotlin.android.synthetic.codegen.ParcelableClinitClassBuilderInterceptorExtension import org.jetbrains.kotlin.android.synthetic.diagnostic.AndroidExtensionPropertiesCallChecker -import org.jetbrains.kotlin.android.synthetic.diagnostic.DefaultErrorMessagesAndroid import org.jetbrains.kotlin.android.synthetic.res.AndroidLayoutXmlFileManager import org.jetbrains.kotlin.android.synthetic.res.AndroidVariant import org.jetbrains.kotlin.android.synthetic.res.CliAndroidLayoutXmlFileManager @@ -41,13 +40,12 @@ import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfigurationKey import org.jetbrains.kotlin.container.StorageComponentContainer import org.jetbrains.kotlin.container.useInstance -import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages +import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.extensions.StorageComponentContainerContributor import org.jetbrains.kotlin.resolve.TargetPlatform +import org.jetbrains.kotlin.resolve.extensions.SyntheticResolveExtension import org.jetbrains.kotlin.resolve.jvm.extensions.PackageFragmentProviderExtension import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform -import org.jetbrains.kotlin.android.synthetic.codegen.ParcelableClinitClassBuilderInterceptorExtension -import org.jetbrains.kotlin.resolve.extensions.SyntheticResolveExtension object AndroidConfigurationKeys { val VARIANT = CompilerConfigurationKey.create>("Android build variant") @@ -130,10 +128,12 @@ class AndroidComponentRegistrar : ComponentRegistrar { } class AndroidExtensionPropertiesComponentContainerContributor : StorageComponentContainerContributor { - override fun addDeclarations(container: StorageComponentContainer, platform: TargetPlatform) { - if (platform is JvmPlatform) { - container.useInstance(AndroidExtensionPropertiesCallChecker()) - container.useInstance(ParcelableDeclarationChecker()) - } + override fun registerModuleComponents( + container: StorageComponentContainer, platform: TargetPlatform, moduleDescriptor: ModuleDescriptor + ) { + if (platform != JvmPlatform) return + + container.useInstance(AndroidExtensionPropertiesCallChecker()) + container.useInstance(ParcelableDeclarationChecker()) } } \ No newline at end of file diff --git a/plugins/noarg/noarg-cli/src/NoArgPlugin.kt b/plugins/noarg/noarg-cli/src/NoArgPlugin.kt index ee58a084422..50eda0797e3 100644 --- a/plugins/noarg/noarg-cli/src/NoArgPlugin.kt +++ b/plugins/noarg/noarg-cli/src/NoArgPlugin.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfigurationKey import org.jetbrains.kotlin.container.StorageComponentContainer import org.jetbrains.kotlin.container.useInstance +import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.extensions.StorageComponentContainerContributor import org.jetbrains.kotlin.noarg.NoArgCommandLineProcessor.Companion.SUPPORTED_PRESETS import org.jetbrains.kotlin.noarg.NoArgConfigurationKeys.ANNOTATION @@ -89,9 +90,11 @@ class NoArgComponentRegistrar : ComponentRegistrar { } class CliNoArgComponentContainerContributor(val annotations: List) : StorageComponentContainerContributor { - override fun addDeclarations(container: StorageComponentContainer, platform: TargetPlatform) { - if (platform is JvmPlatform) { - container.useInstance(CliNoArgDeclarationChecker(annotations)) - } + override fun registerModuleComponents( + container: StorageComponentContainer, platform: TargetPlatform, moduleDescriptor: ModuleDescriptor + ) { + if (platform != JvmPlatform) return + + container.useInstance(CliNoArgDeclarationChecker(annotations)) } } \ No newline at end of file diff --git a/plugins/noarg/noarg-ide/src/IdeStorageComponentContainerContributor.kt b/plugins/noarg/noarg-ide/src/IdeStorageComponentContainerContributor.kt index b04cb8aa031..cfb6762be81 100644 --- a/plugins/noarg/noarg-ide/src/IdeStorageComponentContainerContributor.kt +++ b/plugins/noarg/noarg-ide/src/IdeStorageComponentContainerContributor.kt @@ -19,14 +19,17 @@ package org.jetbrains.kotlin.noarg.ide import com.intellij.openapi.project.Project import org.jetbrains.kotlin.container.StorageComponentContainer import org.jetbrains.kotlin.container.useInstance +import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.extensions.StorageComponentContainerContributor import org.jetbrains.kotlin.resolve.TargetPlatform import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform class IdeNoArgComponentContainerContributor(val project: Project) : StorageComponentContainerContributor { - override fun addDeclarations(container: StorageComponentContainer, platform: TargetPlatform) { - if (platform is JvmPlatform) { - container.useInstance(IdeNoArgDeclarationChecker(project)) - } + override fun registerModuleComponents( + container: StorageComponentContainer, platform: TargetPlatform, moduleDescriptor: ModuleDescriptor + ) { + if (platform != JvmPlatform) return + + container.useInstance(IdeNoArgDeclarationChecker(project)) } } \ No newline at end of file diff --git a/plugins/sam-with-receiver/sam-with-receiver-cli/src/SamWithReceiverPlugin.kt b/plugins/sam-with-receiver/sam-with-receiver-cli/src/SamWithReceiverPlugin.kt index ae50ca78724..6b535e54cbd 100644 --- a/plugins/sam-with-receiver/sam-with-receiver-cli/src/SamWithReceiverPlugin.kt +++ b/plugins/sam-with-receiver/sam-with-receiver-cli/src/SamWithReceiverPlugin.kt @@ -17,20 +17,21 @@ package org.jetbrains.kotlin.samWithReceiver import com.intellij.mock.MockProject -import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.compiler.plugin.CliOption import org.jetbrains.kotlin.compiler.plugin.CliOptionProcessingException import org.jetbrains.kotlin.compiler.plugin.CommandLineProcessor import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfigurationKey -import org.jetbrains.kotlin.container.ComponentProvider -import org.jetbrains.kotlin.container.get +import org.jetbrains.kotlin.container.StorageComponentContainer +import org.jetbrains.kotlin.container.useInstance +import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.extensions.StorageComponentContainerContributor -import org.jetbrains.kotlin.load.java.sam.SamWithReceiverResolver +import org.jetbrains.kotlin.resolve.TargetPlatform +import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform +import org.jetbrains.kotlin.samWithReceiver.SamWithReceiverCommandLineProcessor.Companion.SUPPORTED_PRESETS import org.jetbrains.kotlin.samWithReceiver.SamWithReceiverConfigurationKeys.ANNOTATION import org.jetbrains.kotlin.samWithReceiver.SamWithReceiverConfigurationKeys.PRESET -import org.jetbrains.kotlin.samWithReceiver.SamWithReceiverCommandLineProcessor.Companion.SUPPORTED_PRESETS object SamWithReceiverConfigurationKeys { val ANNOTATION: CompilerConfigurationKey> = @@ -75,7 +76,9 @@ class SamWithReceiverComponentRegistrar : ComponentRegistrar { } class CliSamWithReceiverComponentContributor(val annotations: List): StorageComponentContainerContributor { - override fun onContainerComposed(container: ComponentProvider, moduleInfo: ModuleInfo?) { - container.get().registerExtension(SamWithReceiverResolverExtension(annotations)) + override fun registerModuleComponents(container: StorageComponentContainer, platform: TargetPlatform, moduleDescriptor: ModuleDescriptor) { + if (platform != JvmPlatform) return + + container.useInstance(SamWithReceiverResolverExtension(annotations)) } } \ No newline at end of file diff --git a/plugins/sam-with-receiver/sam-with-receiver-cli/src/SamWithReceiverResolverExtension.kt b/plugins/sam-with-receiver/sam-with-receiver-cli/src/SamWithReceiverResolverExtension.kt index ab17a5dcd2c..4aa0d533c5b 100644 --- a/plugins/sam-with-receiver/sam-with-receiver-cli/src/SamWithReceiverResolverExtension.kt +++ b/plugins/sam-with-receiver/sam-with-receiver-cli/src/SamWithReceiverResolverExtension.kt @@ -22,7 +22,9 @@ import org.jetbrains.kotlin.extensions.AnnotationBasedExtension import org.jetbrains.kotlin.load.java.sam.SamWithReceiverResolver import org.jetbrains.kotlin.psi.KtModifierListOwner -class SamWithReceiverResolverExtension(val annotations: List) : SamWithReceiverResolver.Extension, AnnotationBasedExtension { +class SamWithReceiverResolverExtension( + private val annotations: List +) : SamWithReceiverResolver, AnnotationBasedExtension { override fun getAnnotationFqNames(modifierListOwner: KtModifierListOwner?) = annotations override fun shouldConvertFirstSamParameterToReceiver(function: FunctionDescriptor): Boolean { diff --git a/plugins/sam-with-receiver/sam-with-receiver-ide/src/IdeSamWithReceiverComponentContributor.kt b/plugins/sam-with-receiver/sam-with-receiver-ide/src/IdeSamWithReceiverComponentContributor.kt index 1995be33637..ac4e664085f 100644 --- a/plugins/sam-with-receiver/sam-with-receiver-ide/src/IdeSamWithReceiverComponentContributor.kt +++ b/plugins/sam-with-receiver/sam-with-receiver-ide/src/IdeSamWithReceiverComponentContributor.kt @@ -19,20 +19,22 @@ package org.jetbrains.kotlin.samWithReceiver.ide import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project import com.intellij.openapi.roots.ProjectRootModificationTracker -import com.intellij.psi.util.CachedValueProvider.* +import com.intellij.psi.util.CachedValueProvider.Result import com.intellij.psi.util.CachedValuesManager import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.annotation.plugin.ide.getSpecialAnnotations -import org.jetbrains.kotlin.container.ComponentProvider -import org.jetbrains.kotlin.container.get +import org.jetbrains.kotlin.container.StorageComponentContainer +import org.jetbrains.kotlin.container.useInstance +import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.extensions.StorageComponentContainerContributor import org.jetbrains.kotlin.idea.caches.resolve.ModuleProductionSourceInfo import org.jetbrains.kotlin.idea.caches.resolve.ScriptDependenciesModuleInfo import org.jetbrains.kotlin.idea.caches.resolve.ScriptModuleInfo -import org.jetbrains.kotlin.load.java.sam.SamWithReceiverResolver -import org.jetbrains.kotlin.samWithReceiver.SamWithReceiverResolverExtension -import org.jetbrains.kotlin.samWithReceiver.SamWithReceiverCommandLineProcessor.Companion.PLUGIN_ID +import org.jetbrains.kotlin.resolve.TargetPlatform +import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform import org.jetbrains.kotlin.samWithReceiver.SamWithReceiverCommandLineProcessor.Companion.ANNOTATION_OPTION +import org.jetbrains.kotlin.samWithReceiver.SamWithReceiverCommandLineProcessor.Companion.PLUGIN_ID +import org.jetbrains.kotlin.samWithReceiver.SamWithReceiverResolverExtension import java.util.* class IdeSamWithReceiverComponentContributor(val project: Project) : StorageComponentContainerContributor { @@ -48,14 +50,23 @@ class IdeSamWithReceiverComponentContributor(val project: Project) : StorageComp return cache.value.getOrPut(module) { module.getSpecialAnnotations(ANNOTATION_OPTION_PREFIX) } } - override fun onContainerComposed(container: ComponentProvider, moduleInfo: ModuleInfo?) { - val annotations = when (moduleInfo) { - is ScriptModuleInfo -> moduleInfo.scriptDefinition.annotationsForSamWithReceivers - is ScriptDependenciesModuleInfo -> moduleInfo.scriptModuleInfo?.scriptDefinition?.annotationsForSamWithReceivers - is ModuleProductionSourceInfo -> getAnnotationsForModule(moduleInfo.module) - else -> null - } ?: return - container.get().registerExtension(SamWithReceiverResolverExtension(annotations)) + override fun registerModuleComponents( + container: StorageComponentContainer, + platform: TargetPlatform, + moduleDescriptor: ModuleDescriptor + ) { + if (platform != JvmPlatform) return + + val moduleInfo = moduleDescriptor.getCapability(ModuleInfo.Capability) + val annotations = + when (moduleInfo) { + is ScriptModuleInfo -> moduleInfo.scriptDefinition.annotationsForSamWithReceivers + is ScriptDependenciesModuleInfo -> moduleInfo.scriptModuleInfo?.scriptDefinition?.annotationsForSamWithReceivers + is ModuleProductionSourceInfo -> getAnnotationsForModule(moduleInfo.module) + else -> null + } ?: return + + container.useInstance(SamWithReceiverResolverExtension(annotations)) } } \ No newline at end of file