From e901629cf0d67adc46a9dffe3780fed634f1136f Mon Sep 17 00:00:00 2001 From: Svyatoslav Kuzmich Date: Wed, 22 Nov 2023 15:57:51 +0100 Subject: [PATCH] [Wasm] Support WASI target in K2 - Support WASI mode in CLI and test infrastructure - Add external declaration checker - Split Fir diagnostic lists into Base, JS and WASI #KT-56849 Fixed --- .../cli/common/FirSessionConstructionUtils.kt | 2 ++ .../diagnostics/FirWasmDiagnosticsList.kt | 5 +++ .../diagnostics/wasm/FirWasmErrors.kt | 4 +++ .../wasm/FirWasmErrorsDefaultMessages.kt | 5 +++ .../wasm/checkers/WasmDeclarationCheckers.kt | 17 ++++++++-- .../wasm/checkers/WasmExpressionCheckers.kt | 22 +++++++----- .../wasm/checkers/WasmTypeCheckers.kt | 2 +- .../FirWasmWasiExternalDeclarationChecker.kt | 34 +++++++++++++++++++ .../kotlin/fir/checkers/CheckersContainers.kt | 23 +++++++++---- .../fir/session/FirWasmSessionFactory.kt | 4 ++- .../diagnostics/wasmWasiTests/external.kt | 11 ++++++ .../test/frontend/fir/FirFrontendFacade.kt | 2 ++ .../frontend/fir/TestFirWasmSessionFactory.kt | 3 +- .../jetbrains/kotlin/js/config/WasmTarget.kt | 7 +++- .../WasmWasiExternalDeclarationChecker.kt | 1 - .../generators/tests/GenerateWasmTests.kt | 10 ++++++ .../AbstractDiagnosticsFirWasmTest.kt | 14 ++++++-- .../AbstractDiagnosticsWasmTest.kt | 13 +++++-- .../DiagnosticsFirWasmWasiTestGenerated.java | 32 +++++++++++++++++ .../DiagnosticsWasmWasiTestGenerated.java | 32 +++++++++++++++++ 20 files changed, 216 insertions(+), 27 deletions(-) create mode 100644 compiler/fir/checkers/checkers.wasm/src/org/jetbrains/kotlin/fir/analysis/wasm/checkers/declaration/FirWasmWasiExternalDeclarationChecker.kt create mode 100644 compiler/testData/diagnostics/wasmWasiTests/external.kt create mode 100644 wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/diagnostics/DiagnosticsFirWasmWasiTestGenerated.java create mode 100644 wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/diagnostics/DiagnosticsWasmWasiTestGenerated.java diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt index e1ae19dcbe3..bdf48207a21 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/FirSessionConstructionUtils.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchSco import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.js.config.JSConfigurationKeys import org.jetbrains.kotlin.js.config.WasmTarget +import org.jetbrains.kotlin.js.config.wasmTarget import org.jetbrains.kotlin.js.resolve.JsPlatformAnalyzerServices import org.jetbrains.kotlin.library.KotlinLibrary import org.jetbrains.kotlin.library.metadata.resolver.KotlinResolvedLibrary @@ -261,6 +262,7 @@ fun prepareWasmSessions( sessionProvider, extensionRegistrars, configuration.languageVersionSettings, + configuration.wasmTarget, lookupTracker, icData = icData, registerExtraComponents = {}, diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirWasmDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirWasmDiagnosticsList.kt index 94445f4ea72..8a04b7194ee 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirWasmDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirWasmDiagnosticsList.kt @@ -65,4 +65,9 @@ object WASM_DIAGNOSTICS_LIST : DiagnosticList("FirWasmErrors") { parameter("type") } } + + val WASI by object : DiagnosticGroup("WASI") { + val WASI_EXTERNAL_NOT_TOP_LEVEL_FUNCTION by error() + val WASI_EXTERNAL_FUNCTION_WITHOUT_IMPORT by error() + } } diff --git a/compiler/fir/checkers/checkers.wasm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/wasm/FirWasmErrors.kt b/compiler/fir/checkers/checkers.wasm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/wasm/FirWasmErrors.kt index d5d4a5efe43..ba84c579238 100644 --- a/compiler/fir/checkers/checkers.wasm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/wasm/FirWasmErrors.kt +++ b/compiler/fir/checkers/checkers.wasm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/wasm/FirWasmErrors.kt @@ -48,6 +48,10 @@ object FirWasmErrors { val WASM_IMPORT_EXPORT_UNSUPPORTED_PARAMETER_TYPE by error1(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) val WASM_IMPORT_EXPORT_UNSUPPORTED_RETURN_TYPE by error1(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) + // WASI + val WASI_EXTERNAL_NOT_TOP_LEVEL_FUNCTION by error0() + val WASI_EXTERNAL_FUNCTION_WITHOUT_IMPORT by error0() + init { RootDiagnosticRendererFactory.registerFactory(FirWasmErrorsDefaultMessages) } diff --git a/compiler/fir/checkers/checkers.wasm/src/org/jetbrains/kotlin/fir/analysis/diagnostics/wasm/FirWasmErrorsDefaultMessages.kt b/compiler/fir/checkers/checkers.wasm/src/org/jetbrains/kotlin/fir/analysis/diagnostics/wasm/FirWasmErrorsDefaultMessages.kt index 7e47857627d..f41a6d09cd2 100644 --- a/compiler/fir/checkers/checkers.wasm/src/org/jetbrains/kotlin/fir/analysis/diagnostics/wasm/FirWasmErrorsDefaultMessages.kt +++ b/compiler/fir/checkers/checkers.wasm/src/org/jetbrains/kotlin/fir/analysis/diagnostics/wasm/FirWasmErrorsDefaultMessages.kt @@ -22,6 +22,8 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.wasm.FirWasmErrors.NESTED_W import org.jetbrains.kotlin.fir.analysis.diagnostics.wasm.FirWasmErrors.NESTED_WASM_IMPORT import org.jetbrains.kotlin.fir.analysis.diagnostics.wasm.FirWasmErrors.NON_EXTERNAL_DECLARATION_IN_INAPPROPRIATE_FILE import org.jetbrains.kotlin.fir.analysis.diagnostics.wasm.FirWasmErrors.NON_EXTERNAL_TYPE_EXTENDS_EXTERNAL_TYPE +import org.jetbrains.kotlin.fir.analysis.diagnostics.wasm.FirWasmErrors.WASI_EXTERNAL_FUNCTION_WITHOUT_IMPORT +import org.jetbrains.kotlin.fir.analysis.diagnostics.wasm.FirWasmErrors.WASI_EXTERNAL_NOT_TOP_LEVEL_FUNCTION import org.jetbrains.kotlin.fir.analysis.diagnostics.wasm.FirWasmErrors.WASM_EXPORT_ON_EXTERNAL_DECLARATION import org.jetbrains.kotlin.fir.analysis.diagnostics.wasm.FirWasmErrors.WASM_IMPORT_EXPORT_PARAMETER_DEFAULT_VALUE import org.jetbrains.kotlin.fir.analysis.diagnostics.wasm.FirWasmErrors.WASM_IMPORT_EXPORT_UNSUPPORTED_PARAMETER_TYPE @@ -95,5 +97,8 @@ object FirWasmErrorsDefaultMessages : BaseDiagnosticRendererFactory() { "Unsupported ''@WasmImport'' and ''@WasmExport'' return type ''{0}''.", FirDiagnosticRenderers.RENDER_TYPE ) + + map.put(WASI_EXTERNAL_NOT_TOP_LEVEL_FUNCTION, "Only top-level functions can be external.") + map.put(WASI_EXTERNAL_FUNCTION_WITHOUT_IMPORT, "External functions should be annotated with '@WasmImport'.") } } diff --git a/compiler/fir/checkers/checkers.wasm/src/org/jetbrains/kotlin/fir/analysis/wasm/checkers/WasmDeclarationCheckers.kt b/compiler/fir/checkers/checkers.wasm/src/org/jetbrains/kotlin/fir/analysis/wasm/checkers/WasmDeclarationCheckers.kt index 6f12f0a0e1f..e056a220c64 100644 --- a/compiler/fir/checkers/checkers.wasm/src/org/jetbrains/kotlin/fir/analysis/wasm/checkers/WasmDeclarationCheckers.kt +++ b/compiler/fir/checkers/checkers.wasm/src/org/jetbrains/kotlin/fir/analysis/wasm/checkers/WasmDeclarationCheckers.kt @@ -9,7 +9,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.declaration.* import org.jetbrains.kotlin.fir.analysis.wasm.checkers.declaration.* import org.jetbrains.kotlin.fir.analysis.web.common.checkers.declaration.FirJsExportAnnotationChecker -object WasmDeclarationCheckers : DeclarationCheckers() { +object WasmBaseDeclarationCheckers : DeclarationCheckers() { override val classCheckers: Set get() = setOf( FirWasmExternalInheritanceChecker, @@ -17,13 +17,26 @@ object WasmDeclarationCheckers : DeclarationCheckers() { override val basicDeclarationCheckers: Set get() = setOf( - FirWasmJsInteropTypesChecker, FirWasmImportAnnotationChecker, FirWasmExportAnnotationChecker, FirWasmExternalChecker, + ) +} + +object WasmJsDeclarationCheckers : DeclarationCheckers() { + override val basicDeclarationCheckers: Set + get() = setOf( + FirWasmJsInteropTypesChecker, FirWasmJsFunAnnotationChecker, FirJsExportAnnotationChecker, FirWasmJsModuleChecker, FirWasmExternalFileChecker, ) } + +object WasmWasiDeclarationCheckers : DeclarationCheckers() { + override val basicDeclarationCheckers: Set + get() = setOf( + FirWasmWasiExternalDeclarationChecker, + ) +} \ No newline at end of file diff --git a/compiler/fir/checkers/checkers.wasm/src/org/jetbrains/kotlin/fir/analysis/wasm/checkers/WasmExpressionCheckers.kt b/compiler/fir/checkers/checkers.wasm/src/org/jetbrains/kotlin/fir/analysis/wasm/checkers/WasmExpressionCheckers.kt index 30f2e4721bb..5004e99be15 100644 --- a/compiler/fir/checkers/checkers.wasm/src/org/jetbrains/kotlin/fir/analysis/wasm/checkers/WasmExpressionCheckers.kt +++ b/compiler/fir/checkers/checkers.wasm/src/org/jetbrains/kotlin/fir/analysis/wasm/checkers/WasmExpressionCheckers.kt @@ -13,12 +13,7 @@ import org.jetbrains.kotlin.fir.analysis.wasm.checkers.expression.FirWasmReified import org.jetbrains.kotlin.fir.analysis.web.common.checkers.expression.FirJsCodeConstantArgumentChecker import org.jetbrains.kotlin.fir.analysis.web.common.checkers.expression.FirJsQualifierChecker -object WasmExpressionCheckers : ExpressionCheckers() { - override val annotationCallCheckers: Set - get() = setOf( - FirJsQualifierChecker, - ) - +object WasmBaseExpressionCheckers : ExpressionCheckers() { override val basicExpressionCheckers: Set get() = setOf( FirWasmDefinedExternallyCallChecker, @@ -27,8 +22,19 @@ object WasmExpressionCheckers : ExpressionCheckers() { override val functionCallCheckers: Set get() = setOf( - FirJsCodeConstantArgumentChecker, - FirWasmJsCodeCallChecker, FirWasmReifiedExternalChecker ) } + +object WasmJsExpressionCheckers : ExpressionCheckers() { + override val annotationCallCheckers: Set + get() = setOf( + FirJsQualifierChecker, + ) + + override val functionCallCheckers: Set + get() = setOf( + FirJsCodeConstantArgumentChecker, + FirWasmJsCodeCallChecker, + ) +} \ No newline at end of file diff --git a/compiler/fir/checkers/checkers.wasm/src/org/jetbrains/kotlin/fir/analysis/wasm/checkers/WasmTypeCheckers.kt b/compiler/fir/checkers/checkers.wasm/src/org/jetbrains/kotlin/fir/analysis/wasm/checkers/WasmTypeCheckers.kt index c805f5f5cd6..dbc3768c4a8 100644 --- a/compiler/fir/checkers/checkers.wasm/src/org/jetbrains/kotlin/fir/analysis/wasm/checkers/WasmTypeCheckers.kt +++ b/compiler/fir/checkers/checkers.wasm/src/org/jetbrains/kotlin/fir/analysis/wasm/checkers/WasmTypeCheckers.kt @@ -9,7 +9,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.declaration.* import org.jetbrains.kotlin.fir.analysis.checkers.type.FirTypeRefChecker import org.jetbrains.kotlin.fir.analysis.checkers.type.TypeCheckers -object WasmTypeCheckers : TypeCheckers() { +object WasmBaseTypeCheckers : TypeCheckers() { override val typeRefCheckers: Set get() = setOf( FirDynamicUnsupportedChecker, diff --git a/compiler/fir/checkers/checkers.wasm/src/org/jetbrains/kotlin/fir/analysis/wasm/checkers/declaration/FirWasmWasiExternalDeclarationChecker.kt b/compiler/fir/checkers/checkers.wasm/src/org/jetbrains/kotlin/fir/analysis/wasm/checkers/declaration/FirWasmWasiExternalDeclarationChecker.kt new file mode 100644 index 00000000000..5ad676297ba --- /dev/null +++ b/compiler/fir/checkers/checkers.wasm/src/org/jetbrains/kotlin/fir/analysis/wasm/checkers/declaration/FirWasmWasiExternalDeclarationChecker.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2010-2023 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. + */ + +package org.jetbrains.kotlin.fir.analysis.wasm.checkers.declaration + +import org.jetbrains.kotlin.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirBasicDeclarationChecker +import org.jetbrains.kotlin.fir.analysis.checkers.isTopLevel +import org.jetbrains.kotlin.fir.analysis.diagnostics.wasm.FirWasmErrors +import org.jetbrains.kotlin.fir.declarations.FirDeclaration +import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction +import org.jetbrains.kotlin.fir.declarations.hasAnnotation +import org.jetbrains.kotlin.fir.declarations.utils.isEffectivelyExternal +import org.jetbrains.kotlin.name.WasmStandardClassIds + +object FirWasmWasiExternalDeclarationChecker : FirBasicDeclarationChecker() { + override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { + if (!declaration.symbol.isEffectivelyExternal(context.session)) return + + if (declaration is FirSimpleFunction) { + if (!context.isTopLevel) { + reporter.reportOn(declaration.source, FirWasmErrors.WASI_EXTERNAL_NOT_TOP_LEVEL_FUNCTION, context) + } else { + if (!declaration.hasAnnotation(WasmStandardClassIds.Annotations.WasmImport, context.session)) { + reporter.reportOn(declaration.source, FirWasmErrors.WASI_EXTERNAL_FUNCTION_WITHOUT_IMPORT, context) + } + } + } + } +} \ No newline at end of file diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CheckersContainers.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CheckersContainers.kt index eda8171f79b..11934748835 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CheckersContainers.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CheckersContainers.kt @@ -13,10 +13,9 @@ import org.jetbrains.kotlin.fir.analysis.jvm.checkers.JvmExpressionCheckers import org.jetbrains.kotlin.fir.analysis.jvm.checkers.JvmTypeCheckers import org.jetbrains.kotlin.fir.analysis.native.checkers.NativeDeclarationCheckers import org.jetbrains.kotlin.fir.analysis.native.checkers.NativeExpressionCheckers -import org.jetbrains.kotlin.fir.analysis.wasm.checkers.WasmDeclarationCheckers -import org.jetbrains.kotlin.fir.analysis.wasm.checkers.WasmExpressionCheckers -import org.jetbrains.kotlin.fir.analysis.wasm.checkers.WasmTypeCheckers +import org.jetbrains.kotlin.fir.analysis.wasm.checkers.* import org.jetbrains.kotlin.fir.session.FirSessionConfigurator +import org.jetbrains.kotlin.js.config.WasmTarget fun FirSessionConfigurator.registerCommonCheckers() { useCheckers(CommonDeclarationCheckers) @@ -48,8 +47,18 @@ fun FirSessionConfigurator.registerNativeCheckers() { useCheckers(NativeExpressionCheckers) } -fun FirSessionConfigurator.registerWasmCheckers() { - useCheckers(WasmDeclarationCheckers) - useCheckers(WasmExpressionCheckers) - useCheckers(WasmTypeCheckers) +fun FirSessionConfigurator.registerWasmCheckers(target: WasmTarget) { + useCheckers(WasmBaseDeclarationCheckers) + useCheckers(WasmBaseExpressionCheckers) + useCheckers(WasmBaseTypeCheckers) + + when (target) { + WasmTarget.JS -> { + useCheckers(WasmJsDeclarationCheckers) + useCheckers(WasmJsExpressionCheckers) + } + WasmTarget.WASI -> { + useCheckers(WasmWasiDeclarationCheckers) + } + } } \ No newline at end of file diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirWasmSessionFactory.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirWasmSessionFactory.kt index e2d0a5b5f13..b32177df1db 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirWasmSessionFactory.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirWasmSessionFactory.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.fir.resolve.providers.impl.FirBuiltinSyntheticFuncti import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider import org.jetbrains.kotlin.fir.session.FirSessionFactoryHelper.registerDefaultComponents import org.jetbrains.kotlin.incremental.components.LookupTracker +import org.jetbrains.kotlin.js.config.WasmTarget import org.jetbrains.kotlin.library.KotlinLibrary import org.jetbrains.kotlin.name.Name @@ -27,6 +28,7 @@ object FirWasmSessionFactory : FirAbstractSessionFactory() { sessionProvider: FirProjectSessionProvider, extensionRegistrars: List, languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT, + wasmTarget: WasmTarget, lookupTracker: LookupTracker?, icData: KlibIcData? = null, registerExtraComponents: ((FirSession) -> Unit) = {}, @@ -45,7 +47,7 @@ object FirWasmSessionFactory : FirAbstractSessionFactory() { it.registerDefaultComponents() registerExtraComponents(it) }, - registerExtraCheckers = { it.registerWasmCheckers() }, + registerExtraCheckers = { it.registerWasmCheckers(wasmTarget) }, createKotlinScopeProvider = { FirKotlinScopeProvider { _, declaredMemberScope, _, _, _ -> declaredMemberScope } }, createProviders = { session, kotlinScopeProvider, symbolProvider, generatedSymbolsProvider, dependencies -> listOfNotNull( diff --git a/compiler/testData/diagnostics/wasmWasiTests/external.kt b/compiler/testData/diagnostics/wasmWasiTests/external.kt new file mode 100644 index 00000000000..aa8218a4a72 --- /dev/null +++ b/compiler/testData/diagnostics/wasmWasiTests/external.kt @@ -0,0 +1,11 @@ +// FIR_IDENTICAL +import kotlin.wasm.WasmImport + +external fun foo(): Int + +external interface I { + fun foo(): Int +} + +@WasmImport("a", "b") +external fun importedFoo(): Int diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirFrontendFacade.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirFrontendFacade.kt index 1743a080f2c..fa4c3c3f5f8 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirFrontendFacade.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirFrontendFacade.kt @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.fir.session.* import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment import org.jetbrains.kotlin.js.config.JSConfigurationKeys import org.jetbrains.kotlin.js.config.WasmTarget +import org.jetbrains.kotlin.js.config.wasmTarget import org.jetbrains.kotlin.load.kotlin.PackageAndMetadataPartProvider import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.platform.TargetPlatform @@ -398,6 +399,7 @@ open class FirFrontendFacade( sessionProvider, extensionRegistrars, languageVersionSettings, + testServices.compilerConfigurationProvider.getCompilerConfiguration(module).wasmTarget, null, registerExtraComponents = ::registerExtraComponents, sessionConfigurator, diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/TestFirWasmSessionFactory.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/TestFirWasmSessionFactory.kt index f99ed2593e0..f609038933b 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/TestFirWasmSessionFactory.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/TestFirWasmSessionFactory.kt @@ -57,7 +57,7 @@ object TestFirWasmSessionFactory { fun createModuleBasedSession( mainModuleData: FirModuleData, sessionProvider: FirProjectSessionProvider, extensionRegistrars: List, - languageVersionSettings: LanguageVersionSettings, lookupTracker: LookupTracker?, + languageVersionSettings: LanguageVersionSettings, wasmTarget: WasmTarget, lookupTracker: LookupTracker?, registerExtraComponents: ((FirSession) -> Unit), sessionConfigurator: FirSessionConfigurator.() -> Unit, ): FirSession = @@ -66,6 +66,7 @@ object TestFirWasmSessionFactory { sessionProvider, extensionRegistrars, languageVersionSettings, + wasmTarget, lookupTracker, icData = null, registerExtraComponents, diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/config/WasmTarget.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/config/WasmTarget.kt index aacee5d1958..e5f1adbda7e 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/config/WasmTarget.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/config/WasmTarget.kt @@ -5,6 +5,8 @@ package org.jetbrains.kotlin.js.config +import org.jetbrains.kotlin.config.CompilerConfiguration + enum class WasmTarget { JS, WASI; @@ -16,4 +18,7 @@ enum class WasmTarget { else -> null } } -} \ No newline at end of file +} + +val CompilerConfiguration.wasmTarget: WasmTarget + get() = get(JSConfigurationKeys.WASM_TARGET, /* defaultValue = */ WasmTarget.JS) \ No newline at end of file diff --git a/wasm/wasm.frontend/src/org/jetbrains/kotlin/wasm/resolve/diagnostics/WasmWasiExternalDeclarationChecker.kt b/wasm/wasm.frontend/src/org/jetbrains/kotlin/wasm/resolve/diagnostics/WasmWasiExternalDeclarationChecker.kt index ac79599508a..beff476ee3d 100644 --- a/wasm/wasm.frontend/src/org/jetbrains/kotlin/wasm/resolve/diagnostics/WasmWasiExternalDeclarationChecker.kt +++ b/wasm/wasm.frontend/src/org/jetbrains/kotlin/wasm/resolve/diagnostics/WasmWasiExternalDeclarationChecker.kt @@ -16,7 +16,6 @@ import org.jetbrains.kotlin.resolve.checkers.DeclarationChecker import org.jetbrains.kotlin.resolve.checkers.DeclarationCheckerContext import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal -// TODO: Implement in K2: KT-56849 object WasmWasiExternalDeclarationChecker : DeclarationChecker { override fun check(declaration: KtDeclaration, descriptor: DeclarationDescriptor, context: DeclarationCheckerContext) { if (descriptor !is MemberDescriptor) return diff --git a/wasm/wasm.tests/test/org/jetbrains/kotlin/generators/tests/GenerateWasmTests.kt b/wasm/wasm.tests/test/org/jetbrains/kotlin/generators/tests/GenerateWasmTests.kt index 46e6dbde69e..d710d01239c 100644 --- a/wasm/wasm.tests/test/org/jetbrains/kotlin/generators/tests/GenerateWasmTests.kt +++ b/wasm/wasm.tests/test/org/jetbrains/kotlin/generators/tests/GenerateWasmTests.kt @@ -10,6 +10,8 @@ import org.jetbrains.kotlin.generators.util.TestGeneratorUtil import org.jetbrains.kotlin.wasm.test.* import org.jetbrains.kotlin.wasm.test.diagnostics.AbstractDiagnosticsWasmTest import org.jetbrains.kotlin.wasm.test.diagnostics.AbstractDiagnosticsFirWasmTest +import org.jetbrains.kotlin.wasm.test.diagnostics.AbstractDiagnosticsFirWasmWasiTest +import org.jetbrains.kotlin.wasm.test.diagnostics.AbstractDiagnosticsWasmWasiTest fun main(args: Array) { System.setProperty("java.awt.headless", "true") @@ -36,6 +38,14 @@ fun main(args: Array) { testClass { model("diagnostics/wasmTests", excludedPattern = TestGeneratorUtil.KT_OR_KTS_WITH_FIR_PREFIX) } + + testClass { + model("diagnostics/wasmWasiTests", excludedPattern = TestGeneratorUtil.KT_OR_KTS_WITH_FIR_PREFIX) + } + + testClass { + model("diagnostics/wasmWasiTests", excludedPattern = TestGeneratorUtil.KT_OR_KTS_WITH_FIR_PREFIX) + } } testGroup("wasm/wasm.tests/tests-gen", "js/js.translator/testData", testRunnerMethodName = "runTest0") { diff --git a/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/diagnostics/AbstractDiagnosticsFirWasmTest.kt b/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/diagnostics/AbstractDiagnosticsFirWasmTest.kt index 3639d8f4cee..9043be4192f 100644 --- a/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/diagnostics/AbstractDiagnosticsFirWasmTest.kt +++ b/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/diagnostics/AbstractDiagnosticsFirWasmTest.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.wasm.test.diagnostics import org.jetbrains.kotlin.platform.wasm.WasmPlatforms +import org.jetbrains.kotlin.test.Constructor import org.jetbrains.kotlin.test.FirParser import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.builders.firHandlersStep @@ -16,13 +17,19 @@ import org.jetbrains.kotlin.test.model.DependencyKind import org.jetbrains.kotlin.test.model.FrontendKinds import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerTest import org.jetbrains.kotlin.test.runners.configurationForClassicAndFirTestsAlongside +import org.jetbrains.kotlin.test.services.AbstractEnvironmentConfigurator import org.jetbrains.kotlin.test.services.LibraryProvider import org.jetbrains.kotlin.test.services.configuration.CommonEnvironmentConfigurator +import org.jetbrains.kotlin.test.services.configuration.WasmEnvironmentConfigurator import org.jetbrains.kotlin.test.services.configuration.WasmEnvironmentConfiguratorJs +import org.jetbrains.kotlin.test.services.configuration.WasmEnvironmentConfiguratorWasi import org.jetbrains.kotlin.test.services.sourceProviders.AdditionalDiagnosticsSourceFilesProvider import org.jetbrains.kotlin.test.services.sourceProviders.CoroutineHelpersSourceFilesProvider -abstract class AbstractFirWasmDiagnosticTestBase(val parser: FirParser) : AbstractKotlinCompilerTest() { +abstract class AbstractFirWasmDiagnosticTestBase( + val parser: FirParser, + private val wasmEnvironmentConfigurator: Constructor, +) : AbstractKotlinCompilerTest() { override fun TestConfigurationBuilder.configuration() { globalDefaults { frontend = FrontendKinds.FIR @@ -37,7 +44,7 @@ abstract class AbstractFirWasmDiagnosticTestBase(val parser: FirParser) : Abstra useConfigurators( ::CommonEnvironmentConfigurator, - ::WasmEnvironmentConfiguratorJs, + wasmEnvironmentConfigurator, ) useAdditionalSourceProviders( @@ -61,4 +68,5 @@ abstract class AbstractFirWasmDiagnosticTestBase(val parser: FirParser) : Abstra } } -abstract class AbstractDiagnosticsFirWasmTest : AbstractFirWasmDiagnosticTestBase(FirParser.Psi) \ No newline at end of file +abstract class AbstractDiagnosticsFirWasmTest : AbstractFirWasmDiagnosticTestBase(FirParser.Psi, ::WasmEnvironmentConfiguratorJs) +abstract class AbstractDiagnosticsFirWasmWasiTest : AbstractFirWasmDiagnosticTestBase(FirParser.Psi, ::WasmEnvironmentConfiguratorWasi) \ No newline at end of file diff --git a/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/diagnostics/AbstractDiagnosticsWasmTest.kt b/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/diagnostics/AbstractDiagnosticsWasmTest.kt index 4c2f218a8e1..cc1e3becfbe 100644 --- a/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/diagnostics/AbstractDiagnosticsWasmTest.kt +++ b/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/diagnostics/AbstractDiagnosticsWasmTest.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.wasm.test.diagnostics import org.jetbrains.kotlin.platform.wasm.WasmPlatforms +import org.jetbrains.kotlin.test.Constructor import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.builders.classicFrontendHandlersStep import org.jetbrains.kotlin.test.builders.classicFrontendStep @@ -15,14 +16,18 @@ import org.jetbrains.kotlin.test.frontend.classic.handlers.OldNewInferenceMetaIn import org.jetbrains.kotlin.test.model.DependencyKind import org.jetbrains.kotlin.test.model.FrontendKinds import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerTest +import org.jetbrains.kotlin.test.services.AbstractEnvironmentConfigurator import org.jetbrains.kotlin.test.services.LibraryProvider import org.jetbrains.kotlin.test.services.configuration.CommonEnvironmentConfigurator import org.jetbrains.kotlin.test.services.configuration.WasmEnvironmentConfigurator import org.jetbrains.kotlin.test.services.configuration.WasmEnvironmentConfiguratorJs +import org.jetbrains.kotlin.test.services.configuration.WasmEnvironmentConfiguratorWasi import org.jetbrains.kotlin.test.services.sourceProviders.AdditionalDiagnosticsSourceFilesProvider import org.jetbrains.kotlin.test.services.sourceProviders.CoroutineHelpersSourceFilesProvider -abstract class AbstractDiagnosticsWasmTest : AbstractKotlinCompilerTest() { +abstract class AbstractDiagnosticsWasmTestBase( + private val wasmEnvironmentConfigurator: Constructor, +) : AbstractKotlinCompilerTest() { override fun TestConfigurationBuilder.configuration() { globalDefaults { frontend = FrontendKinds.ClassicFrontend @@ -38,7 +43,7 @@ abstract class AbstractDiagnosticsWasmTest : AbstractKotlinCompilerTest() { useConfigurators( ::CommonEnvironmentConfigurator, - ::WasmEnvironmentConfiguratorJs, + wasmEnvironmentConfigurator, ) useMetaInfoProcessors(::OldNewInferenceMetaInfoProcessor) @@ -56,3 +61,7 @@ abstract class AbstractDiagnosticsWasmTest : AbstractKotlinCompilerTest() { } } } + +abstract class AbstractDiagnosticsWasmTest : AbstractDiagnosticsWasmTestBase(::WasmEnvironmentConfiguratorJs) +abstract class AbstractDiagnosticsWasmWasiTest : AbstractDiagnosticsWasmTestBase(::WasmEnvironmentConfiguratorWasi) + diff --git a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/diagnostics/DiagnosticsFirWasmWasiTestGenerated.java b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/diagnostics/DiagnosticsFirWasmWasiTestGenerated.java new file mode 100644 index 00000000000..8ddc0c141db --- /dev/null +++ b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/diagnostics/DiagnosticsFirWasmWasiTestGenerated.java @@ -0,0 +1,32 @@ +/* + * Copyright 2010-2023 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. + */ + +package org.jetbrains.kotlin.wasm.test.diagnostics; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.GenerateWasmTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("compiler/testData/diagnostics/wasmWasiTests") +@TestDataPath("$PROJECT_ROOT") +public class DiagnosticsFirWasmWasiTestGenerated extends AbstractDiagnosticsFirWasmWasiTest { + @Test + public void testAllFilesPresentInWasmWasiTests() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/wasmWasiTests"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); + } + + @Test + @TestMetadata("external.kt") + public void testExternal() throws Exception { + runTest("compiler/testData/diagnostics/wasmWasiTests/external.kt"); + } +} diff --git a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/diagnostics/DiagnosticsWasmWasiTestGenerated.java b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/diagnostics/DiagnosticsWasmWasiTestGenerated.java new file mode 100644 index 00000000000..a7427167cfa --- /dev/null +++ b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/diagnostics/DiagnosticsWasmWasiTestGenerated.java @@ -0,0 +1,32 @@ +/* + * Copyright 2010-2023 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. + */ + +package org.jetbrains.kotlin.wasm.test.diagnostics; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.GenerateWasmTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("compiler/testData/diagnostics/wasmWasiTests") +@TestDataPath("$PROJECT_ROOT") +public class DiagnosticsWasmWasiTestGenerated extends AbstractDiagnosticsWasmWasiTest { + @Test + public void testAllFilesPresentInWasmWasiTests() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/wasmWasiTests"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); + } + + @Test + @TestMetadata("external.kt") + public void testExternal() throws Exception { + runTest("compiler/testData/diagnostics/wasmWasiTests/external.kt"); + } +}