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
This commit is contained in:
+10
-10
@@ -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<List<String>>("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())
|
||||
}
|
||||
}
|
||||
@@ -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<String>) : 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))
|
||||
}
|
||||
}
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
@@ -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<List<String>> =
|
||||
@@ -75,7 +76,9 @@ class SamWithReceiverComponentRegistrar : ComponentRegistrar {
|
||||
}
|
||||
|
||||
class CliSamWithReceiverComponentContributor(val annotations: List<String>): StorageComponentContainerContributor {
|
||||
override fun onContainerComposed(container: ComponentProvider, moduleInfo: ModuleInfo?) {
|
||||
container.get<SamWithReceiverResolver>().registerExtension(SamWithReceiverResolverExtension(annotations))
|
||||
override fun registerModuleComponents(container: StorageComponentContainer, platform: TargetPlatform, moduleDescriptor: ModuleDescriptor) {
|
||||
if (platform != JvmPlatform) return
|
||||
|
||||
container.useInstance(SamWithReceiverResolverExtension(annotations))
|
||||
}
|
||||
}
|
||||
+3
-1
@@ -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<String>) : SamWithReceiverResolver.Extension, AnnotationBasedExtension {
|
||||
class SamWithReceiverResolverExtension(
|
||||
private val annotations: List<String>
|
||||
) : SamWithReceiverResolver, AnnotationBasedExtension {
|
||||
override fun getAnnotationFqNames(modifierListOwner: KtModifierListOwner?) = annotations
|
||||
|
||||
override fun shouldConvertFirstSamParameterToReceiver(function: FunctionDescriptor): Boolean {
|
||||
|
||||
+25
-14
@@ -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<SamWithReceiverResolver>().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))
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user