From 395d595b224269d81ed6a45e11832994ce461305 Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Mon, 7 Oct 2019 19:06:42 +0300 Subject: [PATCH] Supply JVM and JS platforms when compile from CLI To be able to check descriptor's platform in frontend during plugin processing. This is needed for serialization plugin because some synthesized descriptors (annotation interface implementation) must be JVM-only (or the Native compilation fails). --- .../compiler/TopDownAnalyzerFacadeForJVM.kt | 20 ++++++++++--------- .../js/JsVersionRequirementTest.kt | 3 ++- .../js/analyze/TopDownAnalyzerFacadeForJS.kt | 3 ++- .../SerializationResolveExtension.kt | 4 +++- 4 files changed, 18 insertions(+), 12 deletions(-) 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 ad617594c4f..119f3fcb796 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 @@ -55,6 +55,7 @@ import org.jetbrains.kotlin.load.kotlin.incremental.IncrementalPackageFragmentPr import org.jetbrains.kotlin.load.kotlin.incremental.IncrementalPackagePartProvider import org.jetbrains.kotlin.modules.TargetId import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.platform.jvm.JvmPlatforms import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.* @@ -125,7 +126,11 @@ object TopDownAnalyzerFacadeForJVM { targetEnvironment: TargetEnvironment = CompilerEnvironment, sourceModuleSearchScope: GlobalSearchScope = newModuleSearchScope(project, files) ): ComponentProvider { - val moduleContext = createModuleContext(project, configuration) + val jvmTarget = configuration.get(JVMConfigurationKeys.JVM_TARGET, JvmTarget.DEFAULT) + val languageVersionSettings = configuration.languageVersionSettings + val jvmPlatform = JvmPlatforms.jvmPlatformByTargetVersion(jvmTarget) + + val moduleContext = createModuleContext(project, configuration, jvmPlatform) val storageManager = moduleContext.storageManager val module = moduleContext.module @@ -140,9 +145,6 @@ object TopDownAnalyzerFacadeForJVM { val sourceScope = if (separateModules) sourceModuleSearchScope else GlobalSearchScope.allScope(project) val moduleClassResolver = SourceOrBinaryModuleClassResolver(sourceScope) - val jvmTarget = configuration.get(JVMConfigurationKeys.JVM_TARGET, JvmTarget.DEFAULT) - val languageVersionSettings = configuration.languageVersionSettings - val fallbackBuiltIns = JvmBuiltIns(storageManager, JvmBuiltIns.Kind.FALLBACK).apply { initialize(builtInsModule, languageVersionSettings) }.builtInsModule @@ -161,14 +163,14 @@ object TopDownAnalyzerFacadeForJVM { val dependencyModule = if (separateModules) { val dependenciesContext = ContextForNewModule( moduleContext, Name.special(""), - module.builtIns, null + module.builtIns, jvmPlatform ) // Scope for the dependency module contains everything except files present in the scope for the source module val dependencyScope = GlobalSearchScope.notScope(sourceScope) val dependenciesContainer = createContainerForLazyResolveWithJava( - JvmPlatforms.jvmPlatformByTargetVersion(jvmTarget), + jvmPlatform, dependenciesContext, trace, DeclarationProviderFactory.EMPTY, dependencyScope, moduleClassResolver, targetEnvironment, lookupTracker, expectActualTracker, packagePartProvider(dependencyScope), languageVersionSettings, @@ -200,7 +202,7 @@ object TopDownAnalyzerFacadeForJVM { // to be stored in CliLightClassGenerationSupport, and it better be the source one (otherwise light classes would not be found) // TODO: get rid of duplicate invocation of CodeAnalyzerInitializer#initialize, or refactor CliLightClassGenerationSupport val container = createContainerForLazyResolveWithJava( - JvmPlatforms.jvmPlatformByTargetVersion(jvmTarget), + jvmPlatform, moduleContext, trace, declarationProviderFactory(storageManager, files), sourceScope, moduleClassResolver, targetEnvironment, lookupTracker, expectActualTracker, partProvider, languageVersionSettings, @@ -275,11 +277,11 @@ object TopDownAnalyzerFacadeForJVM { } } - private fun createModuleContext(project: Project, configuration: CompilerConfiguration): MutableModuleContext { + private fun createModuleContext(project: Project, configuration: CompilerConfiguration, platform: TargetPlatform?): MutableModuleContext { val projectContext = ProjectContext(project, "TopDownAnalyzer for JVM") val builtIns = JvmBuiltIns(projectContext.storageManager, JvmBuiltIns.Kind.FROM_DEPENDENCIES) return ContextForNewModule( - projectContext, Name.special("<${configuration.getNotNull(CommonConfigurationKeys.MODULE_NAME)}>"), builtIns, null + projectContext, Name.special("<${configuration.getNotNull(CommonConfigurationKeys.MODULE_NAME)}>"), builtIns, platform ).apply { builtIns.builtInsModule = module } diff --git a/compiler/tests/org/jetbrains/kotlin/serialization/js/JsVersionRequirementTest.kt b/compiler/tests/org/jetbrains/kotlin/serialization/js/JsVersionRequirementTest.kt index 0992f005a61..460cafd0ffd 100644 --- a/compiler/tests/org/jetbrains/kotlin/serialization/js/JsVersionRequirementTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/serialization/js/JsVersionRequirementTest.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.js.facade.MainCallParameters import org.jetbrains.kotlin.js.facade.TranslationResult import org.jetbrains.kotlin.js.resolve.JsPlatformAnalyzerServices import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.platform.js.JsPlatforms import org.jetbrains.kotlin.resolve.BindingTraceContext import org.jetbrains.kotlin.serialization.AbstractVersionRequirementTest import org.jetbrains.kotlin.test.ConfigurationKind @@ -78,7 +79,7 @@ class JsVersionRequirementTest : AbstractVersionRequirementTest() { val config = JsConfig(environment.project, environment.configuration) return ContextForNewModule( ProjectContext(environment.project, "ProjectContext"), - Name.special(""), JsPlatformAnalyzerServices.builtIns, null + Name.special(""), JsPlatformAnalyzerServices.builtIns, JsPlatforms.defaultJsPlatform ).apply { setDependencies(listOf(module) + config.moduleDescriptors + module.builtIns.builtInsModule) } diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/analyze/TopDownAnalyzerFacadeForJS.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/analyze/TopDownAnalyzerFacadeForJS.kt index c6e6cc2be6b..ecc23c854dd 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/analyze/TopDownAnalyzerFacadeForJS.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/analyze/TopDownAnalyzerFacadeForJS.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.js.config.JsConfig import org.jetbrains.kotlin.js.resolve.JsPlatformAnalyzerServices import org.jetbrains.kotlin.js.resolve.MODULE_KIND import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.platform.js.JsPlatforms import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.* import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory @@ -67,7 +68,7 @@ object TopDownAnalyzerFacadeForJS { ProjectContext(project, "TopDownAnalyzer for JS"), Name.special("<$moduleName>"), builtIns, - platform = null + platform = JsPlatforms.defaultJsPlatform ) val additionalPackages = mutableListOf() diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/extensions/SerializationResolveExtension.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/extensions/SerializationResolveExtension.kt index 553c5fe1d1a..a48b960c0eb 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/extensions/SerializationResolveExtension.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/extensions/SerializationResolveExtension.kt @@ -22,7 +22,9 @@ import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.SpecialNames +import org.jetbrains.kotlin.platform.jvm.isJvm import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.descriptorUtil.platform import org.jetbrains.kotlin.resolve.extensions.SyntheticResolveExtension import org.jetbrains.kotlin.resolve.lazy.LazyClassContext import org.jetbrains.kotlin.resolve.lazy.declarations.ClassMemberDeclarationProvider @@ -33,7 +35,7 @@ import java.util.* open class SerializationResolveExtension : SyntheticResolveExtension { override fun getSyntheticNestedClassNames(thisDescriptor: ClassDescriptor): List = when { - thisDescriptor.annotations.hasAnnotation(serialInfoFqName) -> listOf(SerialEntityNames.IMPL_NAME) + thisDescriptor.annotations.hasAnnotation(serialInfoFqName) && thisDescriptor.platform?.isJvm() == true -> listOf(SerialEntityNames.IMPL_NAME) thisDescriptor.isInternalSerializable && !thisDescriptor.hasCompanionObjectAsSerializer -> listOf(SerialEntityNames.SERIALIZER_CLASS_NAME) else -> listOf()