From 73a63359dff40208811d4e3c6cdbbffcae0b6b4e Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Thu, 13 May 2021 15:22:41 +0300 Subject: [PATCH] [Test] Add new directive for specifying target platform for module --- .../directives/ModuleStructureDirectives.kt | 4 +++ .../test/directives/TargetPlatformEnum.kt | 33 +++++++++++++++++++ .../impl/ModuleStructureExtractorImpl.kt | 18 +++++++++- 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/directives/TargetPlatformEnum.kt diff --git a/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/directives/ModuleStructureDirectives.kt b/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/directives/ModuleStructureDirectives.kt index de9b0d1e39c..7d21b3ff8b7 100644 --- a/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/directives/ModuleStructureDirectives.kt +++ b/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/directives/ModuleStructureDirectives.kt @@ -52,4 +52,8 @@ object ModuleStructureDirectives : SimpleDirectivesContainer() { Declares backend for analyzing current module """.trimIndent() ) + + val TARGET_PLATFORM by enumDirective( + "Declares target platform for current module" + ) } 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 new file mode 100644 index 00000000000..27bc5c4e5be --- /dev/null +++ b/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/directives/TargetPlatformEnum.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2010-2021 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.test.directives + +import org.jetbrains.kotlin.config.JvmTarget +import org.jetbrains.kotlin.platform.TargetPlatform +import org.jetbrains.kotlin.platform.js.JsPlatforms +import org.jetbrains.kotlin.platform.jvm.JdkPlatform +import org.jetbrains.kotlin.platform.jvm.JvmPlatforms +import org.jetbrains.kotlin.platform.konan.NativePlatformUnspecifiedTarget +import org.jetbrains.kotlin.platform.konan.NativePlatforms + +enum class TargetPlatformEnum(val targetPlatform: TargetPlatform) { + Common( + TargetPlatform( + setOf( + JdkPlatform(JvmTarget.DEFAULT), + JsPlatforms.DefaultSimpleJsPlatform, + NativePlatformUnspecifiedTarget + ) + ) + ), + + JVM(JvmPlatforms.unspecifiedJvmPlatform), + JVM_1_6(JvmPlatforms.jvm16), + JVM_1_8(JvmPlatforms.jvm18), + + JS(JsPlatforms.defaultJsPlatform), + Native(NativePlatforms.unspecifiedNativePlatform) +} diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/impl/ModuleStructureExtractorImpl.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/impl/ModuleStructureExtractorImpl.kt index 6b9043ed8ef..2246d3decd4 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/impl/ModuleStructureExtractorImpl.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/impl/ModuleStructureExtractorImpl.kt @@ -7,7 +7,6 @@ package org.jetbrains.kotlin.test.services.impl import org.jetbrains.kotlin.platform.CommonPlatforms import org.jetbrains.kotlin.platform.TargetPlatform -import org.jetbrains.kotlin.platform.isCommon import org.jetbrains.kotlin.platform.js.JsPlatforms import org.jetbrains.kotlin.platform.jvm.JvmPlatforms import org.jetbrains.kotlin.platform.konan.NativePlatforms @@ -17,6 +16,7 @@ import org.jetbrains.kotlin.test.TestInfrastructureInternals import org.jetbrains.kotlin.test.builders.LanguageVersionSettingsBuilder import org.jetbrains.kotlin.test.directives.AdditionalFilesDirectives import org.jetbrains.kotlin.test.directives.ModuleStructureDirectives +import org.jetbrains.kotlin.test.directives.TargetPlatformEnum import org.jetbrains.kotlin.test.directives.model.ComposedRegisteredDirectives import org.jetbrains.kotlin.test.directives.model.Directive import org.jetbrains.kotlin.test.directives.model.DirectivesContainer @@ -220,6 +220,22 @@ class ModuleStructureExtractorImpl( } currentFileName = (values.first() as String).also(::validateFileName) } + ModuleStructureDirectives.TARGET_PLATFORM -> { + if (currentModuleTargetPlatform != null) { + assertions.fail { "Target platform already specified twice for module $currentModuleName" } + } + val platforms = values.map { (it as TargetPlatformEnum).targetPlatform } + currentModuleTargetPlatform = when (platforms.size) { + 0 -> assertions.fail { "Target platform specified incorrectly\nUsage: ${directive.description}" } + 1 -> platforms.single() + else -> { + if (TargetPlatformEnum.Common in values) { + assertions.fail { "You can't specify `Common` platform in combination with others" } + } + TargetPlatform(platforms.flatMapTo(mutableSetOf()) { it.componentPlatforms }) + } + } + } else -> return false }