diff --git a/compiler/cli/cli-common/build.gradle.kts b/compiler/cli/cli-common/build.gradle.kts index 550cd181f1d..fb3862b075a 100644 --- a/compiler/cli/cli-common/build.gradle.kts +++ b/compiler/cli/cli-common/build.gradle.kts @@ -8,6 +8,7 @@ dependencies { api(project(":compiler:config")) api(project(":compiler:config.jvm")) api(project(":js:js.config")) + api(project(":wasm:wasm.config")) api(project(":native:kotlin-native-utils")) api(project(":compiler:plugin-api")) compileOnly(commonDependency("org.jetbrains.kotlin:kotlin-reflect")) { isTransitive = false } diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/platform/CommonPlatforms.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/platform/CommonPlatforms.kt index 134d03665fc..b96e48208a1 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/platform/CommonPlatforms.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/platform/CommonPlatforms.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.platform.jvm.JvmPlatforms.allJvmPlatforms import org.jetbrains.kotlin.platform.jvm.JvmPlatforms.unspecifiedJvmPlatform import org.jetbrains.kotlin.platform.konan.NativePlatforms.allNativePlatforms import org.jetbrains.kotlin.platform.konan.NativePlatforms.unspecifiedNativePlatform +import org.jetbrains.kotlin.platform.wasm.WasmPlatforms @Suppress("DEPRECATION_ERROR") object CommonPlatforms { @@ -23,6 +24,7 @@ object CommonPlatforms { setOf( unspecifiedJvmPlatform.single(), defaultJsPlatform.single(), + WasmPlatforms.Default.single(), unspecifiedNativePlatform.single() ) ), org.jetbrains.kotlin.analyzer.common.CommonPlatform { @@ -39,6 +41,7 @@ object CommonPlatforms { yieldAll(allJvmPlatforms) yieldAll(allNativePlatforms) yieldAll(allJsPlatforms) + yield(WasmPlatforms.Default) // TODO(dsavvinov): extensions points? }.toList() diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/PlatformConfiguratorBase.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/PlatformConfiguratorBase.kt index 7eb6b439289..190187d1119 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/PlatformConfiguratorBase.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/PlatformConfiguratorBase.kt @@ -98,7 +98,9 @@ private val DEFAULT_CLASH_RESOLVERS = listOf> PlatformExtensionsClashResolver.FallbackToDefault(DynamicTypesSettings(), DynamicTypesSettings::class.java), - PlatformExtensionsClashResolver.FirstWins(AbsentDescriptorHandler::class.java) + PlatformExtensionsClashResolver.FirstWins(AbsentDescriptorHandler::class.java), + + PlatformDiagnosticSuppressorClashesResolver() ) fun StorageComponentContainer.configureDefaultCheckers() { diff --git a/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/directives/TargetPlatformEnum.kt b/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/directives/TargetPlatformEnum.kt index 5b1c7012863..daf2b481772 100644 --- a/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/directives/TargetPlatformEnum.kt +++ b/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/directives/TargetPlatformEnum.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.test.directives import org.jetbrains.kotlin.config.JvmTarget import org.jetbrains.kotlin.platform.TargetPlatform +import org.jetbrains.kotlin.platform.WasmPlatform import org.jetbrains.kotlin.platform.js.JsPlatforms import org.jetbrains.kotlin.platform.jvm.JdkPlatform import org.jetbrains.kotlin.platform.jvm.JvmPlatforms @@ -19,6 +20,7 @@ enum class TargetPlatformEnum(val targetPlatform: TargetPlatform) { setOf( JdkPlatform(JvmTarget.DEFAULT), JsPlatforms.DefaultSimpleJsPlatform, + WasmPlatform, NativePlatformUnspecifiedTarget ) ) diff --git a/jps/jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt b/jps/jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt index f49de73af15..124f8c4d191 100644 --- a/jps/jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt +++ b/jps/jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt @@ -42,6 +42,7 @@ fun TargetPlatform.createArguments(init: (CommonCompilerArguments).() -> Unit = jvmTarget = (single() as? JdkPlatform)?.targetVersion?.description ?: JvmTarget.DEFAULT.description } isJs() -> K2JSCompilerArguments().apply { init() } + isWasm() -> K2JSCompilerArguments().apply { init() } isNative() -> K2NativeCompilerArguments().apply { init() } else -> error("Unknown platform $this") } diff --git a/jps/jps-common/src/org/jetbrains/kotlin/platform/IdePlatformKind.kt b/jps/jps-common/src/org/jetbrains/kotlin/platform/IdePlatformKind.kt index 6dbad82f753..56abeccf127 100644 --- a/jps/jps-common/src/org/jetbrains/kotlin/platform/IdePlatformKind.kt +++ b/jps/jps-common/src/org/jetbrains/kotlin/platform/IdePlatformKind.kt @@ -15,7 +15,7 @@ import org.jetbrains.kotlin.platform.impl.CommonIdePlatformKind import org.jetbrains.kotlin.platform.impl.JsIdePlatformKind import org.jetbrains.kotlin.platform.impl.JvmIdePlatformKind import org.jetbrains.kotlin.platform.impl.NativeIdePlatformKind -import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult +import org.jetbrains.kotlin.platform.impl.WasmIdePlatformKind abstract class IdePlatformKind { abstract fun supportsTargetPlatform(platform: TargetPlatform): Boolean @@ -54,6 +54,7 @@ abstract class IdePlatformKind { get() = listOf( JvmIdePlatformKind, JsIdePlatformKind, + WasmIdePlatformKind, CommonIdePlatformKind, NativeIdePlatformKind ) diff --git a/jps/jps-common/src/org/jetbrains/kotlin/platform/compat/compatConversions.kt b/jps/jps-common/src/org/jetbrains/kotlin/platform/compat/compatConversions.kt index 46a044c17bb..2ffdbee42d5 100644 --- a/jps/jps-common/src/org/jetbrains/kotlin/platform/compat/compatConversions.kt +++ b/jps/jps-common/src/org/jetbrains/kotlin/platform/compat/compatConversions.kt @@ -15,12 +15,15 @@ import org.jetbrains.kotlin.platform.impl.JsIdePlatformKind import org.jetbrains.kotlin.platform.impl.JvmIdePlatformKind import org.jetbrains.kotlin.platform.impl.NativeIdePlatformKind import org.jetbrains.kotlin.platform.JsPlatform +import org.jetbrains.kotlin.platform.WasmPlatform +import org.jetbrains.kotlin.platform.impl.WasmIdePlatformKind import org.jetbrains.kotlin.platform.js.JsPlatforms import org.jetbrains.kotlin.platform.jvm.JdkPlatform import org.jetbrains.kotlin.platform.jvm.JvmPlatform import org.jetbrains.kotlin.platform.jvm.JvmPlatforms import org.jetbrains.kotlin.platform.konan.NativePlatforms import org.jetbrains.kotlin.platform.konan.NativePlatform +import org.jetbrains.kotlin.platform.wasm.WasmPlatforms typealias OldPlatform = org.jetbrains.kotlin.resolve.TargetPlatform typealias NewPlatform = org.jetbrains.kotlin.platform.TargetPlatform @@ -51,6 +54,7 @@ fun IdePlatform<*, *>.toNewPlatform(): NewPlatform = when (this) { is CommonIdePlatformKind.Platform -> CommonPlatforms.defaultCommonPlatform is JvmIdePlatformKind.Platform -> JvmPlatforms.jvmPlatformByTargetVersion(this.version) is JsIdePlatformKind.Platform -> JsPlatforms.defaultJsPlatform + is WasmIdePlatformKind.Platform -> WasmPlatforms.Default is NativeIdePlatformKind.Platform -> NativePlatforms.unspecifiedNativePlatform else -> error("Unknown platform $this") } @@ -60,6 +64,7 @@ fun NewPlatform.toIdePlatform(): IdePlatform<*, *> = when (val single = singleOr is JdkPlatform -> JvmIdePlatformKind.Platform(single.targetVersion) is JvmPlatform -> JvmIdePlatformKind.Platform(JvmTarget.DEFAULT) is JsPlatform -> JsIdePlatformKind.Platform + is WasmPlatform -> WasmIdePlatformKind.Platform is NativePlatform -> NativeIdePlatformKind.Platform else -> error("Unknown platform $single") } diff --git a/jps/jps-common/src/org/jetbrains/kotlin/platform/impl/JsIdePlatformKind.kt b/jps/jps-common/src/org/jetbrains/kotlin/platform/impl/JsIdePlatformKind.kt index 0d99cbbe44c..31943d04b4b 100644 --- a/jps/jps-common/src/org/jetbrains/kotlin/platform/impl/JsIdePlatformKind.kt +++ b/jps/jps-common/src/org/jetbrains/kotlin/platform/impl/JsIdePlatformKind.kt @@ -21,7 +21,7 @@ object JsIdePlatformKind : IdePlatformKind() { override fun supportsTargetPlatform(platform: TargetPlatform): Boolean = platform.isJs() override fun platformByCompilerArguments(arguments: CommonCompilerArguments): TargetPlatform? { - return if (arguments is K2JSCompilerArguments) + return if (arguments is K2JSCompilerArguments && !arguments.wasm) JsPlatforms.defaultJsPlatform else null diff --git a/jps/jps-common/src/org/jetbrains/kotlin/platform/impl/WasmIdePlatformKind.kt b/jps/jps-common/src/org/jetbrains/kotlin/platform/impl/WasmIdePlatformKind.kt new file mode 100644 index 00000000000..7b636e757c7 --- /dev/null +++ b/jps/jps-common/src/org/jetbrains/kotlin/platform/impl/WasmIdePlatformKind.kt @@ -0,0 +1,55 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +@file:JvmName("WasmIdePlatformUtil") +@file:Suppress("DEPRECATION_ERROR", "DeprecatedCallableAddReplaceWith") + +package org.jetbrains.kotlin.platform.impl + +import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments +import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments +import org.jetbrains.kotlin.platform.* +import org.jetbrains.kotlin.platform.wasm.WasmPlatforms + +object WasmIdePlatformKind : IdePlatformKind() { + override fun supportsTargetPlatform(platform: TargetPlatform): Boolean = platform.isWasm() + + override fun platformByCompilerArguments(arguments: CommonCompilerArguments): TargetPlatform? { + return if (arguments is K2JSCompilerArguments && arguments.wasm) + WasmPlatforms.Default + else + null + } + + val platforms get() = listOf(WasmPlatforms.Default) + override val defaultPlatform get() = WasmPlatforms.Default + + @Deprecated( + message = "IdePlatform is deprecated and will be removed soon, please, migrate to org.jetbrains.kotlin.platform.TargetPlatform", + level = DeprecationLevel.ERROR + ) + override fun getDefaultPlatform(): IdePlatform<*, *> = WasmIdePlatformKind.Platform + + override fun createArguments(): CommonCompilerArguments { + return K2JSCompilerArguments() + } + + override val argumentsClass get() = K2JSCompilerArguments::class.java + + override val name get() = "WebAssembly" + + @Deprecated( + message = "IdePlatform is deprecated and will be removed soon, please, migrate to org.jetbrains.kotlin.platform.TargetPlatform", + level = DeprecationLevel.ERROR + ) + object Platform : IdePlatform() { + override val kind get() = WasmIdePlatformKind + override val version get() = TargetPlatformVersion.NoVersion + override fun createArguments(init: K2JSCompilerArguments.() -> Unit) = K2JSCompilerArguments().apply(init) + } +} + +val IdePlatformKind?.isWasm + get() = this is WasmIdePlatformKind diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/naming/NameSuggestion.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/naming/NameSuggestion.kt index 0b9e97cae12..c839626bfc5 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/naming/NameSuggestion.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/naming/NameSuggestion.kt @@ -34,6 +34,10 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.isEnumValueOfMethod import java.util.* import kotlin.math.abs +class JsNameSuggestion : NameSuggestion() + +class WasmNameSuggestion : NameSuggestion() + /** * This class is responsible for generating names for declarations. It does not produce fully-qualified JS name, instead * it tries to generate a simple name and specify a scoping declaration. This information can be used by the front-end @@ -43,7 +47,7 @@ import kotlin.math.abs * A new instance of this class can be created for each request, however, it's recommended to use stable instance, since * [NameSuggestion] supports caching. */ -class NameSuggestion { +open class NameSuggestion { private val cache: MutableMap = Collections.synchronizedMap(WeakHashMap()) /** diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatformConfigurator.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatformConfigurator.kt index a8aa0b8ea17..aaab915281a 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatformConfigurator.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatformConfigurator.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.container.StorageComponentContainer import org.jetbrains.kotlin.container.useImpl import org.jetbrains.kotlin.container.useInstance import org.jetbrains.kotlin.js.analyze.JsNativeDiagnosticSuppressor +import org.jetbrains.kotlin.js.naming.JsNameSuggestion import org.jetbrains.kotlin.js.naming.NameSuggestion import org.jetbrains.kotlin.js.resolve.diagnostics.* import org.jetbrains.kotlin.resolve.PlatformConfiguratorBase @@ -37,7 +38,7 @@ object JsPlatformConfigurator : PlatformConfiguratorBase( ), ) { override fun configureModuleComponents(container: StorageComponentContainer) { - container.useInstance(NameSuggestion()) + container.useInstance(JsNameSuggestion()) container.useImpl() container.useImpl() container.useImpl() diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsBuiltinNameClashChecker.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsBuiltinNameClashChecker.kt index 770c8bb9e09..0ef5c63442b 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsBuiltinNameClashChecker.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsBuiltinNameClashChecker.kt @@ -19,13 +19,13 @@ package org.jetbrains.kotlin.js.resolve.diagnostics import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.js.naming.NameSuggestion +import org.jetbrains.kotlin.js.naming.JsNameSuggestion import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.resolve.checkers.DeclarationChecker import org.jetbrains.kotlin.resolve.checkers.DeclarationCheckerContext -class JsBuiltinNameClashChecker(private val nameSuggestion: NameSuggestion) : DeclarationChecker { +class JsBuiltinNameClashChecker(private val nameSuggestion: JsNameSuggestion) : DeclarationChecker { override fun check(declaration: KtDeclaration, descriptor: DeclarationDescriptor, context: DeclarationCheckerContext) { if (AnnotationsUtils.isNativeObject(descriptor)) return if (descriptor.containingDeclaration !is ClassDescriptor) return diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsNameCharsChecker.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsNameCharsChecker.kt index 39bd3274737..5a048ad7f30 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsNameCharsChecker.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsNameCharsChecker.kt @@ -9,13 +9,19 @@ import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.descriptors.ConstructorDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor +import org.jetbrains.kotlin.js.naming.JsNameSuggestion import org.jetbrains.kotlin.js.naming.NameSuggestion +import org.jetbrains.kotlin.js.naming.WasmNameSuggestion import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.resolve.checkers.DeclarationChecker import org.jetbrains.kotlin.resolve.checkers.DeclarationCheckerContext -class JsNameCharsChecker(private val suggestion: NameSuggestion) : DeclarationChecker { +class JsNameCharsChecker(suggestion: JsNameSuggestion) : AbstractNameCharsChecker(suggestion) + +class WasmNameCharsChecker(suggestion: WasmNameSuggestion) : AbstractNameCharsChecker(suggestion) + +abstract class AbstractNameCharsChecker(private val suggestion: NameSuggestion) : DeclarationChecker { override fun check(declaration: KtDeclaration, descriptor: DeclarationDescriptor, context: DeclarationCheckerContext) { if (context.languageVersionSettings.supportsFeature(LanguageFeature.JsAllowInvalidCharsIdentifiersEscaping)) { return diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsNameClashChecker.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsNameClashChecker.kt index 533fd5582c0..b454025f2e0 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsNameClashChecker.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsNameClashChecker.kt @@ -20,8 +20,10 @@ import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.diagnostics.DiagnosticSink import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.js.naming.JsNameSuggestion import org.jetbrains.kotlin.js.naming.NameSuggestion import org.jetbrains.kotlin.js.naming.SuggestedName +import org.jetbrains.kotlin.js.naming.WasmNameSuggestion import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.resolve.BindingContext @@ -35,6 +37,26 @@ import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner class JsNameClashChecker( + nameSuggestion: JsNameSuggestion, + languageVersionSettings: LanguageVersionSettings, + kotlinTypeRefiner: KotlinTypeRefiner, +) : AbstractNameClashChecker( + nameSuggestion, + languageVersionSettings, + kotlinTypeRefiner, +) + +class WasmNameClashChecker( + nameSuggestion: WasmNameSuggestion, + languageVersionSettings: LanguageVersionSettings, + kotlinTypeRefiner: KotlinTypeRefiner, +) : AbstractNameClashChecker( + nameSuggestion, + languageVersionSettings, + kotlinTypeRefiner, +) + +abstract class AbstractNameClashChecker( private val nameSuggestion: NameSuggestion, private val languageVersionSettings: LanguageVersionSettings, private val kotlinTypeRefiner: KotlinTypeRefiner, diff --git a/wasm/wasm.frontend/src/org/jetbrains/kotlin/wasm/resolve/WasmPlatformConfigurator.kt b/wasm/wasm.frontend/src/org/jetbrains/kotlin/wasm/resolve/WasmPlatformConfigurator.kt index 4eea7c1c7fe..6ca9c27215e 100644 --- a/wasm/wasm.frontend/src/org/jetbrains/kotlin/wasm/resolve/WasmPlatformConfigurator.kt +++ b/wasm/wasm.frontend/src/org/jetbrains/kotlin/wasm/resolve/WasmPlatformConfigurator.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.container.StorageComponentContainer import org.jetbrains.kotlin.container.useImpl import org.jetbrains.kotlin.container.useInstance import org.jetbrains.kotlin.js.naming.NameSuggestion +import org.jetbrains.kotlin.js.naming.WasmNameSuggestion import org.jetbrains.kotlin.js.resolve.ExtensionFunctionToExternalIsInlinable import org.jetbrains.kotlin.js.resolve.diagnostics.* import org.jetbrains.kotlin.resolve.PlatformConfiguratorBase @@ -38,10 +39,10 @@ object WasmPlatformConfigurator : PlatformConfiguratorBase( ), ) { override fun configureModuleComponents(container: StorageComponentContainer) { - container.useInstance(NameSuggestion()) + container.useInstance(WasmNameSuggestion()) container.useImpl() - container.useImpl() - container.useImpl() + container.useImpl() + container.useImpl() container.useInstance(JsModuleClassLiteralChecker) container.useImpl() container.useImpl()