From 301af843581362fac74fd4aef7db0eb8c68dacb3 Mon Sep 17 00:00:00 2001 From: Ilya Matveev Date: Fri, 11 May 2018 11:42:39 +0700 Subject: [PATCH] [libraries] Move SearchPathResolver into shared --- .../org/jetbrains/kotlin/cli/bc/K2Native.kt | 2 +- .../kotlin/backend/konan/KonanConfig.kt | 3 +- .../kotlin/backend/konan/KonanPhases.kt | 3 +- .../kotlin/backend/konan/OutputFiles.kt | 6 +- .../konan/descriptors/DeepPrintVisitor.kt | 2 +- ...ver.kt => SearchPathResolverExtensions.kt} | 96 +----------------- .../konan/library/impl/KonanLibrary.kt | 2 +- .../org/jetbrains/kotlin/cli/klib/main.kt | 2 +- .../konan/library/SearchPathResolver.kt | 99 +++++++++++++++++++ .../org/jetbrains/kotlin/konan/util/Util.kt | 2 +- .../kotlin/cli/utilities/InteropCompiler.kt | 2 +- 11 files changed, 112 insertions(+), 107 deletions(-) rename backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/{SearchPathResolver.kt => SearchPathResolverExtensions.kt} (58%) create mode 100644 shared/src/main/kotlin/org/jetbrains/kotlin/konan/library/SearchPathResolver.kt rename backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/util/util.kt => shared/src/main/kotlin/org/jetbrains/kotlin/konan/util/Util.kt (97%) diff --git a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt index 07996096605..a9b65cfd145 100644 --- a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt +++ b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt @@ -20,7 +20,7 @@ import com.intellij.openapi.Disposable import org.jetbrains.annotations.NotNull import org.jetbrains.annotations.Nullable import org.jetbrains.kotlin.backend.konan.* -import org.jetbrains.kotlin.backend.konan.util.profile +import org.jetbrains.kotlin.konan.util.profile import org.jetbrains.kotlin.cli.common.CLICompiler import org.jetbrains.kotlin.cli.common.CLITool import org.jetbrains.kotlin.cli.common.CommonCompilerPerformanceManager diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt index 39a581f89a3..f0665b44207 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt @@ -20,7 +20,6 @@ import com.intellij.openapi.project.Project import org.jetbrains.kotlin.backend.konan.descriptors.createForwardDeclarationsModule import org.jetbrains.kotlin.backend.konan.library.* import org.jetbrains.kotlin.backend.konan.library.impl.* -import org.jetbrains.kotlin.backend.konan.util.* import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity @@ -32,7 +31,9 @@ import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.konan.TempFiles import org.jetbrains.kotlin.konan.file.File +import org.jetbrains.kotlin.konan.library.defaultResolver import org.jetbrains.kotlin.konan.target.* +import org.jetbrains.kotlin.konan.util.profile import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.storage.StorageManager diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPhases.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPhases.kt index 230dc686121..1685dc86c73 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPhases.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPhases.kt @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.backend.konan -import org.jetbrains.kotlin.backend.konan.util.* import org.jetbrains.kotlin.konan.util.* import org.jetbrains.kotlin.konan.target.CompilerOutputKind @@ -137,7 +136,7 @@ internal class PhaseManager(val context: Context) { with (context) { profileIf(shouldProfilePhases(), "Phase ${nTabs(depth)} ${phase.name}") { - body() + body() } if (shouldVerifyDescriptors()) { diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/OutputFiles.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/OutputFiles.kt index 28ec4e33c31..b12737c160c 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/OutputFiles.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/OutputFiles.kt @@ -15,9 +15,9 @@ */ package org.jetbrains.kotlin.backend.konan -import org.jetbrains.kotlin.backend.konan.util.prefixBaseNameIfNot -import org.jetbrains.kotlin.backend.konan.util.removeSuffixIfPresent -import org.jetbrains.kotlin.backend.konan.util.suffixIfNot +import org.jetbrains.kotlin.konan.util.prefixBaseNameIfNot +import org.jetbrains.kotlin.konan.util.removeSuffixIfPresent +import org.jetbrains.kotlin.konan.util.suffixIfNot import org.jetbrains.kotlin.konan.file.File import org.jetbrains.kotlin.konan.target.CompilerOutputKind import org.jetbrains.kotlin.konan.target.KonanTarget diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/DeepPrintVisitor.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/DeepPrintVisitor.kt index 15e0687d7b4..bade799d647 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/DeepPrintVisitor.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/DeepPrintVisitor.kt @@ -16,7 +16,7 @@ package org.jetbrains.kotlin.backend.konan.descriptors -import org.jetbrains.kotlin.backend.konan.util.nTabs +import org.jetbrains.kotlin.konan.util.nTabs import org.jetbrains.kotlin.descriptors.* class DeepPrintVisitor(worker: DeclarationDescriptorVisitor): DeepVisitor(worker) { diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/SearchPathResolver.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/SearchPathResolverExtensions.kt similarity index 58% rename from backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/SearchPathResolver.kt rename to backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/SearchPathResolverExtensions.kt index c8751b6da86..06b0ca42966 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/SearchPathResolver.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/SearchPathResolverExtensions.kt @@ -17,29 +17,10 @@ package org.jetbrains.kotlin.backend.konan.library import org.jetbrains.kotlin.backend.konan.library.impl.LibraryReaderImpl -import org.jetbrains.kotlin.backend.konan.util.removeSuffixIfPresent -import org.jetbrains.kotlin.backend.konan.util.suffixIfNot import org.jetbrains.kotlin.konan.file.File -import org.jetbrains.kotlin.konan.target.Distribution +import org.jetbrains.kotlin.konan.library.SearchPathResolver import org.jetbrains.kotlin.konan.target.KonanTarget -interface SearchPathResolver { - val searchRoots: List - fun resolve(givenPath: String): File - fun defaultLinks(nostdlib: Boolean, noDefaultLibs: Boolean): List -} - -fun defaultResolver(repositories: List, target: KonanTarget): SearchPathResolver = - defaultResolver(repositories, target, Distribution()) - -fun defaultResolver(repositories: List, target: KonanTarget, distribution: Distribution): SearchPathResolver = - KonanLibrarySearchPathResolver( - repositories, - target, - distribution.klib, - distribution.localKonanDir.absolutePath - ) - fun SearchPathResolver.resolveImmediateLibraries(libraryNames: List, target: KonanTarget, abiVersion: Int = 1, @@ -129,78 +110,3 @@ fun SearchPathResolver.resolveLibrariesRecursive(libraryNames: List, resolveLibrariesRecursive(immediateLibraries, target, abiVersion) return immediateLibraries.withResolvedDependencies() } - -class KonanLibrarySearchPathResolver( - repositories: List, - val target: KonanTarget?, - val distributionKlib: String?, - val localKonanDir: String?, - val skipCurrentDir: Boolean = false -): SearchPathResolver { - - val localHead: File? - get() = localKonanDir?.File()?.klib - - val distHead: File? - get() = distributionKlib?.File()?.child("common") - - val distPlatformHead: File? - get() = target?.let { distributionKlib?.File()?.child("platform")?.child(target.visibleName) } - - val currentDirHead: File? - get() = if (!skipCurrentDir) File.userDir else null - - private val repoRoots: List by lazy { - repositories.map{File(it)} - } - - // This is the place where we specify the order of library search. - override val searchRoots: List by lazy { - (listOf(currentDirHead) + repoRoots + listOf(localHead, distHead, distPlatformHead)).filterNotNull() - } - - private fun found(candidate: File): File? { - fun check(file: File): Boolean = - file.exists && (file.isFile || File(file, "manifest").exists) - - val noSuffix = File(candidate.path.removeSuffixIfPresent(".klib")) - val withSuffix = File(candidate.path.suffixIfNot(".klib")) - return when { - check(withSuffix) -> withSuffix - check(noSuffix) -> noSuffix - else -> null - } - } - - override fun resolve(givenPath: String): File { - val given = File(givenPath) - if (given.isAbsolute) { - found(given)?.apply{ return this } - } else { - searchRoots.forEach{ - found(File(it, givenPath))?.apply{return this} - } - } - error("Could not find \"$givenPath\" in ${searchRoots.map{it.absolutePath}}.") - } - - private val File.klib - get() = File(this, "klib") - - // The libraries from the default root are linked automatically. - val defaultRoots: List - get() = listOf(distHead, distPlatformHead) - .filterNotNull() - .filter{ it.exists } - - override fun defaultLinks(nostdlib: Boolean, noDefaultLibs: Boolean): List { - val defaultLibs = defaultRoots.flatMap{ it.listFiles } - .filterNot { it.name.removeSuffixIfPresent(".klib") == "stdlib" } - .map { File(it.absolutePath) } - val result = mutableListOf() - if (!nostdlib) result.add(resolve("stdlib")) - if (!noDefaultLibs) result.addAll(defaultLibs) - return result - } -} - diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/impl/KonanLibrary.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/impl/KonanLibrary.kt index 784a03295fd..cd856e58982 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/impl/KonanLibrary.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/library/impl/KonanLibrary.kt @@ -17,7 +17,7 @@ package org.jetbrains.kotlin.backend.konan.library.impl import org.jetbrains.kotlin.backend.konan.library.KonanLibrary -import org.jetbrains.kotlin.backend.konan.util.removeSuffixIfPresent +import org.jetbrains.kotlin.konan.util.removeSuffixIfPresent import org.jetbrains.kotlin.konan.file.* import org.jetbrains.kotlin.konan.target.KonanTarget diff --git a/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/main.kt b/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/main.kt index 17c9fd2413e..eb5ba558c13 100644 --- a/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/main.kt +++ b/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/main.kt @@ -18,7 +18,6 @@ package org.jetbrains.kotlin.cli.klib // TODO: Extract `library` package as a shared jar? import org.jetbrains.kotlin.backend.konan.isStdlib -import org.jetbrains.kotlin.backend.konan.library.KonanLibrarySearchPathResolver import org.jetbrains.kotlin.backend.konan.library.impl.LibraryReaderImpl import org.jetbrains.kotlin.backend.konan.library.impl.UnzippedKonanLibrary import org.jetbrains.kotlin.backend.konan.library.impl.ZippedKonanLibrary @@ -28,6 +27,7 @@ import org.jetbrains.kotlin.config.LanguageVersion import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.konan.file.File +import org.jetbrains.kotlin.konan.library.KonanLibrarySearchPathResolver import org.jetbrains.kotlin.konan.target.Distribution import org.jetbrains.kotlin.konan.target.PlatformManager import org.jetbrains.kotlin.konan.util.DependencyProcessor diff --git a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/library/SearchPathResolver.kt b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/library/SearchPathResolver.kt new file mode 100644 index 00000000000..2a76ea72cbc --- /dev/null +++ b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/library/SearchPathResolver.kt @@ -0,0 +1,99 @@ +package org.jetbrains.kotlin.konan.library + +import org.jetbrains.kotlin.konan.file.File +import org.jetbrains.kotlin.konan.target.Distribution +import org.jetbrains.kotlin.konan.target.KonanTarget +import org.jetbrains.kotlin.konan.util.removeSuffixIfPresent +import org.jetbrains.kotlin.konan.util.suffixIfNot + + +interface SearchPathResolver { + val searchRoots: List + fun resolve(givenPath: String): File + fun defaultLinks(nostdlib: Boolean, noDefaultLibs: Boolean): List +} + +fun defaultResolver(repositories: List, target: KonanTarget): SearchPathResolver = + defaultResolver(repositories, target, Distribution()) + +fun defaultResolver(repositories: List, target: KonanTarget, distribution: Distribution): SearchPathResolver = + KonanLibrarySearchPathResolver( + repositories, + target, + distribution.klib, + distribution.localKonanDir.absolutePath + ) + +class KonanLibrarySearchPathResolver( + repositories: List, + val target: KonanTarget?, + val distributionKlib: String?, + val localKonanDir: String?, + val skipCurrentDir: Boolean = false +): SearchPathResolver { + + val localHead: File? + get() = localKonanDir?.File()?.klib + + val distHead: File? + get() = distributionKlib?.File()?.child("common") + + val distPlatformHead: File? + get() = target?.let { distributionKlib?.File()?.child("platform")?.child(target.visibleName) } + + val currentDirHead: File? + get() = if (!skipCurrentDir) File.userDir else null + + private val repoRoots: List by lazy { + repositories.map{File(it)} + } + + // This is the place where we specify the order of library search. + override val searchRoots: List by lazy { + (listOf(currentDirHead) + repoRoots + listOf(localHead, distHead, distPlatformHead)).filterNotNull() + } + + private fun found(candidate: File): File? { + fun check(file: File): Boolean = + file.exists && (file.isFile || File(file, "manifest").exists) + + val noSuffix = File(candidate.path.removeSuffixIfPresent(".klib")) + val withSuffix = File(candidate.path.suffixIfNot(".klib")) + return when { + check(withSuffix) -> withSuffix + check(noSuffix) -> noSuffix + else -> null + } + } + + override fun resolve(givenPath: String): File { + val given = File(givenPath) + if (given.isAbsolute) { + found(given)?.apply{ return this } + } else { + searchRoots.forEach{ + found(File(it, givenPath))?.apply{return this} + } + } + error("Could not find \"$givenPath\" in ${searchRoots.map{it.absolutePath}}.") + } + + private val File.klib + get() = File(this, "klib") + + // The libraries from the default root are linked automatically. + val defaultRoots: List + get() = listOf(distHead, distPlatformHead) + .filterNotNull() + .filter{ it.exists } + + override fun defaultLinks(nostdlib: Boolean, noDefaultLibs: Boolean): List { + val defaultLibs = defaultRoots.flatMap{ it.listFiles } + .filterNot { it.name.removeSuffixIfPresent(".klib") == "stdlib" } + .map { File(it.absolutePath) } + val result = mutableListOf() + if (!nostdlib) result.add(resolve("stdlib")) + if (!noDefaultLibs) result.addAll(defaultLibs) + return result + } +} diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/util/util.kt b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/util/Util.kt similarity index 97% rename from backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/util/util.kt rename to shared/src/main/kotlin/org/jetbrains/kotlin/konan/util/Util.kt index 4eb46cf3e6a..64ad47e9552 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/util/util.kt +++ b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/util/Util.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.jetbrains.kotlin.backend.konan.util +package org.jetbrains.kotlin.konan.util import kotlin.system.measureTimeMillis import org.jetbrains.kotlin.konan.file.* diff --git a/utilities/src/main/kotlin/org/jetbrains/kotlin/cli/utilities/InteropCompiler.kt b/utilities/src/main/kotlin/org/jetbrains/kotlin/cli/utilities/InteropCompiler.kt index 63f51efce29..97518c68c18 100644 --- a/utilities/src/main/kotlin/org/jetbrains/kotlin/cli/utilities/InteropCompiler.kt +++ b/utilities/src/main/kotlin/org/jetbrains/kotlin/cli/utilities/InteropCompiler.kt @@ -16,11 +16,11 @@ package org.jetbrains.kotlin.cli.utilities -import org.jetbrains.kotlin.backend.konan.library.defaultResolver import org.jetbrains.kotlin.backend.konan.library.impl.KonanLibrary import org.jetbrains.kotlin.backend.konan.library.resolveLibrariesRecursive import org.jetbrains.kotlin.konan.TempFiles import org.jetbrains.kotlin.konan.file.File +import org.jetbrains.kotlin.konan.library.defaultResolver import org.jetbrains.kotlin.konan.properties.loadProperties import org.jetbrains.kotlin.konan.target.PlatformManager import org.jetbrains.kotlin.native.interop.gen.jvm.interop