All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jetbrains.kotlin.cli.jvm.compiler.cliJavaModuleUtils.kt Maven / Gradle / Ivy

There is a newer version: 2.1.0-RC
Show newest version
/*
 * 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.cli.jvm.compiler

import org.jetbrains.kotlin.cli.jvm.index.JavaRoot
import org.jetbrains.kotlin.cli.jvm.modules.CliJavaModuleFinder
import org.jetbrains.kotlin.resolve.jvm.modules.JavaModule

fun JavaModule.getJavaModuleRoots(): List =
    moduleRoots.map { (root, isBinary, isBinarySignature) ->
        val type = when {
            isBinarySignature -> JavaRoot.RootType.BINARY_SIG
            isBinary -> JavaRoot.RootType.BINARY
            else -> JavaRoot.RootType.SOURCE
        }
        JavaRoot(root, type)
    }

/**
 * Computes the JDK's default root modules. See [JEP 261: Module System](http://openjdk.java.net/jeps/261).
 */
fun CliJavaModuleFinder.computeDefaultRootModules(): List {
    val result = arrayListOf()

    val systemModules = systemModules.associateBy(JavaModule::name)
    val javaSeExists = "java.se" in systemModules
    if (javaSeExists) {
        // The java.se module is a root, if it exists.
        result.add("java.se")
    }

    fun JavaModule.Explicit.exportsAtLeastOnePackageUnqualified(): Boolean = moduleInfo.exports.any { it.toModules.isEmpty() }

    if (!javaSeExists) {
        // If it does not exist then every java.* module on the upgrade module path or among the system modules
        // that exports at least one package, without qualification, is a root.
        for ((name, module) in systemModules) {
            if (name.startsWith("java.") && module.exportsAtLeastOnePackageUnqualified()) {
                result.add(name)
            }
        }
    }

    for ((name, module) in systemModules) {
        // Every non-java.* module on the upgrade module path or among the system modules that exports at least one package,
        // without qualification, is also a root.
        if (!name.startsWith("java.") && module.exportsAtLeastOnePackageUnqualified()) {
            result.add(name)
        }
    }

    return result
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy