[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
This commit is contained in:
Svyatoslav Kuzmich
2023-11-22 15:57:51 +01:00
committed by Space Team
parent f26b0a5be6
commit e901629cf0
20 changed files with 216 additions and 27 deletions
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchSco
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.js.config.JSConfigurationKeys 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.config.wasmTarget
import org.jetbrains.kotlin.js.resolve.JsPlatformAnalyzerServices import org.jetbrains.kotlin.js.resolve.JsPlatformAnalyzerServices
import org.jetbrains.kotlin.library.KotlinLibrary import org.jetbrains.kotlin.library.KotlinLibrary
import org.jetbrains.kotlin.library.metadata.resolver.KotlinResolvedLibrary import org.jetbrains.kotlin.library.metadata.resolver.KotlinResolvedLibrary
@@ -261,6 +262,7 @@ fun <F> prepareWasmSessions(
sessionProvider, sessionProvider,
extensionRegistrars, extensionRegistrars,
configuration.languageVersionSettings, configuration.languageVersionSettings,
configuration.wasmTarget,
lookupTracker, lookupTracker,
icData = icData, icData = icData,
registerExtraComponents = {}, registerExtraComponents = {},
@@ -65,4 +65,9 @@ object WASM_DIAGNOSTICS_LIST : DiagnosticList("FirWasmErrors") {
parameter<ConeKotlinType>("type") parameter<ConeKotlinType>("type")
} }
} }
val WASI by object : DiagnosticGroup("WASI") {
val WASI_EXTERNAL_NOT_TOP_LEVEL_FUNCTION by error<KtElement>()
val WASI_EXTERNAL_FUNCTION_WITHOUT_IMPORT by error<KtElement>()
}
} }
@@ -48,6 +48,10 @@ object FirWasmErrors {
val WASM_IMPORT_EXPORT_UNSUPPORTED_PARAMETER_TYPE by error1<KtElement, ConeKotlinType>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) val WASM_IMPORT_EXPORT_UNSUPPORTED_PARAMETER_TYPE by error1<KtElement, ConeKotlinType>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
val WASM_IMPORT_EXPORT_UNSUPPORTED_RETURN_TYPE by error1<KtElement, ConeKotlinType>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) val WASM_IMPORT_EXPORT_UNSUPPORTED_RETURN_TYPE by error1<KtElement, ConeKotlinType>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
// WASI
val WASI_EXTERNAL_NOT_TOP_LEVEL_FUNCTION by error0<KtElement>()
val WASI_EXTERNAL_FUNCTION_WITHOUT_IMPORT by error0<KtElement>()
init { init {
RootDiagnosticRendererFactory.registerFactory(FirWasmErrorsDefaultMessages) RootDiagnosticRendererFactory.registerFactory(FirWasmErrorsDefaultMessages)
} }
@@ -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.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_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.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_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_PARAMETER_DEFAULT_VALUE
import org.jetbrains.kotlin.fir.analysis.diagnostics.wasm.FirWasmErrors.WASM_IMPORT_EXPORT_UNSUPPORTED_PARAMETER_TYPE 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}''.", "Unsupported ''@WasmImport'' and ''@WasmExport'' return type ''{0}''.",
FirDiagnosticRenderers.RENDER_TYPE 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'.")
} }
} }
@@ -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.wasm.checkers.declaration.*
import org.jetbrains.kotlin.fir.analysis.web.common.checkers.declaration.FirJsExportAnnotationChecker import org.jetbrains.kotlin.fir.analysis.web.common.checkers.declaration.FirJsExportAnnotationChecker
object WasmDeclarationCheckers : DeclarationCheckers() { object WasmBaseDeclarationCheckers : DeclarationCheckers() {
override val classCheckers: Set<FirClassChecker> override val classCheckers: Set<FirClassChecker>
get() = setOf( get() = setOf(
FirWasmExternalInheritanceChecker, FirWasmExternalInheritanceChecker,
@@ -17,13 +17,26 @@ object WasmDeclarationCheckers : DeclarationCheckers() {
override val basicDeclarationCheckers: Set<FirBasicDeclarationChecker> override val basicDeclarationCheckers: Set<FirBasicDeclarationChecker>
get() = setOf( get() = setOf(
FirWasmJsInteropTypesChecker,
FirWasmImportAnnotationChecker, FirWasmImportAnnotationChecker,
FirWasmExportAnnotationChecker, FirWasmExportAnnotationChecker,
FirWasmExternalChecker, FirWasmExternalChecker,
)
}
object WasmJsDeclarationCheckers : DeclarationCheckers() {
override val basicDeclarationCheckers: Set<FirBasicDeclarationChecker>
get() = setOf(
FirWasmJsInteropTypesChecker,
FirWasmJsFunAnnotationChecker, FirWasmJsFunAnnotationChecker,
FirJsExportAnnotationChecker, FirJsExportAnnotationChecker,
FirWasmJsModuleChecker, FirWasmJsModuleChecker,
FirWasmExternalFileChecker, FirWasmExternalFileChecker,
) )
} }
object WasmWasiDeclarationCheckers : DeclarationCheckers() {
override val basicDeclarationCheckers: Set<FirBasicDeclarationChecker>
get() = setOf(
FirWasmWasiExternalDeclarationChecker,
)
}
@@ -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.FirJsCodeConstantArgumentChecker
import org.jetbrains.kotlin.fir.analysis.web.common.checkers.expression.FirJsQualifierChecker import org.jetbrains.kotlin.fir.analysis.web.common.checkers.expression.FirJsQualifierChecker
object WasmExpressionCheckers : ExpressionCheckers() { object WasmBaseExpressionCheckers : ExpressionCheckers() {
override val annotationCallCheckers: Set<FirAnnotationCallChecker>
get() = setOf(
FirJsQualifierChecker,
)
override val basicExpressionCheckers: Set<FirBasicExpressionChecker> override val basicExpressionCheckers: Set<FirBasicExpressionChecker>
get() = setOf( get() = setOf(
FirWasmDefinedExternallyCallChecker, FirWasmDefinedExternallyCallChecker,
@@ -27,8 +22,19 @@ object WasmExpressionCheckers : ExpressionCheckers() {
override val functionCallCheckers: Set<FirFunctionCallChecker> override val functionCallCheckers: Set<FirFunctionCallChecker>
get() = setOf( get() = setOf(
FirJsCodeConstantArgumentChecker,
FirWasmJsCodeCallChecker,
FirWasmReifiedExternalChecker FirWasmReifiedExternalChecker
) )
} }
object WasmJsExpressionCheckers : ExpressionCheckers() {
override val annotationCallCheckers: Set<FirAnnotationCallChecker>
get() = setOf(
FirJsQualifierChecker,
)
override val functionCallCheckers: Set<FirFunctionCallChecker>
get() = setOf(
FirJsCodeConstantArgumentChecker,
FirWasmJsCodeCallChecker,
)
}
@@ -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.FirTypeRefChecker
import org.jetbrains.kotlin.fir.analysis.checkers.type.TypeCheckers import org.jetbrains.kotlin.fir.analysis.checkers.type.TypeCheckers
object WasmTypeCheckers : TypeCheckers() { object WasmBaseTypeCheckers : TypeCheckers() {
override val typeRefCheckers: Set<FirTypeRefChecker> override val typeRefCheckers: Set<FirTypeRefChecker>
get() = setOf( get() = setOf(
FirDynamicUnsupportedChecker, FirDynamicUnsupportedChecker,
@@ -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)
}
}
}
}
}
@@ -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.jvm.checkers.JvmTypeCheckers
import org.jetbrains.kotlin.fir.analysis.native.checkers.NativeDeclarationCheckers import org.jetbrains.kotlin.fir.analysis.native.checkers.NativeDeclarationCheckers
import org.jetbrains.kotlin.fir.analysis.native.checkers.NativeExpressionCheckers 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.*
import org.jetbrains.kotlin.fir.analysis.wasm.checkers.WasmExpressionCheckers
import org.jetbrains.kotlin.fir.analysis.wasm.checkers.WasmTypeCheckers
import org.jetbrains.kotlin.fir.session.FirSessionConfigurator import org.jetbrains.kotlin.fir.session.FirSessionConfigurator
import org.jetbrains.kotlin.js.config.WasmTarget
fun FirSessionConfigurator.registerCommonCheckers() { fun FirSessionConfigurator.registerCommonCheckers() {
useCheckers(CommonDeclarationCheckers) useCheckers(CommonDeclarationCheckers)
@@ -48,8 +47,18 @@ fun FirSessionConfigurator.registerNativeCheckers() {
useCheckers(NativeExpressionCheckers) useCheckers(NativeExpressionCheckers)
} }
fun FirSessionConfigurator.registerWasmCheckers() { fun FirSessionConfigurator.registerWasmCheckers(target: WasmTarget) {
useCheckers(WasmDeclarationCheckers) useCheckers(WasmBaseDeclarationCheckers)
useCheckers(WasmExpressionCheckers) useCheckers(WasmBaseExpressionCheckers)
useCheckers(WasmTypeCheckers) useCheckers(WasmBaseTypeCheckers)
when (target) {
WasmTarget.JS -> {
useCheckers(WasmJsDeclarationCheckers)
useCheckers(WasmJsExpressionCheckers)
}
WasmTarget.WASI -> {
useCheckers(WasmWasiDeclarationCheckers)
}
}
} }
@@ -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.scopes.FirKotlinScopeProvider
import org.jetbrains.kotlin.fir.session.FirSessionFactoryHelper.registerDefaultComponents import org.jetbrains.kotlin.fir.session.FirSessionFactoryHelper.registerDefaultComponents
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.js.config.WasmTarget
import org.jetbrains.kotlin.library.KotlinLibrary import org.jetbrains.kotlin.library.KotlinLibrary
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
@@ -27,6 +28,7 @@ object FirWasmSessionFactory : FirAbstractSessionFactory() {
sessionProvider: FirProjectSessionProvider, sessionProvider: FirProjectSessionProvider,
extensionRegistrars: List<FirExtensionRegistrar>, extensionRegistrars: List<FirExtensionRegistrar>,
languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT, languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT,
wasmTarget: WasmTarget,
lookupTracker: LookupTracker?, lookupTracker: LookupTracker?,
icData: KlibIcData? = null, icData: KlibIcData? = null,
registerExtraComponents: ((FirSession) -> Unit) = {}, registerExtraComponents: ((FirSession) -> Unit) = {},
@@ -45,7 +47,7 @@ object FirWasmSessionFactory : FirAbstractSessionFactory() {
it.registerDefaultComponents() it.registerDefaultComponents()
registerExtraComponents(it) registerExtraComponents(it)
}, },
registerExtraCheckers = { it.registerWasmCheckers() }, registerExtraCheckers = { it.registerWasmCheckers(wasmTarget) },
createKotlinScopeProvider = { FirKotlinScopeProvider { _, declaredMemberScope, _, _, _ -> declaredMemberScope } }, createKotlinScopeProvider = { FirKotlinScopeProvider { _, declaredMemberScope, _, _, _ -> declaredMemberScope } },
createProviders = { session, kotlinScopeProvider, symbolProvider, generatedSymbolsProvider, dependencies -> createProviders = { session, kotlinScopeProvider, symbolProvider, generatedSymbolsProvider, dependencies ->
listOfNotNull( listOfNotNull(
+11
View File
@@ -0,0 +1,11 @@
// FIR_IDENTICAL
import kotlin.wasm.WasmImport
<!WASI_EXTERNAL_FUNCTION_WITHOUT_IMPORT!>external fun foo(): Int<!>
external interface I {
<!WASI_EXTERNAL_NOT_TOP_LEVEL_FUNCTION!>fun foo(): Int<!>
}
@WasmImport("a", "b")
external fun importedFoo(): Int
@@ -29,6 +29,7 @@ import org.jetbrains.kotlin.fir.session.*
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment
import org.jetbrains.kotlin.js.config.JSConfigurationKeys 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.config.wasmTarget
import org.jetbrains.kotlin.load.kotlin.PackageAndMetadataPartProvider import org.jetbrains.kotlin.load.kotlin.PackageAndMetadataPartProvider
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.platform.TargetPlatform
@@ -398,6 +399,7 @@ open class FirFrontendFacade(
sessionProvider, sessionProvider,
extensionRegistrars, extensionRegistrars,
languageVersionSettings, languageVersionSettings,
testServices.compilerConfigurationProvider.getCompilerConfiguration(module).wasmTarget,
null, null,
registerExtraComponents = ::registerExtraComponents, registerExtraComponents = ::registerExtraComponents,
sessionConfigurator, sessionConfigurator,
@@ -57,7 +57,7 @@ object TestFirWasmSessionFactory {
fun createModuleBasedSession( fun createModuleBasedSession(
mainModuleData: FirModuleData, sessionProvider: FirProjectSessionProvider, extensionRegistrars: List<FirExtensionRegistrar>, mainModuleData: FirModuleData, sessionProvider: FirProjectSessionProvider, extensionRegistrars: List<FirExtensionRegistrar>,
languageVersionSettings: LanguageVersionSettings, lookupTracker: LookupTracker?, languageVersionSettings: LanguageVersionSettings, wasmTarget: WasmTarget, lookupTracker: LookupTracker?,
registerExtraComponents: ((FirSession) -> Unit), registerExtraComponents: ((FirSession) -> Unit),
sessionConfigurator: FirSessionConfigurator.() -> Unit, sessionConfigurator: FirSessionConfigurator.() -> Unit,
): FirSession = ): FirSession =
@@ -66,6 +66,7 @@ object TestFirWasmSessionFactory {
sessionProvider, sessionProvider,
extensionRegistrars, extensionRegistrars,
languageVersionSettings, languageVersionSettings,
wasmTarget,
lookupTracker, lookupTracker,
icData = null, icData = null,
registerExtraComponents, registerExtraComponents,
@@ -5,6 +5,8 @@
package org.jetbrains.kotlin.js.config package org.jetbrains.kotlin.js.config
import org.jetbrains.kotlin.config.CompilerConfiguration
enum class WasmTarget { enum class WasmTarget {
JS, JS,
WASI; WASI;
@@ -16,4 +18,7 @@ enum class WasmTarget {
else -> null else -> null
} }
} }
} }
val CompilerConfiguration.wasmTarget: WasmTarget
get() = get(JSConfigurationKeys.WASM_TARGET, /* defaultValue = */ WasmTarget.JS)
@@ -16,7 +16,6 @@ import org.jetbrains.kotlin.resolve.checkers.DeclarationChecker
import org.jetbrains.kotlin.resolve.checkers.DeclarationCheckerContext import org.jetbrains.kotlin.resolve.checkers.DeclarationCheckerContext
import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal
// TODO: Implement in K2: KT-56849
object WasmWasiExternalDeclarationChecker : DeclarationChecker { object WasmWasiExternalDeclarationChecker : DeclarationChecker {
override fun check(declaration: KtDeclaration, descriptor: DeclarationDescriptor, context: DeclarationCheckerContext) { override fun check(declaration: KtDeclaration, descriptor: DeclarationDescriptor, context: DeclarationCheckerContext) {
if (descriptor !is MemberDescriptor) return if (descriptor !is MemberDescriptor) return
@@ -10,6 +10,8 @@ import org.jetbrains.kotlin.generators.util.TestGeneratorUtil
import org.jetbrains.kotlin.wasm.test.* import org.jetbrains.kotlin.wasm.test.*
import org.jetbrains.kotlin.wasm.test.diagnostics.AbstractDiagnosticsWasmTest import org.jetbrains.kotlin.wasm.test.diagnostics.AbstractDiagnosticsWasmTest
import org.jetbrains.kotlin.wasm.test.diagnostics.AbstractDiagnosticsFirWasmTest 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<String>) { fun main(args: Array<String>) {
System.setProperty("java.awt.headless", "true") System.setProperty("java.awt.headless", "true")
@@ -36,6 +38,14 @@ fun main(args: Array<String>) {
testClass<AbstractDiagnosticsFirWasmTest> { testClass<AbstractDiagnosticsFirWasmTest> {
model("diagnostics/wasmTests", excludedPattern = TestGeneratorUtil.KT_OR_KTS_WITH_FIR_PREFIX) model("diagnostics/wasmTests", excludedPattern = TestGeneratorUtil.KT_OR_KTS_WITH_FIR_PREFIX)
} }
testClass<AbstractDiagnosticsWasmWasiTest> {
model("diagnostics/wasmWasiTests", excludedPattern = TestGeneratorUtil.KT_OR_KTS_WITH_FIR_PREFIX)
}
testClass<AbstractDiagnosticsFirWasmWasiTest> {
model("diagnostics/wasmWasiTests", excludedPattern = TestGeneratorUtil.KT_OR_KTS_WITH_FIR_PREFIX)
}
} }
testGroup("wasm/wasm.tests/tests-gen", "js/js.translator/testData", testRunnerMethodName = "runTest0") { testGroup("wasm/wasm.tests/tests-gen", "js/js.translator/testData", testRunnerMethodName = "runTest0") {
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.wasm.test.diagnostics package org.jetbrains.kotlin.wasm.test.diagnostics
import org.jetbrains.kotlin.platform.wasm.WasmPlatforms import org.jetbrains.kotlin.platform.wasm.WasmPlatforms
import org.jetbrains.kotlin.test.Constructor
import org.jetbrains.kotlin.test.FirParser import org.jetbrains.kotlin.test.FirParser
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
import org.jetbrains.kotlin.test.builders.firHandlersStep 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.model.FrontendKinds
import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerTest import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerTest
import org.jetbrains.kotlin.test.runners.configurationForClassicAndFirTestsAlongside 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.LibraryProvider
import org.jetbrains.kotlin.test.services.configuration.CommonEnvironmentConfigurator 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.WasmEnvironmentConfiguratorJs
import org.jetbrains.kotlin.test.services.configuration.WasmEnvironmentConfiguratorWasi
import org.jetbrains.kotlin.test.services.sourceProviders.AdditionalDiagnosticsSourceFilesProvider import org.jetbrains.kotlin.test.services.sourceProviders.AdditionalDiagnosticsSourceFilesProvider
import org.jetbrains.kotlin.test.services.sourceProviders.CoroutineHelpersSourceFilesProvider 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<AbstractEnvironmentConfigurator>,
) : AbstractKotlinCompilerTest() {
override fun TestConfigurationBuilder.configuration() { override fun TestConfigurationBuilder.configuration() {
globalDefaults { globalDefaults {
frontend = FrontendKinds.FIR frontend = FrontendKinds.FIR
@@ -37,7 +44,7 @@ abstract class AbstractFirWasmDiagnosticTestBase(val parser: FirParser) : Abstra
useConfigurators( useConfigurators(
::CommonEnvironmentConfigurator, ::CommonEnvironmentConfigurator,
::WasmEnvironmentConfiguratorJs, wasmEnvironmentConfigurator,
) )
useAdditionalSourceProviders( useAdditionalSourceProviders(
@@ -61,4 +68,5 @@ abstract class AbstractFirWasmDiagnosticTestBase(val parser: FirParser) : Abstra
} }
} }
abstract class AbstractDiagnosticsFirWasmTest : AbstractFirWasmDiagnosticTestBase(FirParser.Psi) abstract class AbstractDiagnosticsFirWasmTest : AbstractFirWasmDiagnosticTestBase(FirParser.Psi, ::WasmEnvironmentConfiguratorJs)
abstract class AbstractDiagnosticsFirWasmWasiTest : AbstractFirWasmDiagnosticTestBase(FirParser.Psi, ::WasmEnvironmentConfiguratorWasi)
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.wasm.test.diagnostics package org.jetbrains.kotlin.wasm.test.diagnostics
import org.jetbrains.kotlin.platform.wasm.WasmPlatforms 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.TestConfigurationBuilder
import org.jetbrains.kotlin.test.builders.classicFrontendHandlersStep import org.jetbrains.kotlin.test.builders.classicFrontendHandlersStep
import org.jetbrains.kotlin.test.builders.classicFrontendStep 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.DependencyKind
import org.jetbrains.kotlin.test.model.FrontendKinds import org.jetbrains.kotlin.test.model.FrontendKinds
import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerTest 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.LibraryProvider
import org.jetbrains.kotlin.test.services.configuration.CommonEnvironmentConfigurator import org.jetbrains.kotlin.test.services.configuration.CommonEnvironmentConfigurator
import org.jetbrains.kotlin.test.services.configuration.WasmEnvironmentConfigurator import org.jetbrains.kotlin.test.services.configuration.WasmEnvironmentConfigurator
import org.jetbrains.kotlin.test.services.configuration.WasmEnvironmentConfiguratorJs 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.AdditionalDiagnosticsSourceFilesProvider
import org.jetbrains.kotlin.test.services.sourceProviders.CoroutineHelpersSourceFilesProvider import org.jetbrains.kotlin.test.services.sourceProviders.CoroutineHelpersSourceFilesProvider
abstract class AbstractDiagnosticsWasmTest : AbstractKotlinCompilerTest() { abstract class AbstractDiagnosticsWasmTestBase(
private val wasmEnvironmentConfigurator: Constructor<AbstractEnvironmentConfigurator>,
) : AbstractKotlinCompilerTest() {
override fun TestConfigurationBuilder.configuration() { override fun TestConfigurationBuilder.configuration() {
globalDefaults { globalDefaults {
frontend = FrontendKinds.ClassicFrontend frontend = FrontendKinds.ClassicFrontend
@@ -38,7 +43,7 @@ abstract class AbstractDiagnosticsWasmTest : AbstractKotlinCompilerTest() {
useConfigurators( useConfigurators(
::CommonEnvironmentConfigurator, ::CommonEnvironmentConfigurator,
::WasmEnvironmentConfiguratorJs, wasmEnvironmentConfigurator,
) )
useMetaInfoProcessors(::OldNewInferenceMetaInfoProcessor) useMetaInfoProcessors(::OldNewInferenceMetaInfoProcessor)
@@ -56,3 +61,7 @@ abstract class AbstractDiagnosticsWasmTest : AbstractKotlinCompilerTest() {
} }
} }
} }
abstract class AbstractDiagnosticsWasmTest : AbstractDiagnosticsWasmTestBase(::WasmEnvironmentConfiguratorJs)
abstract class AbstractDiagnosticsWasmWasiTest : AbstractDiagnosticsWasmTestBase(::WasmEnvironmentConfiguratorWasi)
@@ -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");
}
}
@@ -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");
}
}