diff --git a/build.sbt b/build.sbt index 183f3247b942..d4c61dc25b49 100644 --- a/build.sbt +++ b/build.sbt @@ -1963,7 +1963,6 @@ lazy val `runtime-compiler` = (Test / fork) := true, libraryDependencies ++= Seq( "com.chuusai" %% "shapeless" % shapelessVersion, - "org.graalvm.truffle" % "truffle-api" % graalMavenPackagesVersion, "junit" % "junit" % junitVersion % Test, "com.github.sbt" % "junit-interface" % junitIfVersion % Test, "org.scalatest" %% "scalatest" % scalatestVersion % Test, diff --git a/engine/runtime-compiler/src/main/java/org/enso/compiler/PackageRepositoryUtils.java b/engine/runtime-compiler/src/main/java/org/enso/compiler/PackageRepositoryUtils.java deleted file mode 100644 index 42b766205fb7..000000000000 --- a/engine/runtime-compiler/src/main/java/org/enso/compiler/PackageRepositoryUtils.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.enso.compiler; - -import com.oracle.truffle.api.TruffleFile; -import java.io.IOException; -import java.util.Optional; -import java.util.logging.Level; -import java.util.logging.Logger; -import org.enso.pkg.Package; -import org.enso.pkg.QualifiedName; - -public final class PackageRepositoryUtils { - private static final Logger LOG = Logger.getLogger(PackageRepositoryUtils.class.getName()); - - private PackageRepositoryUtils() {} - - /** - * Fetches the module name associated with a given file, using the environment packages - * information. - * - * @param packageRepository repository to work on - * @param file the path to decode. - * @return a qualified name of the module corresponding to the file, if exists. - */ - public static Optional getModuleNameForFile( - PackageRepository packageRepository, TruffleFile file) { - return scala.jdk.javaapi.CollectionConverters.asJava(packageRepository.getLoadedPackages()) - .stream() - .filter(pkg -> file.startsWith(pkg.sourceDir())) - .map(pkg -> pkg.moduleNameForFile(file)) - .findFirst(); - } - - /** - * Finds the package the provided module belongs to. - * - * @param packageRepository repository to work on - * @param file the module to find the package of - * @return {@code module}'s package, if exists - */ - public static Optional> getPackageOf( - PackageRepository packageRepository, TruffleFile file) { - try { - if (file != null) { - file = file.getCanonicalFile(); - for (var pkg : packageRepository.getLoadedPackagesJava()) { - if (file.startsWith(pkg.root().getCanonicalFile())) { - return Optional.of(pkg); - } - } - } - } catch (IOException e) { - LOG.log(Level.WARNING, null, e); - } - return Optional.empty(); - } -} diff --git a/engine/runtime-compiler/src/main/scala/org/enso/compiler/PackageRepository.scala b/engine/runtime-compiler/src/main/scala/org/enso/compiler/PackageRepository.scala index 57fa6f27d8f1..eff0d52a835d 100644 --- a/engine/runtime-compiler/src/main/scala/org/enso/compiler/PackageRepository.scala +++ b/engine/runtime-compiler/src/main/scala/org/enso/compiler/PackageRepository.scala @@ -1,16 +1,15 @@ package org.enso.compiler -import com.oracle.truffle.api.TruffleFile import org.enso.editions.LibraryName import org.enso.compiler.context.CompilerContext import org.enso.compiler.core.ir.{Module => IRModule} import org.enso.pkg.{ComponentGroups, Package, QualifiedName} import scala.collection.immutable.ListSet -import scala.jdk.OptionConverters.RichOption /** Manages loaded packages and modules. */ trait PackageRepository { + type TFile /** Initialize the package repository. * @@ -34,10 +33,7 @@ trait PackageRepository { def isPackageLoaded(libraryName: LibraryName): Boolean /** Get a sequence of currently loaded packages. */ - def getLoadedPackages: Seq[Package[TruffleFile]] - - /** Get a sequence of currently loaded packages. */ - def getLoadedPackagesJava: java.lang.Iterable[Package[TruffleFile]] + def getLoadedPackages: Seq[Package[TFile]] /** Get a sequence of currently loaded modules. */ def getLoadedModules: Seq[CompilerContext.Module] @@ -65,12 +61,12 @@ trait PackageRepository { /** Register the main project package. */ def registerMainProjectPackage( libraryName: LibraryName, - pkg: Package[TruffleFile] + pkg: Package[TFile] ): Unit /** @return the main project package, if it exists */ - def getMainProjectPackage: Option[Package[TruffleFile]] + def getMainProjectPackage: Option[Package[TFile]] /** Register a single module, outside of any packages or part of an already * loaded package, that has been created manually during runtime. @@ -95,13 +91,7 @@ trait PackageRepository { def isNamespaceRegistered(namespace: String): Boolean /** Returns a package directory corresponding to the requested library */ - def getPackageForLibrary(lib: LibraryName): Option[Package[TruffleFile]] - - /** Returns a package directory corresponding to the requested library */ - def getPackageForLibraryJava( - libraryName: LibraryName - ): java.util.Optional[Package[TruffleFile]] = - getPackageForLibrary(libraryName).toJava + def getPackageForLibrary(lib: LibraryName): Option[Package[TFile]] /** Returns all loaded modules of the requested library */ def getModulesForLibrary( diff --git a/engine/runtime/src/main/java/org/enso/interpreter/caches/ImportExportCache.java b/engine/runtime/src/main/java/org/enso/interpreter/caches/ImportExportCache.java index 7144728b00f1..df1379df06d4 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/caches/ImportExportCache.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/caches/ImportExportCache.java @@ -106,7 +106,8 @@ public Optional getCacheRoots(EnsoContext context) { .getPackageForLibraryJava(libraryName) .map( pkg -> { - var bindingsCacheRoot = pkg.getBindingsCacheRootForPackage(Info.ensoVersion()); + TruffleFile bindingsCacheRoot = + pkg.getBindingsCacheRootForPackage(Info.ensoVersion()); var localCacheRoot = bindingsCacheRoot.resolve(libraryName.namespace()); var distribution = context.getDistributionManager(); var pathSegments = diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/EnsoContext.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/EnsoContext.java index bcc455d84d15..e664ff8ba34d 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/EnsoContext.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/EnsoContext.java @@ -39,8 +39,6 @@ import java.util.logging.Level; import org.enso.common.LanguageInfo; import org.enso.compiler.Compiler; -import org.enso.compiler.PackageRepository; -import org.enso.compiler.PackageRepositoryUtils; import org.enso.compiler.data.CompilerConfig; import org.enso.distribution.DistributionManager; import org.enso.distribution.locking.LockManager; @@ -85,7 +83,7 @@ public final class EnsoContext { private final PrintStream err; private final InputStream in; private final BufferedReader inReader; - private @CompilationFinal PackageRepository packageRepository; + private @CompilationFinal DefaultPackageRepository packageRepository; private @CompilationFinal TopLevelScope topScope; private final ThreadManager threadManager; private final ThreadExecutors threadExecutors; @@ -365,7 +363,11 @@ public Optional getModuleNameForFile(File path) { * @return a qualified name of the module corresponding to the file, if exists. */ public Optional getModuleNameForFile(TruffleFile file) { - return PackageRepositoryUtils.getModuleNameForFile(packageRepository, file); + return scala.jdk.javaapi.CollectionConverters.asJava(packageRepository.getLoadedPackages()) + .stream() + .filter(pkg -> file.startsWith(pkg.sourceDir())) + .map(pkg -> pkg.moduleNameForFile(file)) + .findFirst(); } /** @@ -603,7 +605,7 @@ private Object findGuestJava() throws IllegalStateException { * @return {@code module}'s package, if exists */ public Optional> getPackageOf(TruffleFile file) { - return PackageRepositoryUtils.getPackageOf(packageRepository, file); + return TruffleCompilerContext.getPackageOf(packageRepository, file); } /** @@ -803,7 +805,7 @@ public TruffleLogger getLogger() { /** * @return the package repository */ - public PackageRepository getPackageRepository() { + public DefaultPackageRepository getPackageRepository() { return packageRepository; } diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/TruffleCompilerContext.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/TruffleCompilerContext.java index d4b934d61851..274b9eb99a77 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/TruffleCompilerContext.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/TruffleCompilerContext.java @@ -18,10 +18,10 @@ import java.util.concurrent.Future; import java.util.function.Consumer; import java.util.logging.Level; +import java.util.logging.Logger; import org.enso.common.CompilationStage; import org.enso.common.LanguageInfo; import org.enso.compiler.Compiler; -import org.enso.compiler.PackageRepository; import org.enso.compiler.Passes; import org.enso.compiler.context.CompilerContext; import org.enso.compiler.context.FreshNameSupply; @@ -50,6 +50,7 @@ import scala.collection.immutable.SetOps; final class TruffleCompilerContext implements CompilerContext { + private static final Logger LOG = Logger.getLogger(TruffleCompilerContext.class.getName()); private final EnsoContext context; private final TruffleLogger loggerCompiler; @@ -86,7 +87,7 @@ public boolean isInteractiveMode() { } @Override - public PackageRepository getPackageRepository() { + public DefaultPackageRepository getPackageRepository() { return context.getPackageRepository(); } @@ -163,6 +164,13 @@ public boolean isInteractive(CompilerContext.Module module) { return ((Module) module).unsafeModule().isInteractive(); } + @Override + public boolean isModuleInRootPackage(CompilerContext.Module module) { + var file = ((Module) module).getSourceFile(); + var pkg = getPackageOf(getPackageRepository(), file); + return pkg.isPresent() && pkg.get() == getPackageRepository().getMainProjectPackage().get(); + } + @Override public boolean wasLoadedFromCache(CompilerContext.Module module) { return ((Module) module).unsafeModule().wasLoadedFromCache(); @@ -775,8 +783,7 @@ public BindingsMap getBindingsMap() { return bindings; } - @Override - public TruffleFile getSourceFile() { + final TruffleFile getSourceFile() { return module.getSourceFile(); } @@ -847,4 +854,28 @@ private static QualifiedName toQualifiedName(LibraryName libraryName) { var namespace = cons(libraryName.namespace(), nil()); return new QualifiedName(namespace, libraryName.name()); } + + /** + * Finds the package the provided module belongs to. + * + * @param packageRepository repository to work on + * @param file the module to find the package of + * @return {@code module}'s package, if exists + */ + static Optional> getPackageOf( + DefaultPackageRepository packageRepository, TruffleFile file) { + try { + if (file != null) { + file = file.getCanonicalFile(); + for (var pkg : packageRepository.getLoadedPackagesJava()) { + if (file.startsWith(pkg.root().getCanonicalFile())) { + return Optional.of(pkg); + } + } + } + } catch (IOException e) { + LOG.log(Level.WARNING, null, e); + } + return Optional.empty(); + } } diff --git a/engine/runtime/src/main/scala/org/enso/interpreter/runtime/DefaultPackageRepository.scala b/engine/runtime/src/main/scala/org/enso/interpreter/runtime/DefaultPackageRepository.scala index c6525e72f2f7..285fb51ff2f0 100644 --- a/engine/runtime/src/main/scala/org/enso/interpreter/runtime/DefaultPackageRepository.scala +++ b/engine/runtime/src/main/scala/org/enso/interpreter/runtime/DefaultPackageRepository.scala @@ -1,5 +1,7 @@ package org.enso.interpreter.runtime +import scala.jdk.OptionConverters.RichOption + import org.enso.compiler.PackageRepository import org.enso.compiler.context.CompilerContext import org.enso.compiler.core.ir.{Module => IRModule} @@ -52,6 +54,7 @@ private class DefaultPackageRepository( builtins: Builtins, notificationHandler: NotificationHandler ) extends PackageRepository { + type TFile = TruffleFile private val logger = Logger[DefaultPackageRepository] @@ -176,10 +179,17 @@ private class DefaultPackageRepository( } /** @inheritdoc */ - override def getMainProjectPackage: Option[Package[TruffleFile]] = { + override def getMainProjectPackage + : Option[Package[com.oracle.truffle.api.TruffleFile]] = { projectPackage } + /** Returns a package directory corresponding to the requested library */ + def getPackageForLibraryJava( + libraryName: LibraryName + ): java.util.Optional[Package[TruffleFile]] = + getPackageForLibrary(libraryName).toJava + private def registerPackageInternal( libraryName: LibraryName, libraryVersion: LibraryVersion, @@ -447,7 +457,7 @@ private class DefaultPackageRepository( override def getLoadedPackages: Seq[Package[TruffleFile]] = loadedPackages.values.toSeq.flatten - override def getLoadedPackagesJava: java.lang.Iterable[Package[TruffleFile]] = + def getLoadedPackagesJava: java.lang.Iterable[Package[TruffleFile]] = loadedPackages.flatMap(_._2).asJava /** @inheritdoc */ @@ -638,7 +648,7 @@ private object DefaultPackageRepository { context: EnsoContext, builtins: Builtins, notificationHandler: NotificationHandler - ): PackageRepository = { + ): DefaultPackageRepository = { val rawEdition = editionOverride .map(v => Editions.Raw.Edition(parent = Some(v))) .orElse(