From 7bb77e5672f34792f63c6fe96d7b60033343698f Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Sun, 15 Mar 2020 17:38:02 +0100 Subject: [PATCH] Move JS binary version utilities to 'js.config' This allows to replace dependency of 'util' on 'deserialization' with dependency on 'descriptors'. --- compiler/config/build.gradle.kts | 2 +- compiler/resolution/build.gradle.kts | 3 +- compiler/util/build.gradle.kts | 2 +- .../jetbrains/kotlin/utils/LibraryUtils.kt | 30 ------------ js/js.config/build.gradle.kts | 2 + .../jetbrains/kotlin/utils/JsLibraryUtils.kt | 48 +++++++++++++------ .../utils/KotlinJavascriptMetadataUtils.kt | 16 +------ js/js.serializer/build.gradle.kts | 3 +- .../jetbrains/kotlin/gradle/tasks/Tasks.kt | 6 +-- .../kotlin/maven/K2JSCompilerMojo.java | 4 +- prepare/jps-plugin/build.gradle.kts | 1 + 11 files changed, 48 insertions(+), 69 deletions(-) rename {compiler/util => js/js.config}/src/org/jetbrains/kotlin/utils/JsLibraryUtils.kt (83%) rename {compiler/util => js/js.config}/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt (85%) diff --git a/compiler/config/build.gradle.kts b/compiler/config/build.gradle.kts index c5132853e9c..2f8bd8523e7 100644 --- a/compiler/config/build.gradle.kts +++ b/compiler/config/build.gradle.kts @@ -4,7 +4,7 @@ plugins { } dependencies { - api(project(":core:descriptors")) + api(project(":core:deserialization")) api(project(":compiler:util")) compileOnly(intellijCoreDep()) { includeJars("intellij-core") } } diff --git a/compiler/resolution/build.gradle.kts b/compiler/resolution/build.gradle.kts index ab4199bf4b7..18b5a685ac4 100644 --- a/compiler/resolution/build.gradle.kts +++ b/compiler/resolution/build.gradle.kts @@ -1,4 +1,3 @@ - plugins { kotlin("jvm") id("jps-compatible") @@ -6,7 +5,7 @@ plugins { dependencies { compile(project(":compiler:util")) - compile(project(":core:descriptors")) + compile(project(":core:deserialization")) compileOnly(intellijDep()) { includeJars("trove4j") } } diff --git a/compiler/util/build.gradle.kts b/compiler/util/build.gradle.kts index 0eea3d74a72..b7aaec60f31 100644 --- a/compiler/util/build.gradle.kts +++ b/compiler/util/build.gradle.kts @@ -7,7 +7,7 @@ plugins { dependencies { api(kotlinStdlib()) api(project(":compiler:compiler.version")) - api(project(":core:deserialization")) + api(project(":core:descriptors")) compileOnly(project(":kotlin-reflect-api")) compileOnly(intellijCoreDep()) { includeJars("intellij-core") } diff --git a/compiler/util/src/org/jetbrains/kotlin/utils/LibraryUtils.kt b/compiler/util/src/org/jetbrains/kotlin/utils/LibraryUtils.kt index 7586702eec8..382997c2028 100644 --- a/compiler/util/src/org/jetbrains/kotlin/utils/LibraryUtils.kt +++ b/compiler/util/src/org/jetbrains/kotlin/utils/LibraryUtils.kt @@ -17,14 +17,12 @@ package org.jetbrains.kotlin.utils import com.intellij.openapi.diagnostic.Logger -import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.vfs.VirtualFile import java.io.* import java.util.* import java.util.jar.Attributes import java.util.jar.JarFile import java.util.jar.Manifest -import java.util.zip.ZipFile object LibraryUtils { private val LOG = Logger.getInstance(LibraryUtils::class.java) @@ -60,38 +58,10 @@ object LibraryUtils { return classesRoots.firstOrNull { it.name == jarName } } - @Suppress("unused") // used in K2JSCompilerMojo - @JvmStatic fun isKotlinJavascriptLibrary(library: File): Boolean = KotlinJavascriptMetadataUtils.loadMetadata(library).isNotEmpty() - @JvmStatic fun isKotlinJavascriptStdLibrary(library: File): Boolean { return checkAttributeValue(library, TITLE_KOTLIN_JAVASCRIPT_STDLIB, Attributes.Name.IMPLEMENTATION_TITLE) } - private fun isZippedKlibInZip(candidate: File): Boolean { - var manifestFound = false - var irFound = false - for (entry in ZipFile(candidate).entries()) { - if (entry.name == "manifest") manifestFound = true - if (entry.name == "ir/") irFound = true - } - return manifestFound && irFound - } - - private fun isZippedKlib(candidate: File): Boolean { - return candidate.extension == "klib" - } - - @JvmStatic - fun isKotlinJavascriptIrLibrary(candidate: File): Boolean { - return when { - isZippedKlib(candidate) -> true - FileUtil.isJarOrZip(candidate) -> isZippedKlibInZip(candidate) - !File(candidate, "manifest").isFile -> false - !File(candidate, "ir").isDirectory -> false - else -> true - } - } - private fun getManifestFromJar(library: File): Manifest? { if (!library.canRead()) return null diff --git a/js/js.config/build.gradle.kts b/js/js.config/build.gradle.kts index f36c770a132..30942d13702 100644 --- a/js/js.config/build.gradle.kts +++ b/js/js.config/build.gradle.kts @@ -4,7 +4,9 @@ plugins { } dependencies { + api(project(":core:deserialization")) api(project(":compiler:config")) + compileOnly(intellijCoreDep()) { includeJars("intellij-core") } } sourceSets { diff --git a/compiler/util/src/org/jetbrains/kotlin/utils/JsLibraryUtils.kt b/js/js.config/src/org/jetbrains/kotlin/utils/JsLibraryUtils.kt similarity index 83% rename from compiler/util/src/org/jetbrains/kotlin/utils/JsLibraryUtils.kt rename to js/js.config/src/org/jetbrains/kotlin/utils/JsLibraryUtils.kt index a3dcd3f18d4..43fec00276d 100644 --- a/compiler/util/src/org/jetbrains/kotlin/utils/JsLibraryUtils.kt +++ b/js/js.config/src/org/jetbrains/kotlin/utils/JsLibraryUtils.kt @@ -1,17 +1,6 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Copyright 2010-2020 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.utils @@ -27,10 +16,28 @@ import java.util.zip.ZipException import java.util.zip.ZipFile object JsLibraryUtils { - private val LOG = Logger.getInstance(LibraryUtils::class.java) + private val LOG = Logger.getInstance(JsLibraryUtils::class.java) private val META_INF_RESOURCES = "${LibraryUtils.META_INF}resources/" + // Also used in K2JSCompilerMojo + @JvmStatic + fun isKotlinJavascriptLibrary(library: File): Boolean = + KotlinJavascriptMetadataUtils.loadMetadata(library).isNotEmpty() + + // Also used in K2JSCompilerMojo + @Suppress("unused") + @JvmStatic + fun isKotlinJavascriptIrLibrary(candidate: File): Boolean { + return when { + isZippedKlib(candidate) -> true + FileUtil.isJarOrZip(candidate) -> isZippedKlibInZip(candidate) + !File(candidate, "manifest").isFile -> false + !File(candidate, "ir").isDirectory -> false + else -> true + } + } + @JvmStatic fun copyJsFilesFromLibraries(libraries: List, outputLibraryJsPath: String, copySourceMap: Boolean = false) { for (library in libraries) { val file = File(library) @@ -63,6 +70,19 @@ object JsLibraryUtils { } } + private fun isZippedKlibInZip(candidate: File): Boolean { + var manifestFound = false + var irFound = false + for (entry in ZipFile(candidate).entries()) { + if (entry.name == "manifest") manifestFound = true + if (entry.name == "ir/") irFound = true + } + return manifestFound && irFound + } + + private fun isZippedKlib(candidate: File): Boolean = + candidate.extension == "klib" + private fun File.runIfFileExists(relativePath: String, action: (JsLibrary) -> Unit) { if (isFile) { action(JsLibrary(readText(), relativePath, correspondingSourceMapFile().contentIfExists(), this)) diff --git a/compiler/util/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt b/js/js.config/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt similarity index 85% rename from compiler/util/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt rename to js/js.config/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt index 344116dba6e..10668c725d3 100644 --- a/compiler/util/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt +++ b/js/js.config/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt @@ -1,17 +1,6 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Copyright 2010-2020 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.utils @@ -24,7 +13,6 @@ import java.util.* class KotlinJavascriptMetadata(val version: JsMetadataVersion, val moduleName: String, val body: ByteArray) -// TODO: move to JS modules class JsMetadataVersion(vararg numbers: Int) : BinaryVersion(*numbers) { override fun isCompatible(): Boolean = this.isCompatibleTo(INSTANCE) diff --git a/js/js.serializer/build.gradle.kts b/js/js.serializer/build.gradle.kts index b121718c10a..7f496242c40 100644 --- a/js/js.serializer/build.gradle.kts +++ b/js/js.serializer/build.gradle.kts @@ -1,4 +1,3 @@ - plugins { kotlin("jvm") id("jps-compatible") @@ -9,6 +8,7 @@ dependencies { compile(project(":compiler:frontend")) compile(project(":compiler:serialization")) compile(project(":js:js.ast")) + compile(project(":js:js.config")) compileOnly(intellijCoreDep()) { includeJars("intellij-core") } } @@ -16,4 +16,3 @@ sourceSets { "main" { projectDefault() } "test" {} } - diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt index b908735f14a..0ebdc3040ae 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt @@ -37,7 +37,7 @@ import org.jetbrains.kotlin.gradle.report.BuildReportMode import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.incremental.ChangedFiles import org.jetbrains.kotlin.library.impl.isKotlinLibrary -import org.jetbrains.kotlin.utils.LibraryUtils +import org.jetbrains.kotlin.utils.JsLibraryUtils import java.io.File import javax.inject.Inject @@ -562,7 +562,7 @@ open class Kotlin2JsCompile : AbstractKotlinCompile(), Ko get() = kotlinOptionsImpl.sourceMapBaseDirs private fun isHybridKotlinJsLibrary(file: File): Boolean = - LibraryUtils.isKotlinJavascriptLibrary(file) && isKotlinLibrary(file) + JsLibraryUtils.isKotlinJavascriptLibrary(file) && isKotlinLibrary(file) private fun KotlinJsOptions.isPreIrBackendDisabled(): Boolean = listOf( @@ -590,7 +590,7 @@ open class Kotlin2JsCompile : AbstractKotlinCompile(), Ko ::isHybridKotlinJsLibrary } } else { - LibraryUtils::isKotlinJavascriptLibrary + JsLibraryUtils::isKotlinJavascriptLibrary } override fun callCompilerAsync(args: K2JSCompilerArguments, sourceRoots: SourceRoots, changedFiles: ChangedFiles) { diff --git a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JSCompilerMojo.java b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JSCompilerMojo.java index 34091c2612d..6bff8bf77ff 100644 --- a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JSCompilerMojo.java +++ b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JSCompilerMojo.java @@ -28,7 +28,7 @@ import org.apache.maven.project.MavenProject; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments; import org.jetbrains.kotlin.cli.js.K2JSCompiler; -import org.jetbrains.kotlin.utils.LibraryUtils; +import org.jetbrains.kotlin.utils.JsLibraryUtils; import java.io.File; import java.util.ArrayList; @@ -146,7 +146,7 @@ public class K2JSCompilerMojo extends KotlinCompileMojoBase