From 4ab1417ad09c914cc71edd630227d4c8db0d1219 Mon Sep 17 00:00:00 2001 From: Hubert Plociniczak Date: Mon, 16 Dec 2024 16:32:56 +0100 Subject: [PATCH 01/17] Native Language Server integration with PM The first attempt at a) building `enso` native-image that includes full Language Server b) integrating the executable as an experimental feature during project startup The change (for now) assumes that `enso` executable appears in Enso's default `engines` directory. To build and run the new integration one has to a) `engine-runner/buildNativeImage` b) run PM with `--native-language-server` This change also adds a copy of some of logback's code (`SocketAppender` or a simple socket server`) as it was impossible to debug serialization bugs without some additional logging. --- build.sbt | 28 +- engine/common/src/main/java/module-info.java | 1 + .../java/org/enso/common/ContextFactory.java | 22 +- .../src/main/java/module-info.java | 3 +- .../boot/resource/RepoInitialization.java | 85 +--- .../enso/languageserver/boot/MainModule.scala | 13 +- .../json/JsonConnectionController.scala | 9 +- .../runtime/RuntimeConnector.scala | 15 +- .../launcher/components/LauncherRunner.scala | 3 +- .../src/main/java/org/enso/runner/Main.java | 39 +- .../java/org/enso/runner/RunnerLogging.java | 3 +- .../org/enso/runner/serialization-config.json | 51 +++ .../server/RuntimeServerInstrument.java | 9 +- .../org/enso/interpreter/EnsoLanguage.java | 7 +- .../interpreter/runtime/IrToTruffle.scala | 12 +- .../service/logback/EnsoSocketAppender.java | 387 ++++++++++++++++++ .../logging/service/logback/LogbackSetup.java | 3 +- .../service/logback/LoggingServer.java | 5 +- .../service/logback/SocketLoggingNode.java | 109 +++++ .../logging/service/logback/SocketServer.java | 164 ++++++++ .../org/enso/projectmanager/boot/Cli.scala | 9 + .../projectmanager/boot/ProjectManager.scala | 1 + .../projectmanager/boot/configuration.scala | 1 + .../ExecutorWithUnlimitedPool.scala | 3 +- .../LanguageServerController.scala | 3 +- .../LanguageServerDescriptor.scala | 1 + .../service/ProjectCreationService.scala | 3 +- .../runner/JVMSettings.scala | 9 +- .../runner/JavaCommand.scala | 15 +- .../runner/NativeJavaCommand.scala | 20 + .../runtimeversionmanager/runner/Runner.scala | 48 ++- 31 files changed, 936 insertions(+), 145 deletions(-) create mode 100644 lib/scala/logging-service-logback/src/main/java/org/enso/logging/service/logback/EnsoSocketAppender.java create mode 100644 lib/scala/logging-service-logback/src/main/java/org/enso/logging/service/logback/SocketLoggingNode.java create mode 100644 lib/scala/logging-service-logback/src/main/java/org/enso/logging/service/logback/SocketServer.java create mode 100644 lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/NativeJavaCommand.scala diff --git a/build.sbt b/build.sbt index 42fef0f9e36e..97f276b3c009 100644 --- a/build.sbt +++ b/build.sbt @@ -2166,13 +2166,18 @@ lazy val `engine-common` = project commands += WithDebugCommand.withDebug, Test / envVars ++= distributionEnvironmentOverrides, libraryDependencies ++= Seq( - "org.graalvm.polyglot" % "polyglot" % graalMavenPackagesVersion % "provided" + "org.graalvm.polyglot" % "polyglot" % graalMavenPackagesVersion % "provided", + "org.graalvm.truffle" % "truffle-api" % graalMavenPackagesVersion % "provided" + ), + libraryDependencies ++= GraalVM.modules.map( + _.withConfigurations(Some(Runtime.name)) ), Compile / moduleDependencies ++= { Seq( - "org.graalvm.polyglot" % "polyglot" % graalMavenPackagesVersion, - "org.slf4j" % "slf4j-api" % slf4jVersion - ) + "org.graalvm.truffle" % "truffle-api" % graalMavenPackagesVersion, + "org.graalvm.polyglot" % "polyglot" % graalMavenPackagesVersion, + "org.slf4j" % "slf4j-api" % slf4jVersion + ) ++ GraalVM.modules.map(_.withConfigurations(Some(Runtime.name))) }, Compile / internalModuleDependencies := Seq( (`logging-utils` / Compile / exportedModule).value, @@ -2278,16 +2283,20 @@ lazy val `language-server` = (project in file("engine/language-server")) "org.eclipse.jgit" % "org.eclipse.jgit" % jgitVersion, "org.apache.tika" % "tika-core" % tikaVersion % Test ), + libraryDependencies ++= GraalVM.modules.map( + _.withConfigurations(Some(Runtime.name)) + ), javaModuleName := "org.enso.language.server", Compile / moduleDependencies ++= Seq( "org.graalvm.polyglot" % "polyglot" % graalMavenPackagesVersion, + "org.graalvm.truffle" % "truffle-api" % graalMavenPackagesVersion, "org.slf4j" % "slf4j-api" % slf4jVersion, "commons-cli" % "commons-cli" % commonsCliVersion, "commons-io" % "commons-io" % commonsIoVersion, "com.google.flatbuffers" % "flatbuffers-java" % flatbuffersVersion, "org.eclipse.jgit" % "org.eclipse.jgit" % jgitVersion - ), + ) ++ GraalVM.modules.map(_.withConfigurations(Some(Runtime.name))), Compile / internalModuleDependencies := Seq( (`akka-wrapper` / Compile / exportedModule).value, (`zio-wrapper` / Compile / exportedModule).value, @@ -3592,6 +3601,9 @@ lazy val `engine-runner` = project val epbLang = (`runtime-language-epb` / Compile / fullClasspath).value .map(_.data.getAbsolutePath) + val langServer = + (`language-server` / Compile / fullClasspath).value + .map(_.data.getAbsolutePath) val core = ( runnerDeps ++ runtimeDeps ++ @@ -3599,6 +3611,7 @@ lazy val `engine-runner` = project replDebugInstr ++ runtimeServerInstr ++ idExecInstr ++ + langServer ++ epbLang ).distinct val stdLibsJars = @@ -3682,6 +3695,7 @@ lazy val `engine-runner` = project "-H:IncludeResources=.*Main.enso$", "-H:+AddAllCharsets", "-H:+IncludeAllLocales", + "-H:+UnlockExperimentalVMOptions", "-ea", // useful perf & debug switches: // "-g", @@ -3698,6 +3712,7 @@ lazy val `engine-runner` = project "org.jline", "io.methvin.watchservice", "zio.internal", + "zio", "org.enso.runner", "sun.awt", "sun.java2d", @@ -3709,7 +3724,8 @@ lazy val `engine-runner` = project "akka.http", "org.enso.base", "org.enso.image", - "org.enso.table" + "org.enso.table", + "org.eclipse.jgit" ) ) } diff --git a/engine/common/src/main/java/module-info.java b/engine/common/src/main/java/module-info.java index ab242d316c5e..9a5be06bb020 100644 --- a/engine/common/src/main/java/module-info.java +++ b/engine/common/src/main/java/module-info.java @@ -1,5 +1,6 @@ module org.enso.engine.common { requires org.graalvm.polyglot; + requires org.graalvm.truffle; requires org.enso.logging.utils; requires org.enso.logging.config; requires org.slf4j; diff --git a/engine/common/src/main/java/org/enso/common/ContextFactory.java b/engine/common/src/main/java/org/enso/common/ContextFactory.java index 79c1e5a9ee47..f0567aeba75f 100644 --- a/engine/common/src/main/java/org/enso/common/ContextFactory.java +++ b/engine/common/src/main/java/org/enso/common/ContextFactory.java @@ -1,5 +1,6 @@ package org.enso.common; +import com.oracle.truffle.api.TruffleOptions; import java.io.File; import java.io.InputStream; import java.io.OutputStream; @@ -9,6 +10,7 @@ import org.enso.logger.JulHandler; import org.enso.logging.config.LoggerSetup; import org.graalvm.polyglot.Context; +import org.graalvm.polyglot.Engine; import org.graalvm.polyglot.HostAccess; import org.graalvm.polyglot.io.MessageTransport; import org.slf4j.event.Level; @@ -52,6 +54,7 @@ public final class ContextFactory { private String checkForWarnings; private int warningsLimit = 100; private java.util.Map options = new HashMap<>(); + private java.util.Map engineOptions = new HashMap<>(); private boolean enableDebugServer; private ContextFactory() {} @@ -145,6 +148,11 @@ public ContextFactory options(Map options) { return this; } + public ContextFactory engineOptions(Map options) { + this.engineOptions = options; + return this; + } + public ContextFactory checkForWarnings(String fqnOfMethod) { this.checkForWarnings = fqnOfMethod; return this; @@ -189,7 +197,7 @@ public Context build() { if (enableDebugServer) { builder.option(DebugServerInfo.ENABLE_OPTION, "true"); } - if (messageTransport != null) { + if (!TruffleOptions.AOT && messageTransport != null) { builder.serverTransport(messageTransport); } builder.option(RuntimeOptions.LOG_LEVEL, logLevelName); @@ -227,6 +235,18 @@ public Context build() { .option("java.UseBindingsLoader", "true") .allowCreateThread(true); } + if (TruffleOptions.AOT) { + // In AOT mode one must not use a shared engine; the latter causes issues when initializing + // message transport - it is set to `null`. + var eng = + Engine.newBuilder() + .allowExperimentalOptions(true) + .serverTransport(messageTransport) + .options(engineOptions); + builder.engine(eng.build()); + } else if (messageTransport != null) { + builder.serverTransport(messageTransport); + } var ctx = builder.build(); ContextInsightSetup.configureContext(ctx); diff --git a/engine/language-server/src/main/java/module-info.java b/engine/language-server/src/main/java/module-info.java index 6af1ceab6c0c..16c51fc6784c 100644 --- a/engine/language-server/src/main/java/module-info.java +++ b/engine/language-server/src/main/java/module-info.java @@ -7,7 +7,7 @@ requires commons.cli; requires flatbuffers.java; requires org.apache.commons.io; - requires org.graalvm.polyglot; + requires org.graalvm.truffle; requires org.eclipse.jgit; requires org.slf4j; @@ -38,7 +38,6 @@ requires org.enso.task.progress.notifications; requires org.enso.ydoc.polyfill; - exports org.enso.languageserver.boot; exports org.enso.languageserver.filemanager to scala.library; exports org.enso.languageserver.runtime to scala.library; exports org.enso.languageserver.search to scala.library; diff --git a/engine/language-server/src/main/java/org/enso/languageserver/boot/resource/RepoInitialization.java b/engine/language-server/src/main/java/org/enso/languageserver/boot/resource/RepoInitialization.java index b69b28a49263..a606b39dcdc6 100644 --- a/engine/language-server/src/main/java/org/enso/languageserver/boot/resource/RepoInitialization.java +++ b/engine/language-server/src/main/java/org/enso/languageserver/boot/resource/RepoInitialization.java @@ -1,15 +1,12 @@ package org.enso.languageserver.boot.resource; import akka.event.EventStream; -import java.io.IOException; -import java.nio.file.FileSystemException; -import java.nio.file.Files; -import java.nio.file.NoSuchFileException; -import java.util.concurrent.*; -import org.apache.commons.io.FileUtils; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionStage; +import java.util.concurrent.Executor; +import java.util.concurrent.Semaphore; import org.enso.languageserver.data.ProjectDirectoriesConfig; import org.enso.languageserver.event.InitializedEvent; -import org.enso.logger.masking.MaskedPath; import org.enso.searcher.memory.InMemorySuggestionsRepo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -72,14 +69,18 @@ public CompletableFuture init() { } private CompletableFuture initSuggestionsRepo() { - return CompletableFuture.runAsync( - () -> logger.debug("Initializing suggestions repo [{}]...", suggestionsRepo), executor) - .thenComposeAsync( - v -> { - if (!isInitialized) - return doInitSuggestionsRepo() - .exceptionallyComposeAsync(this::recoverInitializationError, executor); - else return CompletableFuture.completedFuture(v); + return CompletableFuture.supplyAsync( + () -> { + logger.debug("Initializing Suggestions repo [{}]...", suggestionsRepo); + try { + lock.acquire(); + if (!isInitialized) + return doInitSuggestionsRepo() + .exceptionallyComposeAsync(this::recoverInitializationError, executor); + else return CompletableFuture.completedFuture(null); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } }, executor) .thenRunAsync( @@ -105,60 +106,6 @@ private CompletableFuture recoverInitializationError(Throwable error) { .thenComposeAsync(v -> doInitSuggestionsRepo(), executor); } - private CompletableFuture clearDatabaseFile(int retries) { - return CompletableFuture.runAsync( - () -> { - if (!isInitialized) { - logger.debug("Clear database file. Attempt #{}", retries + 1); - try { - Files.delete(projectDirectoriesConfig.suggestionsDatabaseFile().toPath()); - } catch (IOException e) { - throw new CompletionException(e); - } - } - }, - executor) - .exceptionallyComposeAsync(error -> recoverClearDatabaseFile(error, retries), executor); - } - - private CompletableFuture recoverClearDatabaseFile(Throwable error, int retries) { - if (error instanceof CompletionException) { - return recoverClearDatabaseFile(error.getCause(), retries); - } else if (error instanceof NoSuchFileException) { - logger.warn( - "Failed to delete the database file. Attempt #{}. File does not exist [{}]", - retries + 1, - new MaskedPath(projectDirectoriesConfig.suggestionsDatabaseFile().toPath())); - return CompletableFuture.completedFuture(null); - } else if (error instanceof FileSystemException) { - logger.error( - "Failed to delete the database file. Attempt #{}. The file will be removed during the" - + " shutdown", - retries + 1, - error); - Runtime.getRuntime() - .addShutdownHook( - new Thread( - () -> - FileUtils.deleteQuietly(projectDirectoriesConfig.suggestionsDatabaseFile()))); - return CompletableFuture.failedFuture(error); - } else if (error instanceof IOException) { - logger.error("Failed to delete the database file. Attempt #{}", retries + 1, error); - if (retries < MAX_RETRIES) { - try { - Thread.sleep(RETRY_DELAY_MILLIS); - } catch (InterruptedException e) { - throw new CompletionException(e); - } - return clearDatabaseFile(retries + 1); - } else { - return CompletableFuture.failedFuture(error); - } - } - - return CompletableFuture.completedFuture(null); - } - private CompletionStage doInitSuggestionsRepo() { return FutureConverters.asJava(suggestionsRepo.init()).thenAcceptAsync(res -> {}, executor); } diff --git a/engine/language-server/src/main/scala/org/enso/languageserver/boot/MainModule.scala b/engine/language-server/src/main/scala/org/enso/languageserver/boot/MainModule.scala index 93d369b146c2..e5170444af0c 100644 --- a/engine/language-server/src/main/scala/org/enso/languageserver/boot/MainModule.scala +++ b/engine/language-server/src/main/scala/org/enso/languageserver/boot/MainModule.scala @@ -55,6 +55,7 @@ import org.enso.profiling.events.NoopEventsMonitor import org.enso.searcher.memory.InMemorySuggestionsRepo import org.enso.text.{ContentBasedVersioning, Sha3_224VersionCalculator} import org.enso.version.BuildVersion +import com.oracle.truffle.api.TruffleOptions import org.graalvm.polyglot.io.MessageEndpoint import org.slf4j.event.Level import org.slf4j.LoggerFactory @@ -63,6 +64,7 @@ import java.io.{File, PrintStream} import java.net.URI import java.nio.charset.StandardCharsets import java.time.Clock +import java.util import scala.concurrent.duration.DurationInt /** A main module containing all components of the server. @@ -305,7 +307,6 @@ class MainModule(serverConfig: LanguageServerConfig, logLevel: Level) { val stdIn = new ObservablePipedInputStream(stdInSink) val extraOptions = new java.util.HashMap[String, String]() - extraOptions.put(RuntimeServerInfo.ENABLE_OPTION, "true") extraOptions.put(RuntimeOptions.INTERACTIVE_MODE, "true") extraOptions.put( RuntimeOptions.LOG_MASKING, @@ -317,7 +318,14 @@ class MainModule(serverConfig: LanguageServerConfig, logLevel: Level) { Runtime.getRuntime.availableProcessors().toString ) - val builder = ContextFactory + val extraEngineOptions = new util.HashMap[String, String]() + if (TruffleOptions.AOT) { + extraEngineOptions.put(RuntimeServerInfo.ENABLE_OPTION, "true") + } else { + extraOptions.put(RuntimeServerInfo.ENABLE_OPTION, "true") + } + + private val builder = ContextFactory .create() .projectRoot(serverConfig.contentRootPath) .logLevel(logLevel) @@ -328,6 +336,7 @@ class MainModule(serverConfig: LanguageServerConfig, logLevel: Level) { .err(stdErr) .in(stdIn) .options(extraOptions) + .engineOptions(extraEngineOptions) .messageTransport((uri: URI, peerEndpoint: MessageEndpoint) => { if (uri.toString == RuntimeServerInfo.URI) { val connection = new RuntimeConnector.Endpoint( diff --git a/engine/language-server/src/main/scala/org/enso/languageserver/protocol/json/JsonConnectionController.scala b/engine/language-server/src/main/scala/org/enso/languageserver/protocol/json/JsonConnectionController.scala index 5841cf11dd1c..a2c62d837a2e 100644 --- a/engine/language-server/src/main/scala/org/enso/languageserver/protocol/json/JsonConnectionController.scala +++ b/engine/language-server/src/main/scala/org/enso/languageserver/protocol/json/JsonConnectionController.scala @@ -202,7 +202,14 @@ class JsonConnectionController( ) mainComponent .init() - .thenApply(_ => InitializationComponentInitialized.getInstance) + .whenComplete((_, ex) => + if (mainComponent.isInitialized) { + logger.trace("Resources have been initialized") + self ! InitializationComponentInitialized.getInstance() + } else { + logger.warn("Failed to initialize resources", ex) + } + ) .pipeTo(self) context.become(initializing(webActor, clientId, req, sender())) diff --git a/engine/language-server/src/main/scala/org/enso/languageserver/runtime/RuntimeConnector.scala b/engine/language-server/src/main/scala/org/enso/languageserver/runtime/RuntimeConnector.scala index ca6f8f186e93..0774a8d268fe 100644 --- a/engine/language-server/src/main/scala/org/enso/languageserver/runtime/RuntimeConnector.scala +++ b/engine/language-server/src/main/scala/org/enso/languageserver/runtime/RuntimeConnector.scala @@ -36,7 +36,7 @@ final class RuntimeConnector( override def receive: Receive = { case RuntimeConnector.Initialize(engine) => logger.debug( - s"Runtime connector established connection with the message endpoint" + "Runtime connector established connection with the message endpoint" ) unstashAll() context.become(waitingOnEndpoint(engine)) @@ -49,13 +49,15 @@ final class RuntimeConnector( Runtime.Api.Response(None, Api.InitializedNotification()) ) => logger.debug( - s"Message endpoint [{}] is initialized. Runtime connector can accept messages", + "Message endpoint [{}] is initialized. Runtime connector can accept messages", engine ) unstashAll() context.become(initialized(engine, Map())) - case _ => stash() + case msg => + logger.trace("Runtime received unexpected message: {}", msg) + stash() }) /** Performs communication between runtime and language server. @@ -103,8 +105,8 @@ final class RuntimeConnector( handler ! request case None => logger.warn( - s"No registered handler found for request " + - s"[${payload.getClass.getCanonicalName}]" + "No registered handler found for request [{}]", + payload.getClass.getCanonicalName ) } @@ -120,8 +122,7 @@ final class RuntimeConnector( case None => logger.warn( "No sender has been found associated with request id [{}], the response [{}] will be dropped", - correlationId, - payload.getClass.getCanonicalName + Array[Any](correlationId, payload.getClass.getCanonicalName) ) payload match { case msg: ToLogString => diff --git a/engine/launcher/src/main/scala/org/enso/launcher/components/LauncherRunner.scala b/engine/launcher/src/main/scala/org/enso/launcher/components/LauncherRunner.scala index 0aa5f63ebf30..559080affb60 100644 --- a/engine/launcher/src/main/scala/org/enso/launcher/components/LauncherRunner.scala +++ b/engine/launcher/src/main/scala/org/enso/launcher/components/LauncherRunner.scala @@ -33,7 +33,8 @@ class LauncherRunner( configurationManager, editionManager, environment, - loggerConnection + loggerConnection, + false ) { /** Creates [[RunSettings]] for launching the REPL. diff --git a/engine/runner/src/main/java/org/enso/runner/Main.java b/engine/runner/src/main/java/org/enso/runner/Main.java index 711c4248810d..d7054f698bf2 100644 --- a/engine/runner/src/main/java/org/enso/runner/Main.java +++ b/engine/runner/src/main/java/org/enso/runner/Main.java @@ -78,6 +78,7 @@ public class Main { private static final String PROFILING_PATH = "profiling-path"; private static final String PROFILING_TIME = "profiling-time"; private static final String LANGUAGE_SERVER_OPTION = "server"; + private static final String LANGUAGE_SERVER_NATIVE_OPTION = "native-server"; private static final String IN_PROJECT_OPTION = "in-project"; private static final String VERSION_OPTION = "version"; private static final String JSON_OPTION = "json"; @@ -215,6 +216,11 @@ private static Options buildOptions() { .build(); var lsOption = cliOptionBuilder().longOpt(LANGUAGE_SERVER_OPTION).desc("Runs Language Server").build(); + var lsNativeOption = + cliOptionBuilder() + .longOpt(LANGUAGE_SERVER_NATIVE_OPTION) + .desc("Runs Language Server in native-image mode") + .build(); var lsProfilingPathOption = cliOptionBuilder() .hasArg(true) @@ -483,6 +489,7 @@ private static Options buildOptions() { .addOption(newProjectAuthorNameOpt) .addOption(newProjectAuthorEmailOpt) .addOption(lsOption) + .addOption(lsNativeOption) .addOption(lsProfilingPathOption) .addOption(lsProfilingTimeOption) .addOption(deamonizeOption) @@ -577,14 +584,13 @@ private void createNew( var template = templateOption.map( - (n) -> { - return Template.fromString(n) - .getOrElse( - () -> { - logger.error("Unknown project template name: '" + n + "'."); - throw exitFail(); - }); - }); + (n) -> + Template.fromString(n) + .getOrElse( + () -> { + logger.error("Unknown project template name: '" + n + "'."); + throw exitFail(); + })); PackageManager$.MODULE$ .Default() @@ -699,8 +705,7 @@ private void handleRun( if (projectMode) { var result = PackageManager$.MODULE$.Default().loadPackage(file); if (result.isSuccess()) { - @SuppressWarnings("unchecked") - var pkg = (org.enso.pkg.Package) result.get(); + var pkg = result.get(); mainFile = pkg.mainFile(); if (!mainFile.exists()) { @@ -748,13 +753,11 @@ private void handleRun( if (projectMode) { var result = PackageManager$.MODULE$.Default().loadPackage(file); if (result.isSuccess()) { - var s = (scala.util.Success) result; - @SuppressWarnings("unchecked") - var pkg = (org.enso.pkg.Package) s.get(); + var pkg = result.get(); var mainModuleName = pkg.moduleNameForFile(pkg.mainFile()).toString(); runPackage(context, mainModuleName, file, additionalArgs); } else { - println(((scala.util.Failure) result).exception().getMessage()); + System.err.println(result.failed().get().getMessage()); throw exitFail(); } } else { @@ -1462,6 +1465,14 @@ private void launch(CommandLine line, Level logLevel, boolean logMasking) { throw exitFail(); } } else { + if (line.hasOption(LANGUAGE_SERVER_NATIVE_OPTION)) { + System.out.println( + "\"--" + + LANGUAGE_SERVER_NATIVE_OPTION + + "\" has no effect without --\"" + + LANGUAGE_SERVER_OPTION + + "\""); + } try { var conf = parseProfilingConfig(line); try { diff --git a/engine/runner/src/main/java/org/enso/runner/RunnerLogging.java b/engine/runner/src/main/java/org/enso/runner/RunnerLogging.java index da8f93560e61..0421a0088df2 100644 --- a/engine/runner/src/main/java/org/enso/runner/RunnerLogging.java +++ b/engine/runner/src/main/java/org/enso/runner/RunnerLogging.java @@ -53,6 +53,7 @@ private static void setupImpl( if (success) { logger.trace("Connected to logging service at [{}]", connectionUri); } else { + System.err.println("Failed to connect to logging service."); throw new RuntimeException("Failed to connect to logging service"); } } catch (InterruptedException | ExecutionException e) { @@ -65,7 +66,7 @@ private static void setupImpl( () -> loggerSetup.setup( logLevel, - distributionManager.detectPaths().logs(), + distributionManager.paths().logs(), "enso-cli", loggerSetup.getConfig())); try { diff --git a/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/serialization-config.json b/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/serialization-config.json index f3d7e06e3392..33406459f3aa 100644 --- a/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/serialization-config.json +++ b/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/serialization-config.json @@ -1,5 +1,56 @@ { "types":[ + { + "name":"ch.qos.logback.classic.spi.IThrowableProxy[]" + }, + { + "name":"ch.qos.logback.classic.spi.LoggerContextVO" + }, + { + "name":"ch.qos.logback.classic.spi.LoggingEventVO" + }, + { + "name":"ch.qos.logback.classic.spi.StackTraceElementProxy" + }, + { + "name":"ch.qos.logback.classic.spi.StackTraceElementProxy[]" + }, + { + "name":"ch.qos.logback.classic.spi.ThrowableProxyVO" + }, + { + "name":"org.slf4j.helpers.BasicMarker" + }, + { + "name":"java.lang.StackTraceElement" + }, + { + "name":"java.lang.String" + }, + { + "name":"java.util.Collections$EmptyMap" + }, + { + "name":"java.util.HashMap" + }, + { + "name":"java.lang.Throwable" + }, + { + "name":"java.lang.Object" + }, + { + "name":"java.lang.Exception" + }, + { + "name":"java.io.IOException" + }, + { + "name":"java.util.ArrayList" + }, + { + "name":"java.util.concurrent.CopyOnWriteArrayList" + } ], "lambdaCapturingTypes":[ ], diff --git a/engine/runtime-instrument-runtime-server/src/main/java/org/enso/interpreter/instrument/runtime/server/RuntimeServerInstrument.java b/engine/runtime-instrument-runtime-server/src/main/java/org/enso/interpreter/instrument/runtime/server/RuntimeServerInstrument.java index ccb742c4ca50..09488901fc42 100644 --- a/engine/runtime-instrument-runtime-server/src/main/java/org/enso/interpreter/instrument/runtime/server/RuntimeServerInstrument.java +++ b/engine/runtime-instrument-runtime-server/src/main/java/org/enso/interpreter/instrument/runtime/server/RuntimeServerInstrument.java @@ -108,7 +108,7 @@ public void onContextClosed(TruffleContext context) {} @Override protected void onCreate(Env env) { this.env = env; - env.registerService(this); + if (TruffleOptions.AOT) { this.handler = HandlerFactoryImpl.create(); } else { @@ -120,12 +120,13 @@ protected void onCreate(Env env) { MessageEndpoint client = env.startServer(URI.create(RuntimeServerInfo.URI), this.handler.endpoint()); if (client != null) { + env.registerService(this); this.handler.endpoint().setClient(client); } else { env.getLogger(RuntimeServerInstrument.class) - .warning( - "The client endpoint has not been initialized. The Runtime " - + "Server Instrument may very likely not function properly."); + .severe( + "The client endpoint has not been initialized. The Runtime will not function" + + " properly."); } } catch (MessageTransport.VetoException | IOException e) { throw new RuntimeException(e); diff --git a/engine/runtime/src/main/java/org/enso/interpreter/EnsoLanguage.java b/engine/runtime/src/main/java/org/enso/interpreter/EnsoLanguage.java index 4d52bc042670..9832d7fcdae6 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/EnsoLanguage.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/EnsoLanguage.java @@ -20,6 +20,7 @@ import java.time.ZoneId; import java.util.List; import java.util.Objects; +import java.util.logging.Level; import org.enso.common.LanguageInfo; import org.enso.common.RuntimeOptions; import org.enso.compiler.Compiler; @@ -72,8 +73,6 @@ import org.graalvm.options.OptionDescriptors; import org.graalvm.options.OptionKey; import org.graalvm.options.OptionType; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * The root of the Enso implementation. @@ -114,8 +113,6 @@ public final class EnsoLanguage extends TruffleLanguage { private final ContextThreadLocal executionEnvironment = locals.createContextThreadLocal((ctx, thread) -> new ExecutionEnvironment[1]); - private static final Logger logger = LoggerFactory.getLogger(EnsoLanguage.class); - public static EnsoLanguage get(Node node) { return REFERENCE.get(node); } @@ -467,7 +464,7 @@ public Object getLanguageView(EnsoContext context, Object value) { } } } catch (UnsupportedMessageException | InvalidArrayIndexException e) { - logger.warn("Unexpected exception", e); + context.getLogger().log(Level.WARNING, "Unexpected exception", e); } return null; } diff --git a/engine/runtime/src/main/scala/org/enso/interpreter/runtime/IrToTruffle.scala b/engine/runtime/src/main/scala/org/enso/interpreter/runtime/IrToTruffle.scala index d071f6e07c94..7b498bf2542e 100644 --- a/engine/runtime/src/main/scala/org/enso/interpreter/runtime/IrToTruffle.scala +++ b/engine/runtime/src/main/scala/org/enso/interpreter/runtime/IrToTruffle.scala @@ -2672,7 +2672,11 @@ class IrToTruffle( val log = context.getLogger() if (log.isLoggable(Level.FINEST)) { val allDefs = scope.graph.rootScope.allDefinitions - log.log(Level.FINEST, s"Scope for ${where} loaded with {0}", allDefs) + log.log( + Level.FINEST, + s"Root scope for ${where} loaded with {0}", + allDefs + ) } scope } @@ -2691,7 +2695,11 @@ class IrToTruffle( val log = context.getLogger() if (log.isLoggable(Level.FINEST)) { val allDefs = scope.graph.rootScope.allDefinitions - log.log(Level.FINEST, s"Scope for ${where} loaded with {0}", allDefs) + log.log( + Level.FINEST, + s"Child scope for ${where} loaded with {0}", + allDefs + ) } scope } diff --git a/lib/scala/logging-service-logback/src/main/java/org/enso/logging/service/logback/EnsoSocketAppender.java b/lib/scala/logging-service-logback/src/main/java/org/enso/logging/service/logback/EnsoSocketAppender.java new file mode 100644 index 000000000000..f3263e2dfdb3 --- /dev/null +++ b/lib/scala/logging-service-logback/src/main/java/org/enso/logging/service/logback/EnsoSocketAppender.java @@ -0,0 +1,387 @@ +package org.enso.logging.service.logback; + +import ch.qos.logback.classic.net.LoggingEventPreSerializationTransformer; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.AppenderBase; +import ch.qos.logback.core.net.*; +import ch.qos.logback.core.spi.PreSerializationTransformer; +import ch.qos.logback.core.status.Status; +import ch.qos.logback.core.util.CloseUtil; +import ch.qos.logback.core.util.Duration; +import java.io.IOException; +import java.io.Serializable; +import java.net.ConnectException; +import java.net.InetAddress; +import java.net.Socket; +import java.net.UnknownHostException; +import java.util.concurrent.BlockingDeque; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import javax.net.SocketFactory; + +/** + * A direct copy of ch.qos.logback.core.net.SocketAppender and + * ch.qos.logback.core.net.AbstractSocketAppender. + */ +public class EnsoSocketAppender extends AppenderBase + implements SocketConnector.ExceptionHandler { + private static final PreSerializationTransformer pst = + new LoggingEventPreSerializationTransformer(); + + private boolean includeCallerData = false; + + /** The default port number of remote logging server (4560). */ + public static final int DEFAULT_PORT = 4560; + + /** The default reconnection delay (30000 milliseconds or 30 seconds). */ + public static final int DEFAULT_RECONNECTION_DELAY = 30000; + + /** + * Default size of the deque used to hold logging events that are destined for the remote peer. + */ + public static final int DEFAULT_QUEUE_SIZE = 128; + + /** Default timeout when waiting for the remote server to accept our connection. */ + private static final int DEFAULT_ACCEPT_CONNECTION_DELAY = 5000; + + /** Default timeout for how long to wait when inserting an event into the BlockingQueue. */ + private static final int DEFAULT_EVENT_DELAY_TIMEOUT = 100; + + private final ObjectWriterFactory objectWriterFactory; + private final QueueFactory queueFactory; + + private String remoteHost; + private int port = DEFAULT_PORT; + private InetAddress address; + private Duration reconnectionDelay = new Duration(DEFAULT_RECONNECTION_DELAY); + private int queueSize = DEFAULT_QUEUE_SIZE; + private int acceptConnectionTimeout = DEFAULT_ACCEPT_CONNECTION_DELAY; + private Duration eventDelayLimit = new Duration(DEFAULT_EVENT_DELAY_TIMEOUT); + + private BlockingDeque deque; + private String peerId; + private SocketConnector connector; + private Future task; + + private volatile Socket socket; + + /** Constructs a new appender. */ + public EnsoSocketAppender() { + this(new QueueFactory(), new ObjectWriterFactory()); + } + + /** + * Constructs a new appender using the given {@link QueueFactory} and {@link ObjectWriterFactory}. + */ + EnsoSocketAppender(QueueFactory queueFactory, ObjectWriterFactory objectWriterFactory) { + this.objectWriterFactory = objectWriterFactory; + this.queueFactory = queueFactory; + } + + protected void postProcessEvent(ILoggingEvent event) { + if (includeCallerData) { + event.getCallerData(); + } + } + + public void setIncludeCallerData(boolean includeCallerData) { + this.includeCallerData = includeCallerData; + } + + public PreSerializationTransformer getPST() { + return pst; + } + + /** {@inheritDoc} */ + public void start() { + if (isStarted()) return; + int errorCount = 0; + if (port <= 0) { + errorCount++; + addError( + "No port was configured for appender" + + name + + " For more information, please visit" + + " http://logback.qos.ch/codes.html#socket_no_port"); + } + + if (remoteHost == null) { + errorCount++; + addError( + "No remote host was configured for appender" + + name + + " For more information, please visit" + + " http://logback.qos.ch/codes.html#socket_no_host"); + } + + if (queueSize == 0) { + addWarn( + "Queue size of zero is deprecated, use a size of one to indicate synchronous processing"); + } + + if (queueSize < 0) { + errorCount++; + addError("Queue size must be greater than zero"); + } + + if (errorCount == 0) { + try { + address = InetAddress.getByName(remoteHost); + } catch (UnknownHostException ex) { + addError("unknown host: " + remoteHost); + errorCount++; + } + } + + if (errorCount == 0) { + deque = queueFactory.newLinkedBlockingDeque(queueSize); + peerId = "remote peer " + remoteHost + ":" + port + ": "; + connector = createConnector(address, port, 0, reconnectionDelay.getMilliseconds()); + task = + getContext() + .getExecutorService() + .submit( + new Runnable() { + @Override + public void run() { + connectSocketAndDispatchEvents(); + } + }); + super.start(); + } + } + + /** {@inheritDoc} */ + @Override + public void stop() { + if (!isStarted()) return; + CloseUtil.closeQuietly(socket); + task.cancel(true); + super.stop(); + } + + /** {@inheritDoc} */ + @Override + protected void append(ILoggingEvent event) { + if (event == null || !isStarted()) return; + + try { + final boolean inserted = + deque.offer(event, eventDelayLimit.getMilliseconds(), TimeUnit.MILLISECONDS); + if (!inserted) { + addInfo("Dropping event due to timeout limit of [" + eventDelayLimit + "] being exceeded"); + } + } catch (InterruptedException e) { + addError("Interrupted while appending event to SocketAppender", e); + } + } + + private void connectSocketAndDispatchEvents() { + try { + while (socketConnectionCouldBeEstablished()) { + try { + ObjectWriter objectWriter = createObjectWriterForSocket(); + addInfo(peerId + "connection established"); + dispatchEvents(objectWriter); + } catch (javax.net.ssl.SSLHandshakeException she) { + // FIXME + Thread.sleep(DEFAULT_RECONNECTION_DELAY); + } catch (IOException ex) { + addInfo(peerId + "connection failed: ", ex); + } catch (Throwable e) { + e.printStackTrace(); + throw e; + } finally { + if (socket != null) { + try { + socket.close(); + } catch (IOException ex) { + ex.printStackTrace(); + assert true; // avoid an empty catch + } + socket = null; + } + addInfo(peerId + "connection closed"); + } + } + } catch (InterruptedException ex) { + assert true; // ok... we'll exit now + } + addInfo("shutting down"); + } + + @Override + public void addStatus(Status status) { + System.out.println("STATUS: " + status.getTimestamp() + " @ " + status.getMessage()); + super.addStatus(status); + } + + private boolean socketConnectionCouldBeEstablished() throws InterruptedException { + return (socket = connector.call()) != null; + } + + private ObjectWriter createObjectWriterForSocket() throws IOException { + socket.setSoTimeout(acceptConnectionTimeout); + ObjectWriter objectWriter = + objectWriterFactory.newAutoFlushingObjectWriter(socket.getOutputStream()); + socket.setSoTimeout(0); + return objectWriter; + } + + private SocketConnector createConnector( + InetAddress address, int port, int initialDelay, long retryDelay) { + SocketConnector connector = newConnector(address, port, initialDelay, retryDelay); + connector.setExceptionHandler(this); + connector.setSocketFactory(getSocketFactory()); + return connector; + } + + private void dispatchEvents(ObjectWriter objectWriter) throws InterruptedException, IOException { + while (true) { + ILoggingEvent event = deque.takeFirst(); + postProcessEvent(event); + Serializable serializableEvent = getPST().transform(event); + try { + objectWriter.write(serializableEvent); + } catch (IOException e) { + System.out.println("Whoot? " + e.getMessage()); + e.printStackTrace(); + tryReAddingEventToFrontOfQueue(event); + throw e; + } + } + } + + private void tryReAddingEventToFrontOfQueue(ILoggingEvent event) { + final boolean wasInserted = deque.offerFirst(event); + if (!wasInserted) { + addInfo("Dropping event due to socket connection error and maxed out deque capacity"); + } + } + + /** {@inheritDoc} */ + public void connectionFailed(SocketConnector connector, Exception ex) { + if (ex instanceof InterruptedException) { + addInfo("connector interrupted"); + } else if (ex instanceof ConnectException) { + addInfo(peerId + "connection refused"); + } else { + addInfo(peerId + ex); + } + } + + /** + * Creates a new {@link SocketConnector}. + * + *

The default implementation creates an instance of {@link DefaultSocketConnector}. A subclass + * may override to provide a different {@link SocketConnector} implementation. + * + * @param address target remote address + * @param port target remote port + * @param initialDelay delay before the first connection attempt + * @param retryDelay delay before a reconnection attempt + * @return socket connector + */ + protected SocketConnector newConnector( + InetAddress address, int port, long initialDelay, long retryDelay) { + return new DefaultSocketConnector(address, port, initialDelay, retryDelay); + } + + /** + * Gets the default {@link SocketFactory} for the platform. + * + *

Subclasses may override to provide a custom socket factory. + */ + protected SocketFactory getSocketFactory() { + return SocketFactory.getDefault(); + } + + /** + * The RemoteHost property takes the name of the host where a corresponding server is + * running. + */ + public void setRemoteHost(String host) { + remoteHost = host; + } + + /** Returns value of the RemoteHost property. */ + public String getRemoteHost() { + return remoteHost; + } + + /** + * The Port property takes a positive integer representing the port where the server is + * waiting for connections. + */ + public void setPort(int port) { + this.port = port; + } + + /** Returns value of the Port property. */ + public int getPort() { + return port; + } + + /** + * The reconnectionDelay property takes a positive {@link Duration} value representing the + * time to wait between each failed connection attempt to the server. The default value of this + * option is to 30 seconds. + * + *

Setting this option to zero turns off reconnection capability. + */ + public void setReconnectionDelay(Duration delay) { + this.reconnectionDelay = delay; + } + + /** Returns value of the reconnectionDelay property. */ + public Duration getReconnectionDelay() { + return reconnectionDelay; + } + + /** + * The queueSize property takes a non-negative integer representing the number of logging + * events to retain for delivery to the remote receiver. When the deque size is zero, event + * delivery to the remote receiver is synchronous. When the deque size is greater than zero, the + * {@link #append(Object)} method returns immediately after enqueing the event, assuming that + * there is space available in the deque. Using a non-zero deque length can improve performance by + * eliminating delays caused by transient network delays. + * + * @param queueSize the deque size to set. + */ + public void setQueueSize(int queueSize) { + this.queueSize = queueSize; + } + + /** Returns the value of the queueSize property. */ + public int getQueueSize() { + return queueSize; + } + + /** + * The eventDelayLimit takes a non-negative integer representing the number of milliseconds + * to allow the appender to block if the underlying BlockingQueue is full. Once this limit is + * reached, the event is dropped. + * + * @param eventDelayLimit the event delay limit + */ + public void setEventDelayLimit(Duration eventDelayLimit) { + this.eventDelayLimit = eventDelayLimit; + } + + /** Returns the value of the eventDelayLimit property. */ + public Duration getEventDelayLimit() { + return eventDelayLimit; + } + + /** + * Sets the timeout that controls how long we'll wait for the remote peer to accept our connection + * attempt. + * + *

This property is configurable primarily to support instrumentation for unit testing. + * + * @param acceptConnectionTimeout timeout value in milliseconds + */ + void setAcceptConnectionTimeout(int acceptConnectionTimeout) { + this.acceptConnectionTimeout = acceptConnectionTimeout; + } +} diff --git a/lib/scala/logging-service-logback/src/main/java/org/enso/logging/service/logback/LogbackSetup.java b/lib/scala/logging-service-logback/src/main/java/org/enso/logging/service/logback/LogbackSetup.java index 7fe48e544b64..b19a0b8ae87a 100644 --- a/lib/scala/logging-service-logback/src/main/java/org/enso/logging/service/logback/LogbackSetup.java +++ b/lib/scala/logging-service-logback/src/main/java/org/enso/logging/service/logback/LogbackSetup.java @@ -4,7 +4,6 @@ import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.encoder.PatternLayoutEncoder; import ch.qos.logback.classic.filter.ThresholdFilter; -import ch.qos.logback.classic.net.SocketAppender; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.ConsoleAppender; import ch.qos.logback.core.FileAppender; @@ -133,7 +132,7 @@ public boolean setupSocketAppender(Level logLevel, String hostname, int port) { org.enso.logging.config.SocketAppender appenderConfig = config.getSocketAppender(); - SocketAppender socketAppender = new SocketAppender(); + EnsoSocketAppender socketAppender = new EnsoSocketAppender(); socketAppender.setName("enso-socket"); socketAppender.setIncludeCallerData(false); socketAppender.setRemoteHost(hostname); diff --git a/lib/scala/logging-service-logback/src/main/java/org/enso/logging/service/logback/LoggingServer.java b/lib/scala/logging-service-logback/src/main/java/org/enso/logging/service/logback/LoggingServer.java index 8427ed37181f..1f7f1c4e878d 100644 --- a/lib/scala/logging-service-logback/src/main/java/org/enso/logging/service/logback/LoggingServer.java +++ b/lib/scala/logging-service-logback/src/main/java/org/enso/logging/service/logback/LoggingServer.java @@ -1,7 +1,6 @@ package org.enso.logging.service.logback; import ch.qos.logback.classic.LoggerContext; -import ch.qos.logback.classic.net.SimpleSocketServer; import java.net.URI; import java.net.URISyntaxException; import java.nio.file.Path; @@ -12,7 +11,7 @@ class LoggingServer extends LoggingService { private int port; - private SimpleSocketServer logServer; + private SocketServer logServer; public LoggingServer(int port) { this.port = port; @@ -24,7 +23,7 @@ public URI start(Level level, Path path, String prefix, BaseConfig config) { try { var setup = LogbackSetup.forContext(lc, config); - logServer = new SimpleSocketServer(lc, port); + logServer = new SocketServer(lc, port); logServer.start(); setup.setup(level, path, prefix, setup.getConfig()); return new URI(null, null, "localhost", port, null, null, null); diff --git a/lib/scala/logging-service-logback/src/main/java/org/enso/logging/service/logback/SocketLoggingNode.java b/lib/scala/logging-service-logback/src/main/java/org/enso/logging/service/logback/SocketLoggingNode.java new file mode 100644 index 000000000000..d865c3544cf1 --- /dev/null +++ b/lib/scala/logging-service-logback/src/main/java/org/enso/logging/service/logback/SocketLoggingNode.java @@ -0,0 +1,109 @@ +package org.enso.logging.service.logback; + +import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.net.server.HardenedLoggingEventInputStream; +import ch.qos.logback.classic.spi.ILoggingEvent; +import java.io.BufferedInputStream; +import java.io.IOException; +import java.net.Socket; +import java.net.SocketAddress; + +// Contributors: Moses Hohman + +/** + * A direct copy of ch.qos.logback.classic.net.SocketNode. Read {@link ILoggingEvent} objects sent + * from a remote client using Sockets (TCP). These logging events are logged according to local + * policy, as if they were generated locally. + * + *

For example, the socket node might decide to log events to a local file and also resent them + * to a second socket node. + * + * @author Ceki Gülcü + * @author Sébastien Pennec + * @since 0.8.4 + */ +public class SocketLoggingNode implements Runnable { + + Socket socket; + LoggerContext context; + HardenedLoggingEventInputStream hardenedLoggingEventInputStream; + SocketAddress remoteSocketAddress; + + Logger logger; + boolean closed = false; + SocketServer socketServer; + + public SocketLoggingNode(SocketServer socketServer, Socket socket, LoggerContext context) { + this.socketServer = socketServer; + this.socket = socket; + remoteSocketAddress = socket.getRemoteSocketAddress(); + this.context = context; + logger = context.getLogger(SocketLoggingNode.class); + } + + public void run() { + + try { + hardenedLoggingEventInputStream = + new HardenedLoggingEventInputStream(new BufferedInputStream(socket.getInputStream())); + } catch (Exception e) { + logger.error("Could not open ObjectInputStream to " + socket, e); + closed = true; + } + + ILoggingEvent event; + Logger remoteLogger; + + try { + while (!closed) { + // read an event from the wire + // System.out.println("Reading event?"); + event = (ILoggingEvent) hardenedLoggingEventInputStream.readObject(); + // System.out.println("WHAT EVENT? " + event.getMessage()); + // get a logger from the hierarchy. The name of the logger is taken to + // be the name contained in the event. + remoteLogger = context.getLogger(event.getLoggerName()); + // apply the logger-level filter + if (remoteLogger.isEnabledFor(event.getLevel())) { + // finally log the event as if was generated locally + remoteLogger.callAppenders(event); + } + } + } catch (java.io.EOFException e) { + e.printStackTrace(); + logger.debug("Caught java.io.EOFException closing connection.", e); + } catch (java.net.SocketException e) { + logger.warn("Caught java.net.SocketException closing connection."); + } catch (IOException e) { + logger.debug("Caught java.io.IOException: " + e); + logger.debug("Closing connection."); + } catch (Exception e) { + logger.error("Unexpected exception. Closing connection.", e); + } + + socketServer.socketNodeClosing(this); + close(); + } + + void close() { + if (closed) { + return; + } + closed = true; + if (hardenedLoggingEventInputStream != null) { + try { + hardenedLoggingEventInputStream.close(); + } catch (IOException e) { + logger.warn("Could not close connection.", e); + } finally { + hardenedLoggingEventInputStream = null; + } + } + } + + @Override + public String toString() { + return this.getClass().getName() + remoteSocketAddress.toString(); + } +} diff --git a/lib/scala/logging-service-logback/src/main/java/org/enso/logging/service/logback/SocketServer.java b/lib/scala/logging-service-logback/src/main/java/org/enso/logging/service/logback/SocketServer.java new file mode 100644 index 000000000000..bc496fc63c21 --- /dev/null +++ b/lib/scala/logging-service-logback/src/main/java/org/enso/logging/service/logback/SocketServer.java @@ -0,0 +1,164 @@ +package org.enso.logging.service.logback; + +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.joran.JoranConfigurator; +import ch.qos.logback.core.joran.spi.JoranException; +import java.io.IOException; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import javax.net.ServerSocketFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A direct copy of ch.qos.logback.classic.net.SimpleSocketServer. A simple {@link + * SocketLoggingNode} based server. + * + * @author Ceki Gülcü + * @author Sébastien Pennec + * @since 0.8.4 + */ +public class SocketServer extends Thread { + + Logger logger = LoggerFactory.getLogger(SocketServer.class); + + private final int port; + private final LoggerContext lc; + private boolean closed = false; + private ServerSocket serverSocket; + private List socketNodeList = new ArrayList<>(); + + // used for testing purposes + private CountDownLatch latch; + + public SocketServer(LoggerContext lc, int port) { + this.lc = lc; + this.port = port; + } + + public void run() { + + final String oldThreadName = Thread.currentThread().getName(); + + try { + + final String newThreadName = getServerThreadName(); + Thread.currentThread().setName(newThreadName); + + logger.debug("Listening on port " + port); + serverSocket = getServerSocketFactory().createServerSocket(port); + while (!closed) { + logger.debug("Waiting to accept a new client."); + signalAlmostReadiness(); + Socket socket = serverSocket.accept(); + logger.debug("Connected to client at " + socket.getInetAddress()); + logger.debug("Starting new socket node."); + SocketLoggingNode newSocketNode = new SocketLoggingNode(this, socket, lc); + synchronized (socketNodeList) { + socketNodeList.add(newSocketNode); + } + final String clientThreadName = getClientThreadName(socket); + new Thread(newSocketNode, clientThreadName).start(); + } + } catch (Exception e) { + if (closed) { + logger.warn("Exception in run method for a closed server", e); + } else { + logger.error("Unexpected failure in run method", e); + } + } finally { + Thread.currentThread().setName(oldThreadName); + } + } + + /** Returns the name given to the server thread. */ + protected String getServerThreadName() { + return String.format("Logback %s (port %d)", getClass().getSimpleName(), port); + } + + /** Returns a name to identify each client thread. */ + protected String getClientThreadName(Socket socket) { + return String.format("Logback SocketNode (client: %s)", socket.getRemoteSocketAddress()); + } + + /** + * Gets the platform default {@link ServerSocketFactory}. + * + *

Subclasses may override to provide a custom server socket factory. + */ + protected ServerSocketFactory getServerSocketFactory() { + return ServerSocketFactory.getDefault(); + } + + /** + * Signal another thread that we have established a connection This is useful for testing + * purposes. + */ + void signalAlmostReadiness() { + if (latch != null && latch.getCount() != 0) { + latch.countDown(); + } + } + + /** + * Used for testing purposes + * + * @param latch + */ + void setLatch(CountDownLatch latch) { + this.latch = latch; + } + + /** Used for testing purposes */ + public CountDownLatch getLatch() { + return latch; + } + + public boolean isClosed() { + return closed; + } + + public void close() { + closed = true; + if (serverSocket != null) { + try { + serverSocket.close(); + } catch (IOException e) { + logger.error("Failed to close serverSocket", e); + } finally { + serverSocket = null; + } + } + + logger.info("closing this server"); + synchronized (socketNodeList) { + for (SocketLoggingNode sn : socketNodeList) { + sn.close(); + } + } + if (socketNodeList.size() != 0) { + logger.warn("Was expecting a 0-sized socketNodeList after server shutdown"); + } + } + + public void socketNodeClosing(SocketLoggingNode sn) { + logger.debug("Removing {}", sn); + + // don't allow simultaneous access to the socketNodeList + // (e.g. removal whole iterating on the list causes + // java.util.ConcurrentModificationException) + synchronized (socketNodeList) { + socketNodeList.remove(sn); + } + } + + public static void configureLC(LoggerContext lc, String configFile) throws JoranException { + JoranConfigurator configurator = new JoranConfigurator(); + lc.reset(); + configurator.setContext(lc); + configurator.doConfigure(configFile); + } +} diff --git a/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/boot/Cli.scala b/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/boot/Cli.scala index 9072aec6778b..5a82d1df21c7 100644 --- a/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/boot/Cli.scala +++ b/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/boot/Cli.scala @@ -12,6 +12,7 @@ object Cli { val NO_LOG_MASKING = "no-log-masking" val VERBOSE_OPTION = "verbose" val VERSION_OPTION = "version" + val NATIVE_OPTION = "native-language-server" val PROFILING_PATH = "profiling-path" val PROFILING_TIME = "profiling-time" val PROJECTS_DIRECTORY = "projects-directory" @@ -45,6 +46,13 @@ object Cli { .desc("Checks the version of the Enso executable.") .build() + val native: cli.Option = cli.Option.builder + .longOpt(NATIVE_OPTION) + .desc( + "(experimental) Attempts to use the native-image of any subprocess." + ) + .build() + val json: cli.Option = cli.Option.builder .longOpt(JSON_OPTION) .desc("Switches the --version option to JSON output.") @@ -164,6 +172,7 @@ object Cli { .addOption(option.version) .addOption(option.json) .addOption(option.noLogMasking) + .addOption(option.native) .addOption(option.profilingPath) .addOption(option.profilingTime) .addOption(option.projectsDirectory) diff --git a/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/boot/ProjectManager.scala b/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/boot/ProjectManager.scala index 576ac84889c9..aec607fd234a 100644 --- a/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/boot/ProjectManager.scala +++ b/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/boot/ProjectManager.scala @@ -293,6 +293,7 @@ object ProjectManager extends ZIOAppDefault with LazyLogging { logLevel <- setupLogging(verbosity, logMasking) procConf = MainProcessConfig( logLevel, + options.hasOption(Cli.NATIVE_OPTION), opts.profilingPath, opts.profilingTime ) diff --git a/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/boot/configuration.scala b/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/boot/configuration.scala index 9ccaf55cd667..5c1a0043e5ad 100644 --- a/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/boot/configuration.scala +++ b/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/boot/configuration.scala @@ -19,6 +19,7 @@ object configuration { */ case class MainProcessConfig( logLevel: Level, + nativeImage: Boolean, profilingPath: Option[Path], profilingTime: Option[FiniteDuration] ) diff --git a/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/infrastructure/languageserver/ExecutorWithUnlimitedPool.scala b/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/infrastructure/languageserver/ExecutorWithUnlimitedPool.scala index d77361ae0615..43cd9e704f9d 100644 --- a/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/infrastructure/languageserver/ExecutorWithUnlimitedPool.scala +++ b/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/infrastructure/languageserver/ExecutorWithUnlimitedPool.scala @@ -100,7 +100,8 @@ object ExecutorWithUnlimitedPool extends LanguageServerExecutor { globalConfigurationManager = configurationManager, editionManager = distributionConfiguration.editionManager, environment = distributionConfiguration.environment, - loggerConnection = descriptor.deferredLoggingServiceEndpoint + loggerConnection = descriptor.deferredLoggingServiceEndpoint, + nativeImage = descriptor.nativeImage ) val profilingPathArguments = descriptor.profilingPath.toSeq diff --git a/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/infrastructure/languageserver/LanguageServerController.scala b/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/infrastructure/languageserver/LanguageServerController.scala index 83a9f55bc045..64d6c214ee06 100644 --- a/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/infrastructure/languageserver/LanguageServerController.scala +++ b/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/infrastructure/languageserver/LanguageServerController.scala @@ -89,7 +89,8 @@ class LanguageServerController( profilingPath = processConfig.profilingPath, profilingTime = processConfig.profilingTime, deferredLoggingServiceEndpoint = loggingServiceDescriptor.getEndpoint, - skipGraalVMUpdater = bootloaderConfig.skipGraalVMUpdater + skipGraalVMUpdater = bootloaderConfig.skipGraalVMUpdater, + nativeImage = processConfig.nativeImage ) override def supervisorStrategy: SupervisorStrategy = diff --git a/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/infrastructure/languageserver/LanguageServerDescriptor.scala b/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/infrastructure/languageserver/LanguageServerDescriptor.scala index 53691948b1c2..ff1a2556457c 100644 --- a/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/infrastructure/languageserver/LanguageServerDescriptor.scala +++ b/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/infrastructure/languageserver/LanguageServerDescriptor.scala @@ -43,6 +43,7 @@ case class LanguageServerDescriptor( engineVersion: SemVer, jvmSettings: JVMSettings, discardOutput: Boolean, + nativeImage: Boolean, profilingPath: Option[Path], profilingTime: Option[FiniteDuration], deferredLoggingServiceEndpoint: Future[Option[URI]], diff --git a/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/service/ProjectCreationService.scala b/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/service/ProjectCreationService.scala index 68678163b69c..76aad6be3bca 100644 --- a/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/service/ProjectCreationService.scala +++ b/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/service/ProjectCreationService.scala @@ -52,7 +52,8 @@ class ProjectCreationService[ globalConfigurationManager = configurationManager, editionManager = distributionConfiguration.editionManager, environment = distributionConfiguration.environment, - loggerConnection = loggingServiceDescriptor.getEndpoint + loggerConnection = loggingServiceDescriptor.getEndpoint, + nativeImage = false ) val settings = diff --git a/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/JVMSettings.scala b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/JVMSettings.scala index 02b77e1dcc1d..11da450d831a 100644 --- a/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/JVMSettings.scala +++ b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/JVMSettings.scala @@ -12,7 +12,8 @@ package org.enso.runtimeversionmanager.runner case class JVMSettings( javaCommandOverride: Option[JavaCommand], jvmOptions: Seq[(String, String)], - extraOptions: Seq[(String, String)] + extraOptions: Seq[(String, String)], + nativeImage: Boolean ) object JVMSettings { @@ -27,12 +28,14 @@ object JVMSettings { def apply( useSystemJVM: Boolean, jvmOptions: Seq[(String, String)], - extraOptions: Seq[(String, String)] + extraOptions: Seq[(String, String)], + nativeImage: Boolean = false ): JVMSettings = new JVMSettings( if (useSystemJVM) Some(JavaCommand.systemJavaCommand) else None, jvmOptions, - extraOptions + extraOptions, + nativeImage ) // See propositions in #9475 for alternatives diff --git a/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/JavaCommand.scala b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/JavaCommand.scala index db527866bc2d..1b1920cd8cf2 100644 --- a/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/JavaCommand.scala +++ b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/JavaCommand.scala @@ -8,24 +8,25 @@ import org.enso.runtimeversionmanager.components.GraalRuntime * @param javaHomeOverride if set, asks to override the JAVA_HOME environment * variable when launching the JVM */ -case class JavaCommand( - executableName: String, - javaHomeOverride: Option[String] +class JavaCommand( + val executableName: String, + val javaHomeOverride: Option[String] ) object JavaCommand { /** The [[JavaCommand]] representing the system-configured JVM. */ - def systemJavaCommand: JavaCommand = JavaCommand("java", None) + def systemJavaCommand: JavaCommand = new JavaCommand("java", None) /** The [[JavaCommand]] representing a managed [[GraalRuntime]]. */ def forRuntime(runtime: GraalRuntime): JavaCommand = - JavaCommand( + new JavaCommand( executableName = runtime.javaExecutable.toAbsolutePath.normalize.toString, - javaHomeOverride = - Some(runtime.javaHome.toAbsolutePath.normalize.toString) + javaHomeOverride = Some( + runtime.javaHome.toAbsolutePath.normalize.toString + ) ) } diff --git a/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/NativeJavaCommand.scala b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/NativeJavaCommand.scala new file mode 100644 index 000000000000..51b4dd4ac5fa --- /dev/null +++ b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/NativeJavaCommand.scala @@ -0,0 +1,20 @@ +package org.enso.runtimeversionmanager.runner + +import org.enso.cli.OS +import org.enso.distribution.{DistributionManager, Environment} + +import java.nio.file.Path + +case class NativeJavaCommand(executablePath: Path) + extends JavaCommand(executablePath.toString, None) + +object NativeJavaCommand { + def apply(version: String): NativeJavaCommand = { + val env = new Environment() {} + val dm = new DistributionManager(env) + val execName = OS.executableName("enso") + val fullExecPath = + dm.paths.engines.resolve(version).resolve("bin").resolve(execName) + new NativeJavaCommand(fullExecPath) + } +} diff --git a/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/Runner.scala b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/Runner.scala index 4b81789dd036..8d019b3d3fc9 100644 --- a/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/Runner.scala +++ b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/Runner.scala @@ -32,7 +32,8 @@ class Runner( globalConfigurationManager: GlobalRunnerConfigurationManager, editionManager: EditionManager, environment: Environment, - loggerConnection: Future[Option[URI]] + loggerConnection: Future[Option[URI]], + nativeImage: Boolean ) { /** The current working directory that is a starting point when checking if @@ -188,23 +189,33 @@ class Runner( val context = JVMOptionsContext(enginePackagePath = engine.path) val manifestOptions = - engine.defaultJVMOptions.filter(_.isRelevant).map(_.substitute(context)) + if (nativeImage) Seq() + else + engine.defaultJVMOptions + .filter(_.isRelevant) + .map(_.substitute(context)) val environmentOptions = jvmOptsFromEnvironment.map(_.split(' ').toIndexedSeq).getOrElse(Seq()) val commandLineOptions = jvmSettings.jvmOptions.map( translateJVMOption(_, standardOption = true) - ) ++ - jvmSettings.extraOptions.map( - translateJVMOption(_, standardOption = false) - ) + ) ++ (if (nativeImage) Seq() + else + jvmSettings.extraOptions.map( + translateJVMOption(_, standardOption = false) + )) val componentPath = engine.componentDirPath.toAbsolutePath.normalize + val modulePathOptions = + if (nativeImage) Seq() + else + Seq( + "--module-path", + componentPath.toString, + "-m", + "org.enso.runner/org.enso.runner.Main" + ) val jvmArguments = - manifestOptions ++ environmentOptions ++ commandLineOptions ++ Seq( - "--module-path", - componentPath.toString, - "-m", - "org.enso.runner/org.enso.runner.Main" - ) + manifestOptions ++ + environmentOptions ++ commandLineOptions ++ modulePathOptions val loggingConnectionArguments = if (runSettings.connectLoggerIfAvailable) @@ -242,6 +253,19 @@ class Runner( val engineVersion = runSettings.engineVersion jvmSettings.javaCommandOverride match { + case _ if nativeImage => + runtimeVersionManager.withEngineAndRuntime(engineVersion) { + case (engine, runtime) => + val cmd = NativeJavaCommand.apply(engineVersion.toString) + if (cmd.executablePath.toFile.exists()) { + prepareAndRunCommand(engine, cmd) + } else { + Logger[Runner].warn( + "Unable to locate native Language Server executable at " + cmd.executablePath + ". Reverting to regular invocation" + ) + prepareAndRunCommand(engine, JavaCommand.forRuntime(runtime)) + } + } case Some(overriddenCommand) => runtimeVersionManager.withEngine(engineVersion) { engine => prepareAndRunCommand(engine, overriddenCommand) From 61ce65544bdec6934dbd76ac9dc41cc2de78c0cb Mon Sep 17 00:00:00 2001 From: Hubert Plociniczak Date: Mon, 16 Dec 2024 17:28:47 +0100 Subject: [PATCH 02/17] nit --- .../main/scala/org/enso/languageserver/boot/MainModule.scala | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engine/language-server/src/main/scala/org/enso/languageserver/boot/MainModule.scala b/engine/language-server/src/main/scala/org/enso/languageserver/boot/MainModule.scala index e5170444af0c..b8a7a99eef1d 100644 --- a/engine/language-server/src/main/scala/org/enso/languageserver/boot/MainModule.scala +++ b/engine/language-server/src/main/scala/org/enso/languageserver/boot/MainModule.scala @@ -320,8 +320,10 @@ class MainModule(serverConfig: LanguageServerConfig, logLevel: Level) { val extraEngineOptions = new util.HashMap[String, String]() if (TruffleOptions.AOT) { + log.trace("Running Language Server in AOT mode") extraEngineOptions.put(RuntimeServerInfo.ENABLE_OPTION, "true") } else { + log.trace("Running Language Server in non-AOT mode") extraOptions.put(RuntimeServerInfo.ENABLE_OPTION, "true") } From c4d68730fc8788532c886487a4c930e9161c9e9b Mon Sep 17 00:00:00 2001 From: Hubert Plociniczak Date: Mon, 16 Dec 2024 17:47:37 +0100 Subject: [PATCH 03/17] Add missing reflect config Otherwise Akka and other code is simply dead-code eliminated in native-image. --- .../org/enso/runner/reflect-config.json | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json b/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json index 7a18744c81e6..f0ca6f6f4aa6 100644 --- a/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json +++ b/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json @@ -3668,5 +3668,26 @@ { "name":"sun.security.x509.SubjectKeyIdentifierExtension", "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -} +}, + { + "name": "org.enso.languageserver.boot.LanguageServerRunner", + "methods": [{ + "name": "", + "parameterTypes":[] + },{ + "name": "runLanguageServer", + "parameterTypes":["org.apache.commons.cli.CommandLine", "org.enso.runner.common.ProfilingConfig", "org.slf4j.event.Level"] + } + ] + }, + { + "name": "org.enso.runner.common.LanguageServerApi", + "methods": [{ + "name": "" + },{ + "name": "runLanguageServer", + "parameterTypes":["org.apache.commons.cli.CommandLine", "org.enso.runner.common.ProfilingConfig", "org.slf4j.event.Level"] + } + ] + } ] From def1ea7cc6e7d14b14d2d41c8fdfec69d4b4b1f5 Mon Sep 17 00:00:00 2001 From: Hubert Plociniczak Date: Mon, 16 Dec 2024 17:49:42 +0100 Subject: [PATCH 04/17] Ensure proper Context construction When message transport is missing, context should be properly built, even in AOT mode. --- .../java/org/enso/common/ContextFactory.java | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/engine/common/src/main/java/org/enso/common/ContextFactory.java b/engine/common/src/main/java/org/enso/common/ContextFactory.java index f0567aeba75f..95b0b4afde8b 100644 --- a/engine/common/src/main/java/org/enso/common/ContextFactory.java +++ b/engine/common/src/main/java/org/enso/common/ContextFactory.java @@ -235,17 +235,20 @@ public Context build() { .option("java.UseBindingsLoader", "true") .allowCreateThread(true); } - if (TruffleOptions.AOT) { - // In AOT mode one must not use a shared engine; the latter causes issues when initializing - // message transport - it is set to `null`. - var eng = - Engine.newBuilder() - .allowExperimentalOptions(true) - .serverTransport(messageTransport) - .options(engineOptions); - builder.engine(eng.build()); - } else if (messageTransport != null) { - builder.serverTransport(messageTransport); + + if (messageTransport != null) { + if (TruffleOptions.AOT) { + // In AOT mode one must not use a shared engine; the latter causes issues when initializing + // message transport - it is set to `null`. + var eng = + Engine.newBuilder() + .allowExperimentalOptions(true) + .serverTransport(messageTransport) + .options(engineOptions); + builder.engine(eng.build()); + } else { + builder.serverTransport(messageTransport); + } } var ctx = builder.build(); From 339493ce4b5d236b85d080b3754c6ed27fb348f4 Mon Sep 17 00:00:00 2001 From: Hubert Plociniczak Date: Tue, 17 Dec 2024 00:09:12 +0100 Subject: [PATCH 05/17] Add missing Akka entries in reflect-config --- .../org/enso/runner/reflect-config.json | 182 ++++++++++++++++++ 1 file changed, 182 insertions(+) diff --git a/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json b/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json index f0ca6f6f4aa6..ce73fb7f6fef 100644 --- a/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json +++ b/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json @@ -939,6 +939,188 @@ { "name":"java.util.logging.Logger" }, +{ + "name":"org.slf4j.Logger", + "methods": [{"name":"getLogger", "parameterTypes":["java.lang.Class"]}] +}, +{"name": "ch.qos.logback.core.status.InfoStatus"}, +{ + "name":"[Lakka.actor.LightArrayRevolverScheduler$TaskQueue;" +}, +{ + "name":"akka.event.DefaultLoggingFilter", + "methods":[{"name":"","parameterTypes":["akka.actor.ActorSystem$Settings", "akka.event.EventStream"] }] +}, +{ + "name":"akka.actor.ActorCell", + "fields":[{"name":"akka$actor$dungeon$Children$$_childrenRefsDoNotCallMeDirectly"}, {"name":"akka$actor$dungeon$Children$$_functionRefsDoNotCallMeDirectly"}, {"name":"akka$actor$dungeon$Children$$_nextNameDoNotCallMeDirectly"}, {"name":"akka$actor$dungeon$Dispatch$$_mailboxDoNotCallMeDirectly"}] +}, +{ + "name":"akka.actor.DefaultSupervisorStrategy", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"akka.actor.LightArrayRevolverScheduler", + "methods":[{"name":"","parameterTypes":["com.typesafe.config.Config","akka.event.LoggingAdapter","java.util.concurrent.ThreadFactory"] }] +}, +{ + "name":"akka.actor.LightArrayRevolverScheduler$TaskHolder", + "fields":[{"name":"task"}] +}, +{ + "name":"akka.actor.LocalActorRefProvider", + "methods":[{"name":"","parameterTypes":["java.lang.String","akka.actor.ActorSystem$Settings","akka.event.EventStream","akka.actor.DynamicAccess"] }] +}, +{ + "name":"akka.actor.LocalActorRefProvider$Guardian", + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":["akka.actor.SupervisorStrategy"] }] +}, +{ + "name":"akka.actor.LocalActorRefProvider$SystemGuardian", + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":["akka.actor.SupervisorStrategy","akka.actor.ActorRef"] }] +}, +{ + "name":"akka.actor.Props$EmptyActor", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"akka.actor.RepointableActorRef", + "fields":[{"name":"_cellDoNotCallMeDirectly"}, {"name":"_lookupDoNotCallMeDirectly"}] +}, +{ + "name":"akka.dispatch.AbstractNodeQueue", + "fields":[{"name":"_tailDoNotCallMeDirectly"}] +}, +{ + "name":"akka.dispatch.AbstractNodeQueue$Node", + "fields":[{"name":"_nextDoNotCallMeDirectly"}] +}, +{ + "name":"akka.dispatch.BoundedControlAwareMessageQueueSemantics" +}, +{ + "name":"akka.dispatch.BoundedDequeBasedMessageQueueSemantics" +}, +{ + "name":"akka.dispatch.BoundedMessageQueueSemantics" +}, +{ + "name":"akka.dispatch.ControlAwareMessageQueueSemantics" +}, +{ + "name":"akka.dispatch.DequeBasedMessageQueueSemantics" +}, +{ + "name":"akka.dispatch.Dispatcher", + "fields":[{"name":"executorServiceDelegate"}] +}, +{ + "name":"akka.dispatch.Mailbox", + "fields":[{"name":"_statusDoNotCallMeDirectly"}, {"name":"_systemQueueDoNotCallMeDirectly"}] +}, +{ + "name":"akka.dispatch.MessageDispatcher", + "fields":[{"name":"_inhabitantsDoNotCallMeDirectly"}, {"name":"_shutdownScheduleDoNotCallMeDirectly"}] +}, +{ + "name":"akka.dispatch.MultipleConsumerSemantics" +}, +{ + "name":"akka.dispatch.UnboundedControlAwareMessageQueueSemantics" +}, +{ + "name":"akka.dispatch.UnboundedDequeBasedMailbox", + "methods":[{"name":"","parameterTypes":["akka.actor.ActorSystem$Settings","com.typesafe.config.Config"] }] +}, +{ + "name":"akka.dispatch.UnboundedDequeBasedMessageQueueSemantics" +}, +{ + "name":"akka.dispatch.UnboundedMailbox", + "methods":[{"name":"","parameterTypes":["akka.actor.ActorSystem$Settings","com.typesafe.config.Config"] }] +}, +{ + "name":"akka.dispatch.UnboundedMessageQueueSemantics" +}, +{ + "name":"akka.event.DeadLetterListener", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name": "akka.event.DefaultLoggingFilter", + "methods": [{"name":"", "parameterTypes": ["akka.actor.ActorSystem$Settings", "akka.event.EventStream"]}] +}, +{ + "name":"akka.event.EventStreamUnsubscriber", + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":["akka.event.EventStream","boolean"] }] +}, +{ + "name":"akka.event.LoggerMailboxType", + "methods":[{"name":"","parameterTypes":["akka.actor.ActorSystem$Settings","com.typesafe.config.Config"] }] +}, +{ + "name":"akka.event.LoggerMessageQueueSemantics" +}, +{ + "name":"akka.event.slf4j.Slf4jLogger", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"akka.event.slf4j.Slf4jLoggingFilter", + "methods":[{"name":"","parameterTypes":["akka.actor.ActorSystem$Settings","akka.event.EventStream"] }] +}, +{ + "name":"akka.http.DefaultParsingErrorHandler$", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"akka.http.impl.engine.client.PoolMasterActor", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"akka.io.SelectionHandler", + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":["akka.io.SelectionHandlerSettings"] }] +}, +{ + "name":"akka.io.TcpIncomingConnection", + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":["akka.io.TcpExt","java.nio.channels.SocketChannel","akka.io.ChannelRegistry","akka.actor.ActorRef","scala.collection.immutable.Iterable","boolean"] }] +}, +{ + "name":"akka.io.TcpListener", + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":["akka.actor.ActorRef","akka.io.TcpExt","akka.io.ChannelRegistry","akka.actor.ActorRef","akka.io.Tcp$Bind"] }] +}, +{ + "name":"akka.io.TcpManager", + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":["akka.io.TcpExt"] }] +}, +{ + "name":"akka.pattern.PromiseActorRef", + "fields":[{"name":"_stateDoNotCallMeDirectly"}, {"name":"_watchedByDoNotCallMeDirectly"}] +}, +{ + "name":"akka.routing.ConsistentHashingPool", + "methods":[{"name":"","parameterTypes":["com.typesafe.config.Config"] }] +}, +{ + "name":"akka.routing.RoundRobinPool", + "methods":[{"name":"","parameterTypes":["com.typesafe.config.Config"] }] +}, +{ + "name":"akka.routing.RoutedActorCell$RouterActorCreator", + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":["akka.routing.RouterConfig"] }] +}, +{ + "name":"akka.stream.SystemMaterializer$", + "fields":[{"name":"MODULE$"}] +}, { "name":"java.util.logging.LoggingMXBean", "queryAllPublicMethods":true From b6015e7b5f310b4e85cdc300749578b0a67676a7 Mon Sep 17 00:00:00 2001 From: Hubert Plociniczak Date: Tue, 17 Dec 2024 10:34:39 +0100 Subject: [PATCH 06/17] nit --- .../org/enso/runner/reflect-config.json | 23 +- .../service/logback/EnsoSocketAppender.java | 387 ------------------ .../logging/service/logback/LogbackSetup.java | 3 +- 3 files changed, 3 insertions(+), 410 deletions(-) delete mode 100644 lib/scala/logging-service-logback/src/main/java/org/enso/logging/service/logback/EnsoSocketAppender.java diff --git a/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json b/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json index ce73fb7f6fef..cfb471eaa127 100644 --- a/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json +++ b/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json @@ -3850,26 +3850,5 @@ { "name":"sun.security.x509.SubjectKeyIdentifierExtension", "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, - { - "name": "org.enso.languageserver.boot.LanguageServerRunner", - "methods": [{ - "name": "", - "parameterTypes":[] - },{ - "name": "runLanguageServer", - "parameterTypes":["org.apache.commons.cli.CommandLine", "org.enso.runner.common.ProfilingConfig", "org.slf4j.event.Level"] - } - ] - }, - { - "name": "org.enso.runner.common.LanguageServerApi", - "methods": [{ - "name": "" - },{ - "name": "runLanguageServer", - "parameterTypes":["org.apache.commons.cli.CommandLine", "org.enso.runner.common.ProfilingConfig", "org.slf4j.event.Level"] - } - ] - } +} ] diff --git a/lib/scala/logging-service-logback/src/main/java/org/enso/logging/service/logback/EnsoSocketAppender.java b/lib/scala/logging-service-logback/src/main/java/org/enso/logging/service/logback/EnsoSocketAppender.java deleted file mode 100644 index f3263e2dfdb3..000000000000 --- a/lib/scala/logging-service-logback/src/main/java/org/enso/logging/service/logback/EnsoSocketAppender.java +++ /dev/null @@ -1,387 +0,0 @@ -package org.enso.logging.service.logback; - -import ch.qos.logback.classic.net.LoggingEventPreSerializationTransformer; -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.core.AppenderBase; -import ch.qos.logback.core.net.*; -import ch.qos.logback.core.spi.PreSerializationTransformer; -import ch.qos.logback.core.status.Status; -import ch.qos.logback.core.util.CloseUtil; -import ch.qos.logback.core.util.Duration; -import java.io.IOException; -import java.io.Serializable; -import java.net.ConnectException; -import java.net.InetAddress; -import java.net.Socket; -import java.net.UnknownHostException; -import java.util.concurrent.BlockingDeque; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; -import javax.net.SocketFactory; - -/** - * A direct copy of ch.qos.logback.core.net.SocketAppender and - * ch.qos.logback.core.net.AbstractSocketAppender. - */ -public class EnsoSocketAppender extends AppenderBase - implements SocketConnector.ExceptionHandler { - private static final PreSerializationTransformer pst = - new LoggingEventPreSerializationTransformer(); - - private boolean includeCallerData = false; - - /** The default port number of remote logging server (4560). */ - public static final int DEFAULT_PORT = 4560; - - /** The default reconnection delay (30000 milliseconds or 30 seconds). */ - public static final int DEFAULT_RECONNECTION_DELAY = 30000; - - /** - * Default size of the deque used to hold logging events that are destined for the remote peer. - */ - public static final int DEFAULT_QUEUE_SIZE = 128; - - /** Default timeout when waiting for the remote server to accept our connection. */ - private static final int DEFAULT_ACCEPT_CONNECTION_DELAY = 5000; - - /** Default timeout for how long to wait when inserting an event into the BlockingQueue. */ - private static final int DEFAULT_EVENT_DELAY_TIMEOUT = 100; - - private final ObjectWriterFactory objectWriterFactory; - private final QueueFactory queueFactory; - - private String remoteHost; - private int port = DEFAULT_PORT; - private InetAddress address; - private Duration reconnectionDelay = new Duration(DEFAULT_RECONNECTION_DELAY); - private int queueSize = DEFAULT_QUEUE_SIZE; - private int acceptConnectionTimeout = DEFAULT_ACCEPT_CONNECTION_DELAY; - private Duration eventDelayLimit = new Duration(DEFAULT_EVENT_DELAY_TIMEOUT); - - private BlockingDeque deque; - private String peerId; - private SocketConnector connector; - private Future task; - - private volatile Socket socket; - - /** Constructs a new appender. */ - public EnsoSocketAppender() { - this(new QueueFactory(), new ObjectWriterFactory()); - } - - /** - * Constructs a new appender using the given {@link QueueFactory} and {@link ObjectWriterFactory}. - */ - EnsoSocketAppender(QueueFactory queueFactory, ObjectWriterFactory objectWriterFactory) { - this.objectWriterFactory = objectWriterFactory; - this.queueFactory = queueFactory; - } - - protected void postProcessEvent(ILoggingEvent event) { - if (includeCallerData) { - event.getCallerData(); - } - } - - public void setIncludeCallerData(boolean includeCallerData) { - this.includeCallerData = includeCallerData; - } - - public PreSerializationTransformer getPST() { - return pst; - } - - /** {@inheritDoc} */ - public void start() { - if (isStarted()) return; - int errorCount = 0; - if (port <= 0) { - errorCount++; - addError( - "No port was configured for appender" - + name - + " For more information, please visit" - + " http://logback.qos.ch/codes.html#socket_no_port"); - } - - if (remoteHost == null) { - errorCount++; - addError( - "No remote host was configured for appender" - + name - + " For more information, please visit" - + " http://logback.qos.ch/codes.html#socket_no_host"); - } - - if (queueSize == 0) { - addWarn( - "Queue size of zero is deprecated, use a size of one to indicate synchronous processing"); - } - - if (queueSize < 0) { - errorCount++; - addError("Queue size must be greater than zero"); - } - - if (errorCount == 0) { - try { - address = InetAddress.getByName(remoteHost); - } catch (UnknownHostException ex) { - addError("unknown host: " + remoteHost); - errorCount++; - } - } - - if (errorCount == 0) { - deque = queueFactory.newLinkedBlockingDeque(queueSize); - peerId = "remote peer " + remoteHost + ":" + port + ": "; - connector = createConnector(address, port, 0, reconnectionDelay.getMilliseconds()); - task = - getContext() - .getExecutorService() - .submit( - new Runnable() { - @Override - public void run() { - connectSocketAndDispatchEvents(); - } - }); - super.start(); - } - } - - /** {@inheritDoc} */ - @Override - public void stop() { - if (!isStarted()) return; - CloseUtil.closeQuietly(socket); - task.cancel(true); - super.stop(); - } - - /** {@inheritDoc} */ - @Override - protected void append(ILoggingEvent event) { - if (event == null || !isStarted()) return; - - try { - final boolean inserted = - deque.offer(event, eventDelayLimit.getMilliseconds(), TimeUnit.MILLISECONDS); - if (!inserted) { - addInfo("Dropping event due to timeout limit of [" + eventDelayLimit + "] being exceeded"); - } - } catch (InterruptedException e) { - addError("Interrupted while appending event to SocketAppender", e); - } - } - - private void connectSocketAndDispatchEvents() { - try { - while (socketConnectionCouldBeEstablished()) { - try { - ObjectWriter objectWriter = createObjectWriterForSocket(); - addInfo(peerId + "connection established"); - dispatchEvents(objectWriter); - } catch (javax.net.ssl.SSLHandshakeException she) { - // FIXME - Thread.sleep(DEFAULT_RECONNECTION_DELAY); - } catch (IOException ex) { - addInfo(peerId + "connection failed: ", ex); - } catch (Throwable e) { - e.printStackTrace(); - throw e; - } finally { - if (socket != null) { - try { - socket.close(); - } catch (IOException ex) { - ex.printStackTrace(); - assert true; // avoid an empty catch - } - socket = null; - } - addInfo(peerId + "connection closed"); - } - } - } catch (InterruptedException ex) { - assert true; // ok... we'll exit now - } - addInfo("shutting down"); - } - - @Override - public void addStatus(Status status) { - System.out.println("STATUS: " + status.getTimestamp() + " @ " + status.getMessage()); - super.addStatus(status); - } - - private boolean socketConnectionCouldBeEstablished() throws InterruptedException { - return (socket = connector.call()) != null; - } - - private ObjectWriter createObjectWriterForSocket() throws IOException { - socket.setSoTimeout(acceptConnectionTimeout); - ObjectWriter objectWriter = - objectWriterFactory.newAutoFlushingObjectWriter(socket.getOutputStream()); - socket.setSoTimeout(0); - return objectWriter; - } - - private SocketConnector createConnector( - InetAddress address, int port, int initialDelay, long retryDelay) { - SocketConnector connector = newConnector(address, port, initialDelay, retryDelay); - connector.setExceptionHandler(this); - connector.setSocketFactory(getSocketFactory()); - return connector; - } - - private void dispatchEvents(ObjectWriter objectWriter) throws InterruptedException, IOException { - while (true) { - ILoggingEvent event = deque.takeFirst(); - postProcessEvent(event); - Serializable serializableEvent = getPST().transform(event); - try { - objectWriter.write(serializableEvent); - } catch (IOException e) { - System.out.println("Whoot? " + e.getMessage()); - e.printStackTrace(); - tryReAddingEventToFrontOfQueue(event); - throw e; - } - } - } - - private void tryReAddingEventToFrontOfQueue(ILoggingEvent event) { - final boolean wasInserted = deque.offerFirst(event); - if (!wasInserted) { - addInfo("Dropping event due to socket connection error and maxed out deque capacity"); - } - } - - /** {@inheritDoc} */ - public void connectionFailed(SocketConnector connector, Exception ex) { - if (ex instanceof InterruptedException) { - addInfo("connector interrupted"); - } else if (ex instanceof ConnectException) { - addInfo(peerId + "connection refused"); - } else { - addInfo(peerId + ex); - } - } - - /** - * Creates a new {@link SocketConnector}. - * - *

The default implementation creates an instance of {@link DefaultSocketConnector}. A subclass - * may override to provide a different {@link SocketConnector} implementation. - * - * @param address target remote address - * @param port target remote port - * @param initialDelay delay before the first connection attempt - * @param retryDelay delay before a reconnection attempt - * @return socket connector - */ - protected SocketConnector newConnector( - InetAddress address, int port, long initialDelay, long retryDelay) { - return new DefaultSocketConnector(address, port, initialDelay, retryDelay); - } - - /** - * Gets the default {@link SocketFactory} for the platform. - * - *

Subclasses may override to provide a custom socket factory. - */ - protected SocketFactory getSocketFactory() { - return SocketFactory.getDefault(); - } - - /** - * The RemoteHost property takes the name of the host where a corresponding server is - * running. - */ - public void setRemoteHost(String host) { - remoteHost = host; - } - - /** Returns value of the RemoteHost property. */ - public String getRemoteHost() { - return remoteHost; - } - - /** - * The Port property takes a positive integer representing the port where the server is - * waiting for connections. - */ - public void setPort(int port) { - this.port = port; - } - - /** Returns value of the Port property. */ - public int getPort() { - return port; - } - - /** - * The reconnectionDelay property takes a positive {@link Duration} value representing the - * time to wait between each failed connection attempt to the server. The default value of this - * option is to 30 seconds. - * - *

Setting this option to zero turns off reconnection capability. - */ - public void setReconnectionDelay(Duration delay) { - this.reconnectionDelay = delay; - } - - /** Returns value of the reconnectionDelay property. */ - public Duration getReconnectionDelay() { - return reconnectionDelay; - } - - /** - * The queueSize property takes a non-negative integer representing the number of logging - * events to retain for delivery to the remote receiver. When the deque size is zero, event - * delivery to the remote receiver is synchronous. When the deque size is greater than zero, the - * {@link #append(Object)} method returns immediately after enqueing the event, assuming that - * there is space available in the deque. Using a non-zero deque length can improve performance by - * eliminating delays caused by transient network delays. - * - * @param queueSize the deque size to set. - */ - public void setQueueSize(int queueSize) { - this.queueSize = queueSize; - } - - /** Returns the value of the queueSize property. */ - public int getQueueSize() { - return queueSize; - } - - /** - * The eventDelayLimit takes a non-negative integer representing the number of milliseconds - * to allow the appender to block if the underlying BlockingQueue is full. Once this limit is - * reached, the event is dropped. - * - * @param eventDelayLimit the event delay limit - */ - public void setEventDelayLimit(Duration eventDelayLimit) { - this.eventDelayLimit = eventDelayLimit; - } - - /** Returns the value of the eventDelayLimit property. */ - public Duration getEventDelayLimit() { - return eventDelayLimit; - } - - /** - * Sets the timeout that controls how long we'll wait for the remote peer to accept our connection - * attempt. - * - *

This property is configurable primarily to support instrumentation for unit testing. - * - * @param acceptConnectionTimeout timeout value in milliseconds - */ - void setAcceptConnectionTimeout(int acceptConnectionTimeout) { - this.acceptConnectionTimeout = acceptConnectionTimeout; - } -} diff --git a/lib/scala/logging-service-logback/src/main/java/org/enso/logging/service/logback/LogbackSetup.java b/lib/scala/logging-service-logback/src/main/java/org/enso/logging/service/logback/LogbackSetup.java index b19a0b8ae87a..7fe48e544b64 100644 --- a/lib/scala/logging-service-logback/src/main/java/org/enso/logging/service/logback/LogbackSetup.java +++ b/lib/scala/logging-service-logback/src/main/java/org/enso/logging/service/logback/LogbackSetup.java @@ -4,6 +4,7 @@ import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.encoder.PatternLayoutEncoder; import ch.qos.logback.classic.filter.ThresholdFilter; +import ch.qos.logback.classic.net.SocketAppender; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.ConsoleAppender; import ch.qos.logback.core.FileAppender; @@ -132,7 +133,7 @@ public boolean setupSocketAppender(Level logLevel, String hostname, int port) { org.enso.logging.config.SocketAppender appenderConfig = config.getSocketAppender(); - EnsoSocketAppender socketAppender = new EnsoSocketAppender(); + SocketAppender socketAppender = new SocketAppender(); socketAppender.setName("enso-socket"); socketAppender.setIncludeCallerData(false); socketAppender.setRemoteHost(hostname); From 96ae8c84f16a32183217732e06c672efda4ae3ca Mon Sep 17 00:00:00 2001 From: Hubert Plociniczak Date: Tue, 17 Dec 2024 13:53:48 +0100 Subject: [PATCH 07/17] Partial revert --- .../org/enso/runner/reflect-config.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json b/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json index cfb471eaa127..15c9b001ce48 100644 --- a/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json +++ b/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json @@ -3850,5 +3850,18 @@ { "name":"sun.security.x509.SubjectKeyIdentifierExtension", "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name": "org.enso.languageserver.boot.LanguageServerRunner", + "methods": [ + { + "name": "", + "parameterTypes":[] + }, + { + "name": "runLanguageServer", + "parameterTypes":["org.apache.commons.cli.CommandLine", "org.enso.runner.common.ProfilingConfig", "org.slf4j.event.Level"] + } + ] } ] From 8883d5c02e4f500417216a9b7a70a2e6c1a6a127 Mon Sep 17 00:00:00 2001 From: Hubert Plociniczak Date: Tue, 17 Dec 2024 14:16:26 +0100 Subject: [PATCH 08/17] Fix service registration Problems revealed after a clean build --- build.sbt | 15 ++++++++------- .../src/main/java/module-info.java | 1 + .../languageserver/boot/LanguageServerRunner.java | 1 + 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/build.sbt b/build.sbt index a4a3cfebc8e3..da9c0b6c3c5f 100644 --- a/build.sbt +++ b/build.sbt @@ -2291,13 +2291,14 @@ lazy val `language-server` = (project in file("engine/language-server")) javaModuleName := "org.enso.language.server", Compile / moduleDependencies ++= Seq( - "org.graalvm.polyglot" % "polyglot" % graalMavenPackagesVersion, - "org.graalvm.truffle" % "truffle-api" % graalMavenPackagesVersion, - "org.slf4j" % "slf4j-api" % slf4jVersion, - "commons-cli" % "commons-cli" % commonsCliVersion, - "commons-io" % "commons-io" % commonsIoVersion, - "com.google.flatbuffers" % "flatbuffers-java" % flatbuffersVersion, - "org.eclipse.jgit" % "org.eclipse.jgit" % jgitVersion + "org.graalvm.polyglot" % "polyglot" % graalMavenPackagesVersion, + "org.graalvm.truffle" % "truffle-api" % graalMavenPackagesVersion, + "org.slf4j" % "slf4j-api" % slf4jVersion, + "commons-cli" % "commons-cli" % commonsCliVersion, + "commons-io" % "commons-io" % commonsIoVersion, + "com.google.flatbuffers" % "flatbuffers-java" % flatbuffersVersion, + "org.eclipse.jgit" % "org.eclipse.jgit" % jgitVersion, + "org.netbeans.api" % "org-openide-util-lookup" % netbeansApiVersion ) ++ GraalVM.modules.map(_.withConfigurations(Some(Runtime.name))), Compile / internalModuleDependencies := Seq( (`akka-wrapper` / Compile / exportedModule).value, diff --git a/engine/language-server/src/main/java/module-info.java b/engine/language-server/src/main/java/module-info.java index 16c51fc6784c..bab3e2921fb2 100644 --- a/engine/language-server/src/main/java/module-info.java +++ b/engine/language-server/src/main/java/module-info.java @@ -37,6 +37,7 @@ requires org.enso.text.buffer; requires org.enso.task.progress.notifications; requires org.enso.ydoc.polyfill; + requires org.openide.util.lookup.RELEASE180; exports org.enso.languageserver.filemanager to scala.library; exports org.enso.languageserver.runtime to scala.library; diff --git a/engine/language-server/src/main/java/org/enso/languageserver/boot/LanguageServerRunner.java b/engine/language-server/src/main/java/org/enso/languageserver/boot/LanguageServerRunner.java index cf3d8964c186..eb3afde3f0f8 100644 --- a/engine/language-server/src/main/java/org/enso/languageserver/boot/LanguageServerRunner.java +++ b/engine/language-server/src/main/java/org/enso/languageserver/boot/LanguageServerRunner.java @@ -8,6 +8,7 @@ import org.slf4j.event.Level; import scala.concurrent.ExecutionContext; +@org.openide.util.lookup.ServiceProvider(service = LanguageServerApi.class) public final class LanguageServerRunner extends LanguageServerApi { public LanguageServerRunner() {} From 28650dd203e09ac16164b87d1e72dfcc455ee9ff Mon Sep 17 00:00:00 2001 From: Hubert Plociniczak Date: Mon, 30 Dec 2024 15:44:23 +0100 Subject: [PATCH 09/17] Fix Base_Tests in native-image --- .../native-image/org/enso/runner/reflect-config.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json b/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json index 15c9b001ce48..006dc7108cd7 100644 --- a/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json +++ b/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json @@ -870,6 +870,15 @@ { "name":"java.util.Base64.Encoder" }, +{ + "name":"java.util.Collection", + "methods": [ + { + "name":"contains", + "parameterTypes":["java.lang.Object"] + } + ] +}, { "name":"java.util.Date" }, From cd0a8d8b605eaf1c95c376f83d30c81a09e7b7c9 Mon Sep 17 00:00:00 2001 From: Hubert Plociniczak Date: Mon, 30 Dec 2024 16:44:51 +0100 Subject: [PATCH 10/17] Fix compilation issues --- .../test/scala/org/enso/projectmanager/BaseServerSpec.scala | 1 + .../enso/projectmanager/TestDistributionConfiguration.scala | 5 +++-- .../protocol/ProjectCreateHandleMissingRuntimeSpec.scala | 3 ++- .../org/enso/runtimeversionmanager/runner/JVMSettings.scala | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/scala/project-manager/src/test/scala/org/enso/projectmanager/BaseServerSpec.scala b/lib/scala/project-manager/src/test/scala/org/enso/projectmanager/BaseServerSpec.scala index 633cda4d5a8b..3372b1eaf9b0 100644 --- a/lib/scala/project-manager/src/test/scala/org/enso/projectmanager/BaseServerSpec.scala +++ b/lib/scala/project-manager/src/test/scala/org/enso/projectmanager/BaseServerSpec.scala @@ -93,6 +93,7 @@ class BaseServerSpec extends JsonRpcServerTestKit with BeforeAndAfterAll { val processConfig: MainProcessConfig = MainProcessConfig( logLevel = if (debugLogs) Level.TRACE else Level.ERROR, + nativeImage = false, profilingPath = profilingPath, profilingTime = None ) diff --git a/lib/scala/project-manager/src/test/scala/org/enso/projectmanager/TestDistributionConfiguration.scala b/lib/scala/project-manager/src/test/scala/org/enso/projectmanager/TestDistributionConfiguration.scala index 6d3fdb344dfb..caff26e794cc 100644 --- a/lib/scala/project-manager/src/test/scala/org/enso/projectmanager/TestDistributionConfiguration.scala +++ b/lib/scala/project-manager/src/test/scala/org/enso/projectmanager/TestDistributionConfiguration.scala @@ -94,11 +94,12 @@ class TestDistributionConfiguration( override def defaultJVMSettings: JVMSettings = { val currentProcess = ProcessHandle.current().info().command().toScala.getOrElse("java") - val javaCommand = JavaCommand(currentProcess, None) + val javaCommand = new JavaCommand(currentProcess, None) new JVMSettings( javaCommandOverride = Some(javaCommand), jvmOptions = Seq(), - extraOptions = Seq() + extraOptions = Seq(), + nativeImage = false ) } diff --git a/lib/scala/project-manager/src/test/scala/org/enso/projectmanager/protocol/ProjectCreateHandleMissingRuntimeSpec.scala b/lib/scala/project-manager/src/test/scala/org/enso/projectmanager/protocol/ProjectCreateHandleMissingRuntimeSpec.scala index 0fd90870bf43..6fd36c0a5d57 100644 --- a/lib/scala/project-manager/src/test/scala/org/enso/projectmanager/protocol/ProjectCreateHandleMissingRuntimeSpec.scala +++ b/lib/scala/project-manager/src/test/scala/org/enso/projectmanager/protocol/ProjectCreateHandleMissingRuntimeSpec.scala @@ -18,7 +18,8 @@ class ProjectCreateHandleMissingRuntimeSpec override def defaultJVMSettings: JVMSettings = JVMSettings( javaCommandOverride = None, jvmOptions = Seq(), - extraOptions = Seq() + extraOptions = Seq(), + nativeImage = false ) } diff --git a/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/JVMSettings.scala b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/JVMSettings.scala index 11da450d831a..c79e02c3688a 100644 --- a/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/JVMSettings.scala +++ b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/JVMSettings.scala @@ -56,7 +56,8 @@ object JVMSettings { JVMSettings( useSystemJVM = false, jvmOptions = jvmOptions.result(), - extraOptions = Seq(nioOpen) + extraOptions = Seq(nioOpen), + nativeImage = false ) } From ebaf50c9a1c89913e0e908cc286db8a6d4ea2af4 Mon Sep 17 00:00:00 2001 From: Hubert Plociniczak Date: Tue, 31 Dec 2024 18:00:46 +0100 Subject: [PATCH 11/17] Drop Truffle dependency --- build.sbt | 2 -- engine/common/src/main/java/module-info.java | 1 - .../java/org/enso/common/ContextFactory.java | 28 ++++++++----------- .../enso/languageserver/boot/MainModule.scala | 3 +- 4 files changed, 13 insertions(+), 21 deletions(-) diff --git a/build.sbt b/build.sbt index da9c0b6c3c5f..2acbe343a8a2 100644 --- a/build.sbt +++ b/build.sbt @@ -2169,14 +2169,12 @@ lazy val `engine-common` = project Test / envVars ++= distributionEnvironmentOverrides, libraryDependencies ++= Seq( "org.graalvm.polyglot" % "polyglot" % graalMavenPackagesVersion % "provided", - "org.graalvm.truffle" % "truffle-api" % graalMavenPackagesVersion % "provided" ), libraryDependencies ++= GraalVM.modules.map( _.withConfigurations(Some(Runtime.name)) ), Compile / moduleDependencies ++= { Seq( - "org.graalvm.truffle" % "truffle-api" % graalMavenPackagesVersion, "org.graalvm.polyglot" % "polyglot" % graalMavenPackagesVersion, "org.slf4j" % "slf4j-api" % slf4jVersion ) ++ GraalVM.modules.map(_.withConfigurations(Some(Runtime.name))) diff --git a/engine/common/src/main/java/module-info.java b/engine/common/src/main/java/module-info.java index 9a5be06bb020..ab242d316c5e 100644 --- a/engine/common/src/main/java/module-info.java +++ b/engine/common/src/main/java/module-info.java @@ -1,6 +1,5 @@ module org.enso.engine.common { requires org.graalvm.polyglot; - requires org.graalvm.truffle; requires org.enso.logging.utils; requires org.enso.logging.config; requires org.slf4j; diff --git a/engine/common/src/main/java/org/enso/common/ContextFactory.java b/engine/common/src/main/java/org/enso/common/ContextFactory.java index 95b0b4afde8b..209e14fdbb38 100644 --- a/engine/common/src/main/java/org/enso/common/ContextFactory.java +++ b/engine/common/src/main/java/org/enso/common/ContextFactory.java @@ -1,6 +1,5 @@ package org.enso.common; -import com.oracle.truffle.api.TruffleOptions; import java.io.File; import java.io.InputStream; import java.io.OutputStream; @@ -54,7 +53,7 @@ public final class ContextFactory { private String checkForWarnings; private int warningsLimit = 100; private java.util.Map options = new HashMap<>(); - private java.util.Map engineOptions = new HashMap<>(); + private java.util.Map engineOptions = null; private boolean enableDebugServer; private ContextFactory() {} @@ -197,9 +196,6 @@ public Context build() { if (enableDebugServer) { builder.option(DebugServerInfo.ENABLE_OPTION, "true"); } - if (!TruffleOptions.AOT && messageTransport != null) { - builder.serverTransport(messageTransport); - } builder.option(RuntimeOptions.LOG_LEVEL, logLevelName); var logHandler = JulHandler.get(); var logLevels = LoggerSetup.get().getConfig().getLoggers(); @@ -236,19 +232,17 @@ public Context build() { .allowCreateThread(true); } - if (messageTransport != null) { - if (TruffleOptions.AOT) { - // In AOT mode one must not use a shared engine; the latter causes issues when initializing - // message transport - it is set to `null`. - var eng = - Engine.newBuilder() - .allowExperimentalOptions(true) - .serverTransport(messageTransport) - .options(engineOptions); - builder.engine(eng.build()); - } else { - builder.serverTransport(messageTransport); + if (engineOptions != null) { + // In AOT mode one must not use a shared engine; the latter causes issues when initializing + // message transport - it is set to `null`. + var eng = Engine.newBuilder().allowExperimentalOptions(true).options(engineOptions); + + if (messageTransport != null) { + eng.serverTransport(messageTransport); } + builder.engine(eng.build()); + } else if (messageTransport != null) { + builder.serverTransport(messageTransport); } var ctx = builder.build(); diff --git a/engine/language-server/src/main/scala/org/enso/languageserver/boot/MainModule.scala b/engine/language-server/src/main/scala/org/enso/languageserver/boot/MainModule.scala index b8a7a99eef1d..9623c81f0689 100644 --- a/engine/language-server/src/main/scala/org/enso/languageserver/boot/MainModule.scala +++ b/engine/language-server/src/main/scala/org/enso/languageserver/boot/MainModule.scala @@ -318,8 +318,9 @@ class MainModule(serverConfig: LanguageServerConfig, logLevel: Level) { Runtime.getRuntime.availableProcessors().toString ) - val extraEngineOptions = new util.HashMap[String, String]() + var extraEngineOptions: util.HashMap[String, String] = null if (TruffleOptions.AOT) { + extraEngineOptions = new util.HashMap[String, String]() log.trace("Running Language Server in AOT mode") extraEngineOptions.put(RuntimeServerInfo.ENABLE_OPTION, "true") } else { From 08e1e4fb5dc4b296e944a74add61f9ccaef7f61d Mon Sep 17 00:00:00 2001 From: Hubert Plociniczak Date: Wed, 1 Jan 2025 17:45:02 +0100 Subject: [PATCH 12/17] fmt --- build.sbt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.sbt b/build.sbt index 2acbe343a8a2..5813e634bc34 100644 --- a/build.sbt +++ b/build.sbt @@ -2168,15 +2168,15 @@ lazy val `engine-common` = project commands += WithDebugCommand.withDebug, Test / envVars ++= distributionEnvironmentOverrides, libraryDependencies ++= Seq( - "org.graalvm.polyglot" % "polyglot" % graalMavenPackagesVersion % "provided", + "org.graalvm.polyglot" % "polyglot" % graalMavenPackagesVersion % "provided" ), libraryDependencies ++= GraalVM.modules.map( _.withConfigurations(Some(Runtime.name)) ), Compile / moduleDependencies ++= { Seq( - "org.graalvm.polyglot" % "polyglot" % graalMavenPackagesVersion, - "org.slf4j" % "slf4j-api" % slf4jVersion + "org.graalvm.polyglot" % "polyglot" % graalMavenPackagesVersion, + "org.slf4j" % "slf4j-api" % slf4jVersion ) ++ GraalVM.modules.map(_.withConfigurations(Some(Runtime.name))) }, Compile / internalModuleDependencies := Seq( From 1588cec814625152dab1783b6fe16152636d6f4f Mon Sep 17 00:00:00 2001 From: Hubert Plociniczak Date: Fri, 3 Jan 2025 15:35:29 +0100 Subject: [PATCH 13/17] Drop TruffleOptions dependency Despite being advertised as such, native image doesn't set `com.oracle.graalvm.isaot` and it has to be provided separately if we don't want to use `TruffleOptions`. --- build.sbt | 11 ++--------- .../src/main/java/module-info.java | 2 +- .../enso/languageserver/boot/MainModule.scala | 3 +-- .../main/java/org/enso/runner/RunnerLogging.java | 16 ++++++++++------ .../enso/distribution/DistributionManager.scala | 6 ++++-- .../runtimeversionmanager/runner/Runner.scala | 7 +++++-- 6 files changed, 23 insertions(+), 22 deletions(-) diff --git a/build.sbt b/build.sbt index 5813e634bc34..059b03bd59f0 100644 --- a/build.sbt +++ b/build.sbt @@ -2170,14 +2170,11 @@ lazy val `engine-common` = project libraryDependencies ++= Seq( "org.graalvm.polyglot" % "polyglot" % graalMavenPackagesVersion % "provided" ), - libraryDependencies ++= GraalVM.modules.map( - _.withConfigurations(Some(Runtime.name)) - ), Compile / moduleDependencies ++= { Seq( "org.graalvm.polyglot" % "polyglot" % graalMavenPackagesVersion, "org.slf4j" % "slf4j-api" % slf4jVersion - ) ++ GraalVM.modules.map(_.withConfigurations(Some(Runtime.name))) + ) }, Compile / internalModuleDependencies := Seq( (`logging-utils` / Compile / exportedModule).value, @@ -2283,21 +2280,17 @@ lazy val `language-server` = (project in file("engine/language-server")) "org.eclipse.jgit" % "org.eclipse.jgit" % jgitVersion, "org.apache.tika" % "tika-core" % tikaVersion % Test ), - libraryDependencies ++= GraalVM.modules.map( - _.withConfigurations(Some(Runtime.name)) - ), javaModuleName := "org.enso.language.server", Compile / moduleDependencies ++= Seq( "org.graalvm.polyglot" % "polyglot" % graalMavenPackagesVersion, - "org.graalvm.truffle" % "truffle-api" % graalMavenPackagesVersion, "org.slf4j" % "slf4j-api" % slf4jVersion, "commons-cli" % "commons-cli" % commonsCliVersion, "commons-io" % "commons-io" % commonsIoVersion, "com.google.flatbuffers" % "flatbuffers-java" % flatbuffersVersion, "org.eclipse.jgit" % "org.eclipse.jgit" % jgitVersion, "org.netbeans.api" % "org-openide-util-lookup" % netbeansApiVersion - ) ++ GraalVM.modules.map(_.withConfigurations(Some(Runtime.name))), + ), Compile / internalModuleDependencies := Seq( (`akka-wrapper` / Compile / exportedModule).value, (`zio-wrapper` / Compile / exportedModule).value, diff --git a/engine/language-server/src/main/java/module-info.java b/engine/language-server/src/main/java/module-info.java index bab3e2921fb2..d0acf7391f28 100644 --- a/engine/language-server/src/main/java/module-info.java +++ b/engine/language-server/src/main/java/module-info.java @@ -7,7 +7,7 @@ requires commons.cli; requires flatbuffers.java; requires org.apache.commons.io; - requires org.graalvm.truffle; + requires org.graalvm.polyglot; requires org.eclipse.jgit; requires org.slf4j; diff --git a/engine/language-server/src/main/scala/org/enso/languageserver/boot/MainModule.scala b/engine/language-server/src/main/scala/org/enso/languageserver/boot/MainModule.scala index 9623c81f0689..67044df0a854 100644 --- a/engine/language-server/src/main/scala/org/enso/languageserver/boot/MainModule.scala +++ b/engine/language-server/src/main/scala/org/enso/languageserver/boot/MainModule.scala @@ -55,7 +55,6 @@ import org.enso.profiling.events.NoopEventsMonitor import org.enso.searcher.memory.InMemorySuggestionsRepo import org.enso.text.{ContentBasedVersioning, Sha3_224VersionCalculator} import org.enso.version.BuildVersion -import com.oracle.truffle.api.TruffleOptions import org.graalvm.polyglot.io.MessageEndpoint import org.slf4j.event.Level import org.slf4j.LoggerFactory @@ -319,7 +318,7 @@ class MainModule(serverConfig: LanguageServerConfig, logLevel: Level) { ) var extraEngineOptions: util.HashMap[String, String] = null - if (TruffleOptions.AOT) { + if (java.lang.Boolean.getBoolean("com.oracle.graalvm.isaot")) { extraEngineOptions = new util.HashMap[String, String]() log.trace("Running Language Server in AOT mode") extraEngineOptions.put(RuntimeServerInfo.ENABLE_OPTION, "true") diff --git a/engine/runner/src/main/java/org/enso/runner/RunnerLogging.java b/engine/runner/src/main/java/org/enso/runner/RunnerLogging.java index 0421a0088df2..94a36383a1d8 100644 --- a/engine/runner/src/main/java/org/enso/runner/RunnerLogging.java +++ b/engine/runner/src/main/java/org/enso/runner/RunnerLogging.java @@ -63,12 +63,16 @@ private static void setupImpl( } else { var future = executorService.submit( - () -> - loggerSetup.setup( - logLevel, - distributionManager.paths().logs(), - "enso-cli", - loggerSetup.getConfig())); + () -> { + var status = + loggerSetup.setup( + logLevel, + distributionManager.paths().logs(), + "enso-cli", + loggerSetup.getConfig()); + distributionManager.logPaths(); + return status; + }); try { var success = future.get(); if (!success) { diff --git a/lib/scala/distribution-manager/src/main/scala/org/enso/distribution/DistributionManager.scala b/lib/scala/distribution-manager/src/main/scala/org/enso/distribution/DistributionManager.scala index 640697816221..b46980ad5cd9 100644 --- a/lib/scala/distribution-manager/src/main/scala/org/enso/distribution/DistributionManager.scala +++ b/lib/scala/distribution-manager/src/main/scala/org/enso/distribution/DistributionManager.scala @@ -138,9 +138,11 @@ class DistributionManager(val env: Environment) { /** Determines paths that should be used by the launcher. */ lazy val paths: DistributionPaths = { - val paths = detectPaths() + detectPaths() + } + + def logPaths(): Unit = { logger.debug("Detected paths: {}", paths) - paths } protected def detectPaths(): DistributionPaths = { diff --git a/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/Runner.scala b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/Runner.scala index 8d019b3d3fc9..65ac4f47e285 100644 --- a/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/Runner.scala +++ b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/Runner.scala @@ -214,8 +214,11 @@ class Runner( "org.enso.runner/org.enso.runner.Main" ) val jvmArguments = - manifestOptions ++ - environmentOptions ++ commandLineOptions ++ modulePathOptions + if (nativeImage) Seq("-Dcom.oracle.graalvm.isaot=true") + else + Seq() ++ + manifestOptions ++ + environmentOptions ++ commandLineOptions ++ modulePathOptions val loggingConnectionArguments = if (runSettings.connectLoggerIfAvailable) From 55f662383130e207915fb67c0c56875ead51f7ba Mon Sep 17 00:00:00 2001 From: Hubert Plociniczak Date: Fri, 3 Jan 2025 17:53:17 +0100 Subject: [PATCH 14/17] Move NI config to LS resources --- .../enso/languageserver/reflect-config.json | 3892 +++++++++++++++++ .../languageserver/serialization-config.json | 59 + .../org/enso/runner/reflect-config.json | 204 - .../org/enso/runner/serialization-config.json | 51 - 4 files changed, 3951 insertions(+), 255 deletions(-) create mode 100644 engine/language-server/src/main/resources/META-INF/native-image/org/enso/languageserver/reflect-config.json create mode 100644 engine/language-server/src/main/resources/META-INF/native-image/org/enso/languageserver/serialization-config.json diff --git a/engine/language-server/src/main/resources/META-INF/native-image/org/enso/languageserver/reflect-config.json b/engine/language-server/src/main/resources/META-INF/native-image/org/enso/languageserver/reflect-config.json new file mode 100644 index 000000000000..306a5bab286c --- /dev/null +++ b/engine/language-server/src/main/resources/META-INF/native-image/org/enso/languageserver/reflect-config.json @@ -0,0 +1,3892 @@ +[ +{ + "name":"[B" +}, +{ + "name":"[C" +}, +{ + "name":"[D" +}, +{ + "name":"[F" +}, +{ + "name":"[I" +}, +{ + "name":"[J" +}, +{ + "name":"[Ljava.lang.Object;" +}, +{ + "name":"[Ljava.lang.String;" +}, +{ + "name":"[Ljava.nio.file.Path;" +}, +{ + "name":"[Ljava.util.concurrent.CompletableFuture;" +}, +{ + "name":"[Ljavax.management.openmbean.CompositeData;" +}, +{ + "name":"[Lorg.enso.interpreter.node.ExpressionNode;" +}, +{ + "name":"[Lorg.enso.interpreter.node.controlflow.caseexpr.BranchNode;" +}, +{ + "name":"[Lorg.enso.interpreter.runtime.callable.Annotation;" +}, +{ + "name":"[Lorg.enso.interpreter.runtime.callable.argument.CallArgument;" +}, +{ + "name":"[Lorg.enso.text.buffer.Node;" +}, +{ + "name":"[Lscala.Tuple2;" +}, +{ + "name":"[Lsun.security.pkcs.SignerInfo;" +}, +{ + "name":"[S" +}, +{ + "name":"[Z" +}, +{ + "name":"ch.qos.logback.classic.encoder.PatternLayoutEncoder", + "queryAllPublicMethods":true, + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"ch.qos.logback.classic.pattern.DateConverter", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"ch.qos.logback.classic.pattern.LevelConverter", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"ch.qos.logback.classic.pattern.LineSeparatorConverter", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"ch.qos.logback.classic.pattern.LoggerConverter", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"ch.qos.logback.classic.pattern.MessageConverter", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"ch.qos.logback.classic.pattern.NopThrowableInformationConverter", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"ch.qos.logback.classic.pattern.ThreadConverter", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"ch.qos.logback.core.ConsoleAppender", + "queryAllPublicMethods":true, + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"ch.qos.logback.core.OutputStreamAppender", + "methods":[{"name":"setEncoder","parameterTypes":["ch.qos.logback.core.encoder.Encoder"] }] +}, +{ + "name":"ch.qos.logback.core.encoder.Encoder", + "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }] +}, +{ + "name":"ch.qos.logback.core.encoder.LayoutWrappingEncoder", + "methods":[{"name":"setParent","parameterTypes":["ch.qos.logback.core.spi.ContextAware"] }] +}, +{ + "name":"ch.qos.logback.core.pattern.PatternLayoutEncoderBase", + "methods":[{"name":"setPattern","parameterTypes":["java.lang.String"] }] +}, +{ + "name":"ch.qos.logback.core.rolling.helper.DateTokenConverter", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"ch.qos.logback.core.rolling.helper.IntegerTokenConverter", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"ch.qos.logback.core.spi.ContextAware", + "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }] +}, +{ + "name":"com.fasterxml.jackson.core.JsonProcessingException" +}, +{ + "name":"com.fasterxml.jackson.databind.JsonNode" +}, +{ + "name":"com.fasterxml.jackson.databind.ObjectMapper" +}, +{ + "name":"com.fasterxml.jackson.databind.ext.Java7SupportImpl", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.fasterxml.jackson.databind.node.ArrayNode" +}, +{ + "name":"com.fasterxml.jackson.databind.node.BooleanNode" +}, +{ + "name":"com.fasterxml.jackson.databind.node.DoubleNode" +}, +{ + "name":"com.fasterxml.jackson.databind.node.JsonNodeFactory" +}, +{ + "name":"com.fasterxml.jackson.databind.node.JsonNodeType" +}, +{ + "name":"com.fasterxml.jackson.databind.node.LongNode" +}, +{ + "name":"com.fasterxml.jackson.databind.node.NullNode" +}, +{ + "name":"com.fasterxml.jackson.databind.node.ObjectNode" +}, +{ + "name":"com.fasterxml.jackson.databind.node.TextNode" +}, +{ + "name":"com.ibm.icu.lang.UCharacter" +}, +{ + "name":"com.ibm.icu.text.BreakIterator" +}, +{ + "name":"com.ibm.icu.text.BreakIteratorFactory", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.ibm.icu.text.CollatorServiceShim", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.ibm.icu.text.Normalizer2" +}, +{ + "name":"com.ibm.icu.text.Normalizer2$Mode" +}, +{ + "name":"com.ibm.icu.text.Normalizer2.Mode" +}, +{ + "name":"com.sun.crypto.provider.AESCipher$General", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.sun.crypto.provider.ARCFOURCipher", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.sun.crypto.provider.ChaCha20Cipher$ChaCha20Poly1305", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.sun.crypto.provider.DESCipher", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.sun.crypto.provider.DESedeCipher", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.sun.crypto.provider.DHParameters", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.sun.crypto.provider.GaloisCounterMode$AESGCM", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.sun.crypto.provider.HmacCore$HmacSHA256", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.sun.crypto.provider.TlsKeyMaterialGenerator", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.sun.crypto.provider.TlsMasterSecretGenerator", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.sun.crypto.provider.TlsPrfGenerator$V12", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.sun.jna.CallbackProxy", + "methods":[{"name":"callback","parameterTypes":["java.lang.Object[]"] }] +}, +{ + "name":"com.sun.management.GarbageCollectorMXBean", + "queryAllPublicMethods":true +}, +{ + "name":"com.sun.management.GcInfo", + "queryAllPublicMethods":true +}, +{ + "name":"com.sun.management.HotSpotDiagnosticMXBean", + "queryAllPublicMethods":true +}, +{ + "name":"com.sun.management.ThreadMXBean", + "queryAllPublicMethods":true +}, +{ + "name":"com.sun.management.UnixOperatingSystemMXBean", + "queryAllPublicMethods":true +}, +{ + "name":"com.sun.management.VMOption", + "queryAllPublicMethods":true +}, +{ + "name":"com.sun.management.internal.GarbageCollectorExtImpl", + "queryAllPublicConstructors":true +}, +{ + "name":"com.sun.management.internal.HotSpotDiagnostic", + "queryAllPublicConstructors":true +}, +{ + "name":"com.sun.management.internal.HotSpotThreadImpl", + "queryAllPublicConstructors":true +}, +{ + "name":"com.sun.management.internal.OperatingSystemImpl", + "queryAllPublicConstructors":true +}, +{ + "name":"com.sun.org.apache.xerces.internal.dom.DOMXSImplementationSourceImpl", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.typesafe.sslconfig.ssl.NoopHostnameVerifier", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.univocity.parsers.common.TextParsingException" +}, +{ + "name":"java.beans.Introspector" +}, +{ + "name":"java.io.BufferedInputStream" +}, +{ + "name":"java.io.ByteArrayInputStream" +}, +{ + "name":"java.io.ByteArrayOutputStream" +}, +{ + "name":"java.io.File" +}, +{ + "name":"java.io.FileInputStream" +}, +{ + "name":"java.io.FileNotFoundException" +}, +{ + "name":"java.io.FilePermission" +}, +{ + "name":"java.io.IOException" +}, +{ + "name":"java.io.InputStream" +}, +{ + "name":"java.io.OutputStream" +}, +{ + "name":"java.io.PrintWriter" +}, +{ + "name":"java.io.Reader" +}, +{ + "name":"java.io.Serializable" +}, +{ + "name":"java.io.StringReader" +}, +{ + "name":"java.io.StringWriter" +}, +{ + "name":"java.io.UncheckedIOException" +}, +{ + "name":"java.io.Writer" +}, +{ + "name":"java.lang.ArithmeticException" +}, +{ + "name":"java.lang.Boolean", + "fields":[{"name":"TYPE"}] +}, +{ + "name":"java.lang.Byte", + "fields":[{"name":"TYPE"}] +}, +{ + "name":"java.lang.Character", + "fields":[{"name":"TYPE"}] +}, +{ + "name":"java.lang.Class", + "methods":[{"name":"getModule","parameterTypes":[] }] +}, +{ + "name":"java.lang.ClassCastException" +}, +{ + "name":"java.lang.ClassValue" +}, +{ + "name":"java.lang.Class[]" +}, +{ + "name":"java.lang.Deprecated", + "queryAllPublicMethods":true +}, +{ + "name":"java.lang.Double", + "fields":[{"name":"TYPE"}] +}, +{ + "name":"java.lang.Enum", + "methods":[{"name":"name","parameterTypes":[] }] +}, +{ + "name":"java.lang.Exception" +}, +{ + "name":"java.lang.Float", + "fields":[{"name":"TYPE"}] +}, +{ + "name":"java.lang.IllegalArgumentException" +}, +{ + "name":"java.lang.IllegalStateException" +}, +{ + "name":"java.lang.IndexOutOfBoundsException" +}, +{ + "name":"java.lang.Integer", + "fields":[{"name":"TYPE"}] +}, +{ + "name":"java.lang.Long", + "fields":[{"name":"TYPE"}] +}, +{ + "name":"java.lang.Math" +}, +{ + "name":"java.lang.Module", + "methods":[{"name":"getDescriptor","parameterTypes":[] }] +}, +{ + "name":"java.lang.NullPointerException" +}, +{ + "name":"java.lang.NumberFormatException" +}, +{ + "name":"java.lang.Object", + "methods":[ + {"name":"", "parameterTypes":[]}, + {"name":"equals","parameterTypes":["java.lang.Object"] }, {"name":"hashCode","parameterTypes":[] }, {"name":"toString","parameterTypes":[] } + ] +}, +{ + "name":"java.lang.OutOfMemoryError" +}, +{ + "name":"java.lang.RuntimePermission" +}, +{ + "name":"java.lang.Short", + "fields":[{"name":"TYPE"}] +}, +{ + "name":"java.lang.StackTraceElement", + "queryAllPublicMethods":true +}, +{ + "name":"java.lang.String", + "fields":[{"name":"TYPE"}, {"name":"CASE_INSENSITIVE_ORDER"}, {"name":"value"}], + "methods":[ + {"name":"","parameterTypes":["java.lang.String"]}, + {"name":"format","parameterTypes":["java.lang.String", "java.lang.Object[]"]} + ] +}, +{ + "name":"java.lang.StringBuilder" +}, +{ + "name":"java.lang.String[]" +}, +{ + "name":"java.lang.System" +}, +{ + "name":"java.lang.Thread", + "fields":[{"name":"threadLocalRandomProbe"}] +}, +{ + "name":"java.lang.Thread$State" +}, +{ + "name":"java.lang.Thread.State" +}, +{ + "name":"java.lang.Throwable", + "methods":[{"name":"addSuppressed","parameterTypes":["java.lang.Throwable"] }] +}, +{ + "name":"java.lang.UnsupportedOperationException" +}, +{ + "name":"java.lang.Void", + "fields":[{"name":"TYPE"}] +}, +{ + "name":"java.lang.invoke.MethodHandle", + "methods":[{"name":"bindTo","parameterTypes":["java.lang.Object"] }, {"name":"invokeWithArguments","parameterTypes":["java.lang.Object[]"] }] +}, +{ + "name":"java.lang.invoke.MethodHandles", + "methods":[{"name":"lookup","parameterTypes":[] }, {"name":"privateLookupIn","parameterTypes":["java.lang.Class","java.lang.invoke.MethodHandles$Lookup"] }] +}, +{ + "name":"java.lang.invoke.MethodHandles$Lookup", + "methods":[{"name":"findSpecial","parameterTypes":["java.lang.Class","java.lang.String","java.lang.invoke.MethodType","java.lang.Class"] }, {"name":"in","parameterTypes":["java.lang.Class"] }, {"name":"unreflectSpecial","parameterTypes":["java.lang.reflect.Method","java.lang.Class"] }] +}, +{ + "name":"java.lang.invoke.MethodType", + "methods":[{"name":"methodType","parameterTypes":["java.lang.Class","java.lang.Class[]"] }] +}, +{ + "name":"java.lang.invoke.VarHandle", + "methods":[{"name":"releaseFence","parameterTypes":[] }] +}, +{ + "name":"java.lang.management.BufferPoolMXBean", + "queryAllPublicMethods":true +}, +{ + "name":"java.lang.management.ClassLoadingMXBean", + "queryAllPublicMethods":true +}, +{ + "name":"java.lang.management.CompilationMXBean", + "queryAllPublicMethods":true +}, +{ + "name":"java.lang.management.LockInfo", + "queryAllPublicMethods":true +}, +{ + "name":"java.lang.management.ManagementPermission", + "methods":[{"name":"","parameterTypes":["java.lang.String"] }] +}, +{ + "name":"java.lang.management.MemoryMXBean", + "queryAllPublicMethods":true +}, +{ + "name":"java.lang.management.MemoryManagerMXBean", + "queryAllPublicMethods":true +}, +{ + "name":"java.lang.management.MemoryPoolMXBean", + "queryAllPublicMethods":true +}, +{ + "name":"java.lang.management.MemoryUsage", + "queryAllPublicMethods":true +}, +{ + "name":"java.lang.management.MonitorInfo", + "queryAllPublicMethods":true +}, +{ + "name":"java.lang.management.PlatformLoggingMXBean", + "queryAllPublicMethods":true, + "methods":[{"name":"getLoggerLevel","parameterTypes":["java.lang.String"] }, {"name":"getLoggerNames","parameterTypes":[] }, {"name":"getParentLoggerName","parameterTypes":["java.lang.String"] }, {"name":"setLoggerLevel","parameterTypes":["java.lang.String","java.lang.String"] }] +}, +{ + "name":"java.lang.management.RuntimeMXBean", + "queryAllPublicMethods":true +}, +{ + "name":"java.lang.management.ThreadInfo", + "queryAllPublicMethods":true +}, +{ + "name":"java.lang.module.ModuleDescriptor", + "methods":[{"name":"rawVersion","parameterTypes":[] }] +}, +{ + "name":"java.lang.reflect.Method", + "methods":[{"name":"isDefault","parameterTypes":[] }, {"name":"isVarArgs","parameterTypes":[] }] +}, +{ + "name":"java.math.BigDecimal" +}, +{ + "name":"java.math.BigInteger" +}, +{ + "name":"java.math.MathContext" +}, +{ + "name":"java.math.RoundingMode" +}, +{ + "name":"java.net.InetSocketAddress" +}, +{ + "name":"java.net.NetPermission" +}, +{ + "name":"java.net.ProxySelector" +}, +{ + "name":"java.net.SocketPermission" +}, +{ + "name":"java.net.URI" +}, +{ + "name":"java.net.URISyntaxException" +}, +{ + "name":"java.net.URLEncoder" +}, +{ + "name":"java.net.URLPermission", + "methods":[{"name":"","parameterTypes":["java.lang.String","java.lang.String"] }] +}, +{ + "name":"java.net.http.HttpClient" +}, +{ + "name":"java.net.http.HttpClient$Builder" +}, +{ + "name":"java.net.http.HttpClient$Redirect" +}, +{ + "name":"java.net.http.HttpClient.Builder" +}, +{ + "name":"java.net.http.HttpClient.Redirect" +}, +{ + "name":"java.net.http.HttpRequest" +}, +{ + "name":"java.net.http.HttpRequest$BodyPublisher" +}, +{ + "name":"java.net.http.HttpRequest$BodyPublishers" +}, +{ + "name":"java.net.http.HttpRequest$Builder" +}, +{ + "name":"java.net.http.HttpRequest.BodyPublisher" +}, +{ + "name":"java.net.http.HttpRequest.BodyPublishers" +}, +{ + "name":"java.net.http.HttpRequest.Builder" +}, +{ + "name":"java.nio.Buffer" +}, +{ + "name":"java.nio.CharBuffer" +}, +{ + "name":"java.nio.charset.Charset" +}, +{ + "name":"java.nio.charset.UnsupportedCharsetException" +}, +{ + "name":"java.nio.file.AccessDeniedException" +}, +{ + "name":"java.nio.file.DirectoryNotEmptyException" +}, +{ + "name":"java.nio.file.FileAlreadyExistsException" +}, +{ + "name":"java.nio.file.FileSystemException" +}, +{ + "name":"java.nio.file.FileSystems" +}, +{ + "name":"java.nio.file.NoSuchFileException" +}, +{ + "name":"java.nio.file.NotDirectoryException" +}, +{ + "name":"java.nio.file.Path" +}, +{ + "name":"java.nio.file.WatchEvent$Modifier" +}, +{ + "name":"java.nio.file.Path[]" +}, +{ + "name":"java.nio.file.StandardCopyOption" +}, +{ + "name":"java.nio.file.StandardOpenOption" +}, +{ + "name":"java.nio.file.attribute.PosixFilePermission" +}, +{ + "name":"java.nio.file.attribute.PosixFilePermissions" +}, +{ + "name":"java.security.AlgorithmParametersSpi" +}, +{ + "name":"java.security.AllPermission" +}, +{ + "name":"java.security.KeyStore" +}, +{ + "name":"java.security.KeyStoreSpi" +}, +{ + "name":"java.security.MessageDigestSpi" +}, +{ + "name":"java.security.SecureRandomParameters" +}, +{ + "name":"java.security.SecurityPermission" +}, +{ + "name":"java.security.cert.PKIXRevocationChecker" +}, +{ + "name":"java.security.interfaces.ECPrivateKey" +}, +{ + "name":"java.security.interfaces.ECPublicKey" +}, +{ + "name":"java.security.interfaces.RSAPrivateKey" +}, +{ + "name":"java.security.interfaces.RSAPublicKey" +}, +{ + "name":"java.security.spec.DSAParameterSpec" +}, +{ + "name":"java.sql.Connection" +}, +{ + "name":"java.sql.DatabaseMetaData" +}, +{ + "name":"java.sql.Date" +}, +{ + "name":"java.sql.JDBCType" +}, +{ + "name":"java.sql.PreparedStatement" +}, +{ + "name":"java.sql.ResultSet" +}, +{ + "name":"java.sql.ResultSetMetaData" +}, +{ + "name":"java.sql.SQLException" +}, +{ + "name":"java.sql.SQLTimeoutException" +}, +{ + "name":"java.sql.Timestamp" +}, +{ + "name":"java.sql.Types" +}, +{ + "name":"java.text.DecimalFormat" +}, +{ + "name":"java.text.DecimalFormatSymbols" +}, +{ + "name":"java.text.NumberFormat" +}, +{ + "name":"java.text.ParseException" +}, +{ + "name":"java.time.DateTimeException" +}, +{ + "name":"java.time.DayOfWeek" +}, +{ + "name":"java.time.Duration" +}, +{ + "name":"java.time.Instant" +}, +{ + "name":"java.time.LocalDate" +}, +{ + "name":"java.time.LocalDateTime" +}, +{ + "name":"java.time.LocalTime" +}, +{ + "name":"java.time.Period" +}, +{ + "name":"java.time.ZoneId" +}, +{ + "name":"java.time.ZoneOffset" +}, +{ + "name":"java.time.ZonedDateTime" +}, +{ + "name":"java.time.chrono.ChronoPeriod" +}, +{ + "name":"java.time.format.DateTimeFormatter" +}, +{ + "name":"java.time.format.DateTimeFormatterBuilder" +}, +{ + "name":"java.time.format.SignStyle" +}, +{ + "name":"java.time.format.TextStyle" +}, +{ + "name":"java.time.temporal.ChronoField" +}, +{ + "name":"java.time.temporal.ChronoUnit" +}, +{ + "name":"java.time.temporal.IsoFields" +}, +{ + "name":"java.time.temporal.TemporalAdjuster" +}, +{ + "name":"java.time.temporal.TemporalAdjusters" +}, +{ + "name":"java.time.temporal.TemporalAmount" +}, +{ + "name":"java.time.temporal.TemporalUnit" +}, +{ + "name":"java.time.temporal.UnsupportedTemporalTypeException" +}, +{ + "name":"java.util.AbstractList" +}, +{ + "name":"java.util.ArrayList" +}, +{ + "name":"java.util.Base64" +}, +{ + "name":"java.util.Base64$Decoder" +}, +{ + "name":"java.util.Base64$Encoder" +}, +{ + "name":"java.util.Base64.Decoder" +}, +{ + "name":"java.util.Base64.Encoder" +}, +{ + "name":"java.util.Collection", + "methods": [ + { + "name":"contains", + "parameterTypes":["java.lang.Object"] + } + ] +}, +{ + "name":"java.util.Date" +}, +{ + "name":"java.util.HashSet" +}, +{ + "name":"java.util.Iterator" +}, +{ + "name":"java.util.List" +}, +{ + "name":"java.util.Locale", + "allDeclaredClasses":true, + "methods":[{"name":"getDefault","parameterTypes":["java.util.Locale$Category"] }, {"name":"setDefault","parameterTypes":["java.util.Locale$Category","java.util.Locale"] }] +}, +{ + "name":"java.util.Locale$Category" +}, +{ + "name":"java.util.Map" +}, +{ + "name":"java.util.Objects" +}, +{ + "name":"java.util.PropertyPermission", + "methods":[{"name":"","parameterTypes":["java.lang.String","java.lang.String"] }] +}, +{ + "name":"java.util.Random" +}, +{ + "name":"java.util.Set" +}, +{ + "name":"java.util.UUID" +}, +{ + "name":"java.util.concurrent.ForkJoinTask", + "fields":[{"name":"aux"}, {"name":"status"}] +}, +{ + "name":"java.util.concurrent.atomic.AtomicBoolean", + "fields":[{"name":"value"}] +}, +{ + "name":"java.util.concurrent.atomic.AtomicMarkableReference", + "fields":[{"name":"pair"}] +}, +{ + "name":"java.util.concurrent.atomic.AtomicReference", + "fields":[{"name":"value"}] +}, +{ + "name":"java.util.concurrent.atomic.Striped64", + "fields":[{"name":"base"}, {"name":"cellsBusy"}] +}, +{ + "name":"java.util.function.Function" +}, +{ + "name":"java.util.logging.LogManager", + "methods":[{"name":"getLoggingMXBean","parameterTypes":[] }] +}, +{ + "name":"java.util.logging.Logger" +}, +{ + "name":"org.slf4j.Logger", + "methods": [{"name":"getLogger", "parameterTypes":["java.lang.Class"]}] +}, +{"name": "ch.qos.logback.core.status.InfoStatus"}, +{ + "name":"[Lakka.actor.LightArrayRevolverScheduler$TaskQueue;" +}, +{ + "name":"akka.event.DefaultLoggingFilter", + "methods":[{"name":"","parameterTypes":["akka.actor.ActorSystem$Settings", "akka.event.EventStream"] }] +}, +{ + "name":"akka.actor.ActorCell", + "fields":[{"name":"akka$actor$dungeon$Children$$_childrenRefsDoNotCallMeDirectly"}, {"name":"akka$actor$dungeon$Children$$_functionRefsDoNotCallMeDirectly"}, {"name":"akka$actor$dungeon$Children$$_nextNameDoNotCallMeDirectly"}, {"name":"akka$actor$dungeon$Dispatch$$_mailboxDoNotCallMeDirectly"}] +}, +{ + "name":"akka.actor.DefaultSupervisorStrategy", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"akka.actor.LightArrayRevolverScheduler", + "methods":[{"name":"","parameterTypes":["com.typesafe.config.Config","akka.event.LoggingAdapter","java.util.concurrent.ThreadFactory"] }] +}, +{ + "name":"akka.actor.LightArrayRevolverScheduler$TaskHolder", + "fields":[{"name":"task"}] +}, +{ + "name":"akka.actor.LocalActorRefProvider", + "methods":[{"name":"","parameterTypes":["java.lang.String","akka.actor.ActorSystem$Settings","akka.event.EventStream","akka.actor.DynamicAccess"] }] +}, +{ + "name":"akka.actor.LocalActorRefProvider$Guardian", + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":["akka.actor.SupervisorStrategy"] }] +}, +{ + "name":"akka.actor.LocalActorRefProvider$SystemGuardian", + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":["akka.actor.SupervisorStrategy","akka.actor.ActorRef"] }] +}, +{ + "name":"akka.actor.Props$EmptyActor", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"akka.actor.RepointableActorRef", + "fields":[{"name":"_cellDoNotCallMeDirectly"}, {"name":"_lookupDoNotCallMeDirectly"}] +}, +{ + "name":"akka.dispatch.AbstractNodeQueue", + "fields":[{"name":"_tailDoNotCallMeDirectly"}] +}, +{ + "name":"akka.dispatch.AbstractNodeQueue$Node", + "fields":[{"name":"_nextDoNotCallMeDirectly"}] +}, +{ + "name":"akka.dispatch.BoundedControlAwareMessageQueueSemantics" +}, +{ + "name":"akka.dispatch.BoundedDequeBasedMessageQueueSemantics" +}, +{ + "name":"akka.dispatch.BoundedMessageQueueSemantics" +}, +{ + "name":"akka.dispatch.ControlAwareMessageQueueSemantics" +}, +{ + "name":"akka.dispatch.DequeBasedMessageQueueSemantics" +}, +{ + "name":"akka.dispatch.Dispatcher", + "fields":[{"name":"executorServiceDelegate"}] +}, +{ + "name":"akka.dispatch.Mailbox", + "fields":[{"name":"_statusDoNotCallMeDirectly"}, {"name":"_systemQueueDoNotCallMeDirectly"}] +}, +{ + "name":"akka.dispatch.MessageDispatcher", + "fields":[{"name":"_inhabitantsDoNotCallMeDirectly"}, {"name":"_shutdownScheduleDoNotCallMeDirectly"}] +}, +{ + "name":"akka.dispatch.MultipleConsumerSemantics" +}, +{ + "name":"akka.dispatch.UnboundedControlAwareMessageQueueSemantics" +}, +{ + "name":"akka.dispatch.UnboundedDequeBasedMailbox", + "methods":[{"name":"","parameterTypes":["akka.actor.ActorSystem$Settings","com.typesafe.config.Config"] }] +}, +{ + "name":"akka.dispatch.UnboundedDequeBasedMessageQueueSemantics" +}, +{ + "name":"akka.dispatch.UnboundedMailbox", + "methods":[{"name":"","parameterTypes":["akka.actor.ActorSystem$Settings","com.typesafe.config.Config"] }] +}, +{ + "name":"akka.dispatch.UnboundedMessageQueueSemantics" +}, +{ + "name":"akka.event.DeadLetterListener", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name": "akka.event.DefaultLoggingFilter", + "methods": [{"name":"", "parameterTypes": ["akka.actor.ActorSystem$Settings", "akka.event.EventStream"]}] +}, +{ + "name":"akka.event.EventStreamUnsubscriber", + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":["akka.event.EventStream","boolean"] }] +}, +{ + "name":"akka.event.LoggerMailboxType", + "methods":[{"name":"","parameterTypes":["akka.actor.ActorSystem$Settings","com.typesafe.config.Config"] }] +}, +{ + "name":"akka.event.LoggerMessageQueueSemantics" +}, +{ + "name":"akka.event.slf4j.Slf4jLogger", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"akka.event.slf4j.Slf4jLoggingFilter", + "methods":[{"name":"","parameterTypes":["akka.actor.ActorSystem$Settings","akka.event.EventStream"] }] +}, +{ + "name":"akka.http.DefaultParsingErrorHandler$", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"akka.http.impl.engine.client.PoolMasterActor", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"akka.io.SelectionHandler", + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":["akka.io.SelectionHandlerSettings"] }] +}, +{ + "name":"akka.io.TcpIncomingConnection", + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":["akka.io.TcpExt","java.nio.channels.SocketChannel","akka.io.ChannelRegistry","akka.actor.ActorRef","scala.collection.immutable.Iterable","boolean"] }] +}, +{ + "name":"akka.io.TcpListener", + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":["akka.actor.ActorRef","akka.io.TcpExt","akka.io.ChannelRegistry","akka.actor.ActorRef","akka.io.Tcp$Bind"] }] +}, +{ + "name":"akka.io.TcpManager", + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":["akka.io.TcpExt"] }] +}, +{ + "name":"akka.pattern.PromiseActorRef", + "fields":[{"name":"_stateDoNotCallMeDirectly"}, {"name":"_watchedByDoNotCallMeDirectly"}] +}, +{ + "name":"akka.routing.ConsistentHashingPool", + "methods":[{"name":"","parameterTypes":["com.typesafe.config.Config"] }] +}, +{ + "name":"akka.routing.RoundRobinPool", + "methods":[{"name":"","parameterTypes":["com.typesafe.config.Config"] }] +}, +{ + "name":"akka.routing.RoutedActorCell$RouterActorCreator", + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":["akka.routing.RouterConfig"] }] +}, +{ + "name":"akka.stream.SystemMaterializer$", + "fields":[{"name":"MODULE$"}] +}, +{ + "name":"java.util.logging.LoggingMXBean", + "queryAllPublicMethods":true +}, +{ + "name":"java.util.regex.Pattern" +}, +{ + "name":"javax.management.MBeanOperationInfo", + "queryAllPublicMethods":true, + "methods":[{"name":"getSignature","parameterTypes":[] }] +}, +{ + "name":"javax.management.MBeanServerBuilder", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"javax.management.ObjectName" +}, +{ + "name":"javax.management.StandardEmitterMBean", + "methods":[{"name":"cacheMBeanInfo","parameterTypes":["javax.management.MBeanInfo"] }, {"name":"getCachedMBeanInfo","parameterTypes":[] }, {"name":"getMBeanInfo","parameterTypes":[] }] +}, +{ + "name":"javax.management.openmbean.CompositeData" +}, +{ + "name":"javax.management.openmbean.OpenMBeanOperationInfoSupport" +}, +{ + "name":"javax.management.openmbean.TabularData" +}, +{ + "name":"javax.net.ssl.KeyManager[]" +}, +{ + "name":"javax.net.ssl.SSLContext" +}, +{ + "name":"javax.net.ssl.TrustManagerFactory" +}, +{ + "name":"javax.net.ssl.TrustManager[]" +}, +{ + "name":"javax.security.auth.x500.X500Principal", + "fields":[{"name":"thisX500Name"}], + "methods":[{"name":"","parameterTypes":["sun.security.x509.X500Name"] }] +}, +{ + "name":"javax.smartcardio.CardPermission" +}, +{ + "name":"javax.xml.parsers.DocumentBuilder" +}, +{ + "name":"javax.xml.parsers.DocumentBuilderFactory" +}, +{ + "name":"javax.xml.xpath.XPath" +}, +{ + "name":"javax.xml.xpath.XPathConstants" +}, +{ + "name":"javax.xml.xpath.XPathFactory" +}, +{ + "name":"jdk.internal.misc.Unsafe" +}, +{ + "name":"jdk.management.jfr.ConfigurationInfo", + "queryAllPublicMethods":true +}, +{ + "name":"jdk.management.jfr.EventTypeInfo", + "queryAllPublicMethods":true +}, +{ + "name":"jdk.management.jfr.FlightRecorderMXBean", + "queryAllPublicMethods":true +}, +{ + "name":"jdk.management.jfr.FlightRecorderMXBeanImpl", + "queryAllPublicConstructors":true, + "methods":[{"name":"cacheMBeanInfo","parameterTypes":["javax.management.MBeanInfo"] }, {"name":"getCachedMBeanInfo","parameterTypes":[] }, {"name":"getMBeanInfo","parameterTypes":[] }, {"name":"getNotificationInfo","parameterTypes":[] }] +}, +{ + "name":"jdk.management.jfr.RecordingInfo", + "queryAllPublicMethods":true +}, +{ + "name":"jdk.management.jfr.SettingDescriptorInfo", + "queryAllPublicMethods":true +}, +{ + "name":"org.apache.commons.compress.archivers.zip.AsiExtraField", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.apache.commons.compress.archivers.zip.JarMarker", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.apache.commons.compress.archivers.zip.ResourceAlignmentExtraField", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.apache.commons.compress.archivers.zip.UnicodeCommentExtraField", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.apache.commons.compress.archivers.zip.UnicodePathExtraField", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.apache.commons.compress.archivers.zip.X000A_NTFS", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.apache.commons.compress.archivers.zip.X0014_X509Certificates", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.apache.commons.compress.archivers.zip.X0015_CertificateIdForFile", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.apache.commons.compress.archivers.zip.X0016_CertificateIdForCentralDirectory", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.apache.commons.compress.archivers.zip.X0017_StrongEncryptionHeader", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.apache.commons.compress.archivers.zip.X0019_EncryptionRecipientCertificateList", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.apache.commons.compress.archivers.zip.X5455_ExtendedTimestamp", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.apache.commons.compress.archivers.zip.X7875_NewUnix", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.apache.commons.compress.archivers.zip.Zip64ExtendedInformationExtraField", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.apache.poi.UnsupportedFileFormatException" +}, +{ + "name":"org.apache.poi.poifs.filesystem.NotOLE2FileException" +}, +{ + "name":"org.apache.poi.ss.usermodel.Workbook" +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.COMPOSITE$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.DH$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.DSA$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.DSTU4145$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.Dilithium$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.EC$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.ECGOST$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.EXTERNAL$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.EdEC$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.ElGamal$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.Falcon$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.GM$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.GOST$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.IES$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.LMS$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.NTRU$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.RSA$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.SPHINCSPlus$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.X509$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.Blake2b$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.Blake2s$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.Blake3$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.DSTU7564$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.GOST3411$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.Haraka$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.Keccak$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.MD2$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.MD4$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.MD5$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.RIPEMD128$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.RIPEMD160$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.RIPEMD256$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.RIPEMD320$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.SHA1$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.SHA224$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.SHA256$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.SHA3$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.SHA384$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.SHA512$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.SM3$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.Skein$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.Tiger$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.Whirlpool$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.drbg.DRBG$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.keystore.BC$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.keystore.BCFKS$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.keystore.PKCS12$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.AES$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.ARC4$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.ARIA$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.Blowfish$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.CAST5$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.CAST6$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.Camellia$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.ChaCha$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.DES$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.DESede$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.DSTU7624$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.GOST28147$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.GOST3412_2015$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.Grain128$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.Grainv1$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.HC128$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.HC256$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.IDEA$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.Noekeon$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.OpenSSLPBKDF$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.PBEPBKDF1$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.PBEPBKDF2$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.PBEPKCS12$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.Poly1305$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.RC2$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.RC5$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.RC6$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.Rijndael$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.SCRYPT$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.SEED$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.SM4$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.Salsa20$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.Serpent$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.Shacal2$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.SipHash$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.SipHash128$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.Skipjack$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.TEA$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.TLSKDF$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.Threefish$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.Twofish$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.VMPC$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.VMPCKSA3$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.XSalsa20$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.XTEA$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.Zuc$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.pqc.jcajce.provider.BIKE$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.pqc.jcajce.provider.CMCE$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.pqc.jcajce.provider.Dilithium$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.pqc.jcajce.provider.Falcon$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.pqc.jcajce.provider.Frodo$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.pqc.jcajce.provider.HQC$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.pqc.jcajce.provider.Kyber$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.pqc.jcajce.provider.LMS$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.pqc.jcajce.provider.NH$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.pqc.jcajce.provider.NTRU$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.pqc.jcajce.provider.NTRUPrime$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.pqc.jcajce.provider.Picnic$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.pqc.jcajce.provider.Rainbow$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.pqc.jcajce.provider.SABER$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.pqc.jcajce.provider.SPHINCS$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.pqc.jcajce.provider.SPHINCSPlus$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.pqc.jcajce.provider.XMSS$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.base.Array_Utils" +}, +{ + "name":"org.enso.base.CompareException" +}, +{ + "name":"org.enso.base.DryRunFileManager" +}, +{ + "name":"org.enso.base.Encoding_Utils" +}, +{ + "name":"org.enso.base.Environment_Utils" +}, +{ + "name":"org.enso.base.FileLineReader" +}, +{ + "name":"org.enso.base.ObjectComparator" +}, +{ + "name":"org.enso.base.Regex_Utils" +}, +{ + "name":"org.enso.base.Stream_Utils" +}, +{ + "name":"org.enso.base.Stream_Utils$InputStreamLike" +}, +{ + "name":"org.enso.base.Stream_Utils$OutputStreamLike" +}, +{ + "name":"org.enso.base.Stream_Utils.InputStreamLike" +}, +{ + "name":"org.enso.base.Stream_Utils.OutputStreamLike" +}, +{ + "name":"org.enso.base.Text_Utils" +}, +{ + "name":"org.enso.base.Time_Utils" +}, +{ + "name":"org.enso.base.Time_Utils$AdjustOp" +}, +{ + "name":"org.enso.base.Time_Utils.AdjustOp" +}, +{ + "name":"org.enso.base.WithProblems" +}, +{ + "name":"org.enso.base.XML_Utils" +}, +{ + "name":"org.enso.base.arrays.LongArrayList" +}, +{ + "name":"org.enso.base.encoding.DecodingProblem" +}, +{ + "name":"org.enso.base.encoding.DecodingProblemAggregator" +}, +{ + "name":"org.enso.base.encoding.Encoding_Utils" +}, +{ + "name":"org.enso.base.encoding.NewlineDetector" +}, +{ + "name":"org.enso.base.encoding.ReportingStreamDecoder" +}, +{ + "name":"org.enso.base.encoding.ReportingStreamEncoder" +}, +{ + "name":"org.enso.base.enso_cloud.AuthenticationProvider" +}, +{ + "name":"org.enso.base.enso_cloud.CacheSettings" +}, +{ + "name":"org.enso.base.enso_cloud.CloudAPI" +}, +{ + "name":"org.enso.base.enso_cloud.CloudRequestCache" +}, +{ + "name":"org.enso.base.enso_cloud.DataLinkSPI" +}, +{ + "name":"org.enso.base.enso_cloud.EnsoSecretAccessDenied" +}, +{ + "name":"org.enso.base.enso_cloud.EnsoSecretHelper" +}, +{ + "name":"org.enso.base.enso_cloud.ExternalLibrarySecretHelper" +}, +{ + "name":"org.enso.base.enso_cloud.HideableValue" +}, +{ + "name":"org.enso.base.enso_cloud.HideableValue$Base64EncodeValue" +}, +{ + "name":"org.enso.base.enso_cloud.HideableValue$ConcatValues" +}, +{ + "name":"org.enso.base.enso_cloud.HideableValue$PlainValue" +}, +{ + "name":"org.enso.base.enso_cloud.HideableValue$SecretValue" +}, +{ + "name":"org.enso.base.enso_cloud.HideableValue.Base64EncodeValue" +}, +{ + "name":"org.enso.base.enso_cloud.HideableValue.ConcatValues" +}, +{ + "name":"org.enso.base.enso_cloud.HideableValue.PlainValue" +}, +{ + "name":"org.enso.base.enso_cloud.HideableValue.SecretValue" +}, +{ + "name":"org.enso.base.enso_cloud.audit.AuditLog" +}, +{ + "name":"org.enso.base.file_format.FileFormatSPI" +}, +{ + "name":"org.enso.base.file_system.FileSystemSPI" +}, +{ + "name":"org.enso.base.file_system.File_Utils" +}, +{ + "name":"org.enso.base.net.URITransformer" +}, +{ + "name":"org.enso.base.net.URIWithSecrets" +}, +{ + "name":"org.enso.base.net.http.MultipartBodyBuilder" +}, +{ + "name":"org.enso.base.net.http.UrlencodedBodyBuilder" +}, +{ + "name":"org.enso.base.numeric.ConversionResult" +}, +{ + "name":"org.enso.base.numeric.Decimal_Utils" +}, +{ + "name":"org.enso.base.polyglot.NumericConverter" +}, +{ + "name":"org.enso.base.polyglot.WrappedDataflowError" +}, +{ + "name":"org.enso.base.random.RandomInstanceHolder" +}, +{ + "name":"org.enso.base.random.Random_Utils" +}, +{ + "name":"org.enso.base.statistics.CorrelationStatistics" +}, +{ + "name":"org.enso.base.statistics.FitError" +}, +{ + "name":"org.enso.base.statistics.LinearModel" +}, +{ + "name":"org.enso.base.statistics.Moments" +}, +{ + "name":"org.enso.base.statistics.Rank" +}, +{ + "name":"org.enso.base.statistics.Rank$Method" +}, +{ + "name":"org.enso.base.statistics.Rank.Method" +}, +{ + "name":"org.enso.base.statistics.Regression" +}, +{ + "name":"org.enso.base.statistics.Statistic" +}, +{ + "name":"org.enso.base.text.CaseFoldedString" +}, +{ + "name":"org.enso.base.text.GraphemeSpan" +}, +{ + "name":"org.enso.base.text.Replacer_Cache" +}, +{ + "name":"org.enso.base.text.ResultWithWarnings" +}, +{ + "name":"org.enso.base.text.TextFoldingStrategy" +}, +{ + "name":"org.enso.base.text.Utf16Span" +}, +{ + "name":"org.enso.base.time.CustomTemporalUnits" +}, +{ + "name":"org.enso.base.time.Date_Period_Utils" +}, +{ + "name":"org.enso.base.time.Date_Time_Utils" +}, +{ + "name":"org.enso.base.time.Date_Utils" +}, +{ + "name":"org.enso.base.time.EnsoDateTimeFormatter" +}, +{ + "name":"org.enso.base.time.FormatterCache" +}, +{ + "name":"org.enso.base.time.FormatterCacheKey" +}, +{ + "name":"org.enso.base.time.FormatterKind" +}, +{ + "name":"org.enso.base.time.Time_Of_Day_Utils" +}, +{ + "name":"org.enso.base_test_helpers.CallbackHelper", + "methods":[{"name":"runCallbackInt","parameterTypes":["java.util.function.Function","int"] }] +}, +{ + "name":"org.enso.base_test_helpers.FileSystemHelper", + "methods":[{"name":"setWritable","parameterTypes":["java.lang.String","boolean"] }] +}, +{ + "name":"org.enso.base_test_helpers.IntHolder", + "methods":[{"name":"","parameterTypes":["int"] }], + "fields":[{"name":"value"}, {"name":"boxed"}] +}, +{ + "name":"org.enso.base_test_helpers.IntHolderEquals", + "methods":[{"name":"","parameterTypes":["int"] }] +}, +{ + "name":"org.enso.base_test_helpers.Number_Utils", + "methods":[{"name":"floatId","parameterTypes":["java.lang.Double"] }] +}, +{ + "name":"org.enso.base_test_helpers.RangeStream", + "methods":[{"name":"","parameterTypes":["int", "int"] }] +}, +{ + "name":"org.enso.database.DatabaseConnectionDetailsSPI" +}, +{ + "name":"org.enso.database.JDBCProxy" +}, +{ + "name":"org.enso.database.JDBCUtils" +}, +{ + "name":"org.enso.database.dryrun.HiddenTableReferenceCounter" +}, +{ + "name":"org.enso.database.dryrun.OperationSynchronizer" +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.Any", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.Boolean", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.CreateProcessSystemMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.EmptyMapMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.Error", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.ExitSystemMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.Is_normalizedTextMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.Is_unixSystemMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.LengthTextMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.Map", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.NanoTimeSystemMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.Nothing", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.OsSystemMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.Polyglot", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.bool.AndMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.bool.IfThenElseMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.bool.IfThenMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.bool.NotMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.bool.OrMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.BetweenBuiltinDurationMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.Date", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.DateDateTimeMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.DateTime", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.DayDateMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.DayDateTimeMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.Duration", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.EpochStartDateTimeMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.HourDateTimeMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.HourTimeOfDayMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.HoursDurationMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.MicrosecondDateTimeMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.MicrosecondTimeOfDayMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.MillisecondDateTimeMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.MillisecondTimeOfDayMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.MillisecondsDurationMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.MinusBuiltinDateTimeMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.MinusBuiltinDurationMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.MinusBuiltinTimeOfDayMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.MinuteDateTimeMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.MinuteTimeOfDayMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.MinutesDurationMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.MonthDateMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.MonthDateTimeMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.NanosecondBuiltinDateTimeMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.NanosecondBuiltinTimeOfDayMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.NanosecondsDurationMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.NewBuiltinDateMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.NewBuiltinDateTimeMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.NewBuiltinDurationMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.NewBuiltinTimeOfDayMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.NewBuiltinTimeZoneMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.NowDateTimeMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.NowTimeOfDayMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.OffsetTimeZoneMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.ParseBuiltinTimeZoneMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.PlusBuiltinDateTimeMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.PlusBuiltinDurationMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.PlusBuiltinTimeOfDayMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.SecondDateTimeMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.SecondTimeOfDayMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.SecondsDurationMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.SystemTimeZoneMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.TimeOfDay", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.TimeOfDayDateTimeMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.TimeZone", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.ToSecondsTimeOfDayMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.ToTextDateTimeMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.ToTextTimeOfDayMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.TodayDateMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.TotalMillisecondsBuiltinDurationMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.YearDateMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.YearDateTimeMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.ZoneDateTimeMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.date.ZoneIdTimeZoneMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.debug.Debug", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.ArithmeticError", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.ArityError", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.AssertionError", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.AttachWithStacktraceWarningMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.CatchAnyMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.CatchErrorMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.CatchPanicMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.CaughtPanic", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.CaughtPanicConvertToDataflowErrorMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.CompileError", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.CreateWarningMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.ErrorToTextMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.ForbiddenOperation", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.GetAllArrayWarningMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.GetAllVectorWarningMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.GetAttachedStackTraceMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.GetReassignmentsWarningMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.IncomparableValues", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.IndexOutOfBounds", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.InexhaustivePatternMatch", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.InvalidArrayIndex", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.InvalidConversionTarget", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.LimitReachedWarningMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.MapError", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.ModuleDoesNotExist", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.ModuleNotInPackageError", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.NoConversionCurrying", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.NoSuchConversion", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.NoSuchField", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.NoSuchMethod", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.NotInvokable", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.NumberParseError", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.OriginWarningMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.Panic", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.PrivateAccess", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.SetArrayWarningMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.SyntaxError", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.ThrowErrorMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.ThrowPanicMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.TypeError", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.Unimplemented", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.UninitializedState", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.UnsupportedArgumentTypes", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.ValueWarningMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.Warning", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.error.displaytext.InvalidConversionTargetToDisplayTextMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.function.ApplicationOperatorMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.function.Function", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.immutable.ArrayLikeHelpers", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.immutable.AtVectorMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.immutable.FlattenVectorMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.immutable.FromArrayBuiltinVectorMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.immutable.FromPolyglotArrayBuiltinVectorMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.immutable.InsertBuiltinVectorMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.immutable.LengthVectorMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.immutable.NewArrayProxyBuiltinArrayLikeHelpersMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.immutable.NewVectorBuilderArrayLikeHelpersMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.immutable.RemoveAtVectorMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.immutable.SliceArrayVectorMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.immutable.Vector", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.immutable.VectorFromFunctionArrayLikeHelpersMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.immutable.VectorToArrayArrayLikeHelpersMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.interop.generic.ExecuteMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.interop.generic.GetExecutableNameMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.interop.generic.GetMemberMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.interop.generic.GetMembersMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.interop.generic.GetSourceLocationMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.interop.generic.HasSourceLocationMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.interop.generic.InstantiateMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.interop.generic.InvokeMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.interop.generic.IsLanguageInstalledMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.io.AbsoluteFileMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.io.CopyBuiltinFileMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.io.CreateDirectoryBuiltinFileMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.io.DeleteBuiltinFileMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.io.ExistsFileMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.io.File", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.io.GetCwdFileMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.io.GetFileFileMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.io.InputStreamBuiltinFileMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.io.IsDirectoryFileMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.io.IsWritableFileMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.io.ListImmediateChildrenArrayFileMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.io.MoveBuiltinFileMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.io.NameFileMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.io.NormalizeFileMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.io.OutputStreamBuiltinFileMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.io.ParentFileMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.io.PathFileMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.io.PosixPermissionsBuiltinFileMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.io.PrintlnMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.io.ReadLastBytesBuiltinFileMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.io.RelativizeFileMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.io.ResolveFileMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.io.SizeBuiltinFileMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.io.StartsWithFileMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.AtomWithAHoleMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.CreateUnresolvedSymbolMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.EnsoProjectMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.EqualsMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.FindTypeByFqnMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.GetAnnotationMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.GetAtomConstructorMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.GetAtomFieldsMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.GetConstructorDeclaringTypeMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.GetConstructorFieldNamesMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.GetConstructorNameMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.GetPolyglotLanguageMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.GetQualifiedTypeNameMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.GetShortTypeNameMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.GetSimpleTypeNameMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.GetSourceLocationMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.GetTypeConstructorsMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.GetTypeMethodsMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.GetUnresolvedSymbolNameMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.GetUnresolvedSymbolScopeMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.HashCodeMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.InstrumentorBuiltinMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.IsAMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.IsAtomConstructorMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.IsAtomMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.IsErrorMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.IsPolyglotMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.IsSameObjectMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.IsTypeMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.IsUnresolvedSymbolMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.NewAtomInstanceMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.ProjectDescription", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.meta.TypeOfBuiltinMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.mutable.Array", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.mutable.GetRefMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.mutable.NewRefMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.mutable.PutRefMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.mutable.Ref", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.Float", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.Integer", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.Number", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.decimal.AbsMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.decimal.AddMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.decimal.CeilMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.decimal.DivideMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.decimal.FloorMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.decimal.GreaterMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.decimal.GreaterOrEqualMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.decimal.LessMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.decimal.LessOrEqualMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.decimal.ModMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.decimal.MultiplyMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.decimal.NegateMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.decimal.PowMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.decimal.RoundMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.decimal.SubtractMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.decimal.TruncateMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.integer.AbsMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.integer.AddMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.integer.BitAndMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.integer.BitNotMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.integer.BitOrMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.integer.BitShiftMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.integer.BitShiftRightMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.integer.BitXorMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.integer.CeilMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.integer.DivMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.integer.DivideMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.integer.FloorMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.integer.GreaterMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.integer.GreaterOrEqualMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.integer.LessMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.integer.LessOrEqualMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.integer.ModMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.integer.MultiplyMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.integer.NegateMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.integer.ParseIntegerMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.integer.PowMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.integer.RoundMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.integer.SubtractMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.number.integer.ToFloatMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.ordering.Comparable", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.ordering.DefaultComparator", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.ordering.LessThanMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.ordering.Ordering", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.ordering.SortArrayMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.ordering.SortVectorMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.resource.BracketMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.resource.FinalizeManagedResourceMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.resource.ManagedResource", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.resource.RegisterManagedResourceMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.resource.TakeManagedResourceMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.resource.WithMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.runtime.Context", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.runtime.ContextIsEnabledMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.runtime.GCMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.runtime.GetStackTraceMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.runtime.IsAssertionEnabledMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.runtime.NoInlineMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.runtime.NoInlineWithArgMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.runtime.RuntimeCurrentExecutionEnvironmentMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.runtime.RuntimeWithDisabledContextMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.runtime.RuntimeWithEnabledContextMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.state.GetStateMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.state.PutStateMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.state.RunStateMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.system.SystemProcessResult", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.text.AnyPrettyMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.text.AnyToDisplayTextMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.text.AnyToTextMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.text.ConcatMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.text.PrimTextHelper", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.text.RegexCompileMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.node.expression.builtin.text.Text", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.enso.interpreter.runtime.data.atom.StructsLibrary" +}, +{ + "name":"org.enso.interpreter.runtime.data.hash.HashMapContainsKeyMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.runtime.data.hash.HashMapGetMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.runtime.data.hash.HashMapInsertMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.runtime.data.hash.HashMapRemoveMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.runtime.data.hash.HashMapSizeMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.runtime.data.hash.HashMapToTextMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.runtime.data.hash.HashMapToVectorMethodGen", + "methods":[{"name":"makeFunction","parameterTypes":["org.enso.interpreter.EnsoLanguage","boolean"] }] +}, +{ + "name":"org.enso.interpreter.runtime.error.WarningsLibrary" +}, +{ + "name":"org.enso.interpreter.runtime.library.dispatch.TypesLibrary" +}, +{ + "name":"org.enso.polyglot.common_utils.Core_Math_Utils" +}, +{ + "name":"org.enso.runner.Main", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.enso.table.aggregations.Aggregator" +}, +{ + "name":"org.enso.table.aggregations.Concatenate" +}, +{ + "name":"org.enso.table.aggregations.Count" +}, +{ + "name":"org.enso.table.aggregations.CountDistinct" +}, +{ + "name":"org.enso.table.aggregations.CountEmpty" +}, +{ + "name":"org.enso.table.aggregations.CountNothing" +}, +{ + "name":"org.enso.table.aggregations.First" +}, +{ + "name":"org.enso.table.aggregations.GroupBy" +}, +{ + "name":"org.enso.table.aggregations.Last" +}, +{ + "name":"org.enso.table.aggregations.Mean" +}, +{ + "name":"org.enso.table.aggregations.MinOrMax" +}, +{ + "name":"org.enso.table.aggregations.Mode" +}, +{ + "name":"org.enso.table.aggregations.Percentile" +}, +{ + "name":"org.enso.table.aggregations.ShortestOrLongest" +}, +{ + "name":"org.enso.table.aggregations.StandardDeviation" +}, +{ + "name":"org.enso.table.aggregations.Sum" +}, +{ + "name":"org.enso.table.data.column.builder.BigIntegerBuilder" +}, +{ + "name":"org.enso.table.data.column.builder.BoolBuilder" +}, +{ + "name":"org.enso.table.data.column.builder.Builder" +}, +{ + "name":"org.enso.table.data.column.builder.DateBuilder" +}, +{ + "name":"org.enso.table.data.column.builder.DateTimeBuilder" +}, +{ + "name":"org.enso.table.data.column.builder.InferredBuilder" +}, +{ + "name":"org.enso.table.data.column.builder.LossOfBigDecimalPrecision" +}, +{ + "name":"org.enso.table.data.column.builder.LossOfIntegerPrecision" +}, +{ + "name":"org.enso.table.data.column.builder.NumericBuilder" +}, +{ + "name":"org.enso.table.data.column.builder.StringBuilder" +}, +{ + "name":"org.enso.table.data.column.builder.TimeOfDayBuilder" +}, +{ + "name":"org.enso.table.data.column.operation.CountNothing" +}, +{ + "name":"org.enso.table.data.column.operation.UnaryOperation" +}, +{ + "name":"org.enso.table.data.column.operation.cast.CastProblemAggregator" +}, +{ + "name":"org.enso.table.data.column.operation.cast.ConversionFailure" +}, +{ + "name":"org.enso.table.data.column.operation.cast.ConversionFailureType" +}, +{ + "name":"org.enso.table.data.column.operation.map.MapOperationProblemAggregator" +}, +{ + "name":"org.enso.table.data.column.operation.unary.DatePartOperation" +}, +{ + "name":"org.enso.table.data.column.operation.unary.IsEmptyOperation" +}, +{ + "name":"org.enso.table.data.column.operation.unary.IsInfiniteOperation" +}, +{ + "name":"org.enso.table.data.column.operation.unary.IsNaNOperation" +}, +{ + "name":"org.enso.table.data.column.operation.unary.IsNothingOperation" +}, +{ + "name":"org.enso.table.data.column.operation.unary.NotOperation" +}, +{ + "name":"org.enso.table.data.column.operation.unary.TextLengthOperation" +}, +{ + "name":"org.enso.table.data.column.operation.unary.TruncatedTimePartOperation" +}, +{ + "name":"org.enso.table.data.column.operation.unary.UnaryRoundOperation" +}, +{ + "name":"org.enso.table.data.column.storage.Storage" +}, +{ + "name":"org.enso.table.data.column.storage.numeric.LongRangeStorage" +}, +{ + "name":"org.enso.table.data.column.storage.type.AnyObjectType" +}, +{ + "name":"org.enso.table.data.column.storage.type.BigDecimalType" +}, +{ + "name":"org.enso.table.data.column.storage.type.BigIntegerType" +}, +{ + "name":"org.enso.table.data.column.storage.type.Bits" +}, +{ + "name":"org.enso.table.data.column.storage.type.BooleanType" +}, +{ + "name":"org.enso.table.data.column.storage.type.DateTimeType" +}, +{ + "name":"org.enso.table.data.column.storage.type.DateType" +}, +{ + "name":"org.enso.table.data.column.storage.type.FloatType" +}, +{ + "name":"org.enso.table.data.column.storage.type.IntegerType" +}, +{ + "name":"org.enso.table.data.column.storage.type.StorageType" +}, +{ + "name":"org.enso.table.data.column.storage.type.TextType" +}, +{ + "name":"org.enso.table.data.column.storage.type.TimeOfDayType" +}, +{ + "name":"org.enso.table.data.index.MultiValueIndex" +}, +{ + "name":"org.enso.table.data.mask.OrderMask" +}, +{ + "name":"org.enso.table.data.table.Column" +}, +{ + "name":"org.enso.table.data.table.Table" +}, +{ + "name":"org.enso.table.data.table.TableToXml" +}, +{ + "name":"org.enso.table.data.table.join.JoinKind" +}, +{ + "name":"org.enso.table.data.table.join.conditions.Between" +}, +{ + "name":"org.enso.table.data.table.join.conditions.Equals" +}, +{ + "name":"org.enso.table.data.table.join.conditions.EqualsIgnoreCase" +}, +{ + "name":"org.enso.table.data.table.join.lookup.LookupColumnDescription" +}, +{ + "name":"org.enso.table.data.table.join.lookup.LookupJoin" +}, +{ + "name":"org.enso.table.data.table.problems.ArithmeticError" +}, +{ + "name":"org.enso.table.data.table.problems.ArithmeticOverflow" +}, +{ + "name":"org.enso.table.data.table.problems.FloatingPointGrouping" +}, +{ + "name":"org.enso.table.data.table.problems.IgnoredNaN" +}, +{ + "name":"org.enso.table.data.table.problems.IgnoredNothing" +}, +{ + "name":"org.enso.table.data.table.problems.IllegalArgumentError" +}, +{ + "name":"org.enso.table.data.table.problems.InvalidAggregation" +}, +{ + "name":"org.enso.table.data.table.problems.UnquotedCharactersInOutput" +}, +{ + "name":"org.enso.table.data.table.problems.UnquotedDelimiter" +}, +{ + "name":"org.enso.table.error.ColumnCountMismatchException" +}, +{ + "name":"org.enso.table.error.ColumnNameMismatchException" +}, +{ + "name":"org.enso.table.error.EmptyFileException" +}, +{ + "name":"org.enso.table.error.EmptySheetException" +}, +{ + "name":"org.enso.table.error.ExistingDataException" +}, +{ + "name":"org.enso.table.error.InvalidColumnNameException" +}, +{ + "name":"org.enso.table.error.InvalidLocationException" +}, +{ + "name":"org.enso.table.error.NonUniqueLookupKey" +}, +{ + "name":"org.enso.table.error.NullValuesInKeyColumns" +}, +{ + "name":"org.enso.table.error.RangeExceededException" +}, +{ + "name":"org.enso.table.error.TooManyColumnsException" +}, +{ + "name":"org.enso.table.error.UnmatchedRow" +}, +{ + "name":"org.enso.table.error.ValueTypeMismatchException" +}, +{ + "name":"org.enso.table.excel.ExcelConnectionPool" +}, +{ + "name":"org.enso.table.excel.ExcelFileFormat" +}, +{ + "name":"org.enso.table.excel.ExcelHeaders" +}, +{ + "name":"org.enso.table.excel.ExcelRange" +}, +{ + "name":"org.enso.table.excel.ReadOnlyExcelConnection" +}, +{ + "name":"org.enso.table.expressions.ExpressionVisitorImpl" +}, +{ + "name":"org.enso.table.formatting.AnyObjectFormatter" +}, +{ + "name":"org.enso.table.formatting.BooleanFormatter" +}, +{ + "name":"org.enso.table.formatting.DateFormatter" +}, +{ + "name":"org.enso.table.formatting.DateTimeFormatter" +}, +{ + "name":"org.enso.table.formatting.DecimalFormatter" +}, +{ + "name":"org.enso.table.formatting.IntegerFormatter" +}, +{ + "name":"org.enso.table.formatting.TextFormatter" +}, +{ + "name":"org.enso.table.formatting.TimeFormatter" +}, +{ + "name":"org.enso.table.operations.AddRowNumber" +}, +{ + "name":"org.enso.table.operations.AddRunning" +}, +{ + "name":"org.enso.table.operations.OrderBuilder" +}, +{ + "name":"org.enso.table.parsing.BooleanParser" +}, +{ + "name":"org.enso.table.parsing.DateParser" +}, +{ + "name":"org.enso.table.parsing.DateTimeParser" +}, +{ + "name":"org.enso.table.parsing.IdentityParser" +}, +{ + "name":"org.enso.table.parsing.NumberParser" +}, +{ + "name":"org.enso.table.parsing.TimeOfDayParser" +}, +{ + "name":"org.enso.table.parsing.TypeInferringParser" +}, +{ + "name":"org.enso.table.parsing.WhitespaceStrippingParser" +}, +{ + "name":"org.enso.table.parsing.problems.AdditionalInvalidRows" +}, +{ + "name":"org.enso.table.parsing.problems.InvalidFormat" +}, +{ + "name":"org.enso.table.parsing.problems.InvalidRow" +}, +{ + "name":"org.enso.table.parsing.problems.MismatchedQuote" +}, +{ + "name":"org.enso.table.parsing.problems.ParseProblemAggregator" +}, +{ + "name":"org.enso.table.problems.ProblemAggregator" +}, +{ + "name":"org.enso.table.read.DelimitedReader" +}, +{ + "name":"org.enso.table.read.ExcelReader" +}, +{ + "name":"org.enso.table.read.ParsingFailedException" +}, +{ + "name":"org.enso.table.read.QuoteStrippingParser" +}, +{ + "name":"org.enso.table.util.ColumnMapper" +}, +{ + "name":"org.enso.table.util.NameDeduplicator" +}, +{ + "name":"org.enso.table.util.problems.DuplicateNames" +}, +{ + "name":"org.enso.table.util.problems.InvalidNames" +}, +{ + "name":"org.enso.table.write.DelimitedWriter" +}, +{ + "name":"org.enso.table.write.ExcelWriter" +}, +{ + "name":"org.enso.table.write.ExistingDataMode" +}, +{ + "name":"org.enso.table.write.ExistingFileBehavior" +}, +{ + "name":"org.enso.table.write.WriteQuoteBehavior" +}, +{ + "name":"org.graalvm.collections.Pair" +}, +{ + "name":"org.graalvm.polyglot.io.IOHelper", + "fields":[{"name":"ACCESS"}] +}, +{ + "name":"org.graalvm.polyglot.management.Management", + "fields":[{"name":"ACCESS"}] +}, +{ + "name":"org.jline.terminal.impl.exec.ExecTerminalProvider", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.jline.terminal.impl.jansi.JansiTerminalProvider", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.jline.terminal.impl.jna.JnaTerminalProvider", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.jline.terminal.impl.jna.linux.CLibrary$termios", + "allDeclaredFields":true +}, +{ + "name":"org.jline.terminal.impl.jna.linux.CLibrary$winsize", + "allDeclaredFields":true +}, +{ + "name":"org.jline.terminal.impl.jna.osx.CLibrary$termios", + "allDeclaredFields":true +}, +{ + "name":"org.jline.terminal.impl.jna.osx.CLibrary$winsize", + "allDeclaredFields":true +}, +{ + "name":"org.jline.terminal.impl.jna.windows.CLibrary$termios", + "allDeclaredFields":true +}, +{ + "name":"org.jline.terminal.impl.jna.windows.CLibrary$winsize", + "allDeclaredFields":true +}, +{ + "name":"org.openide.util.RequestProcessor" +}, +{ + "name":"org.sqlite.SQLiteErrorCode" +}, +{ + "name":"org.sqlite.SQLiteException" +}, +{ + "name":"org.w3c.dom.Attr" +}, +{ + "name":"org.w3c.dom.Document" +}, +{ + "name":"org.w3c.dom.Element" +}, +{ + "name":"org.w3c.dom.NamedNodeMap" +}, +{ + "name":"org.w3c.dom.Node" +}, +{ + "name":"org.w3c.dom.NodeList" +}, +{ + "name":"org.w3c.dom.Text" +}, +{ + "name":"org.xml.sax.InputSource" +}, +{ + "name":"org.xml.sax.SAXException" +}, +{ + "name":"org.xml.sax.SAXParseException" +}, +{ + "name":"scala.collection.concurrent.CNodeBase", + "fields":[{"name":"csize"}] +}, +{ + "name":"scala.collection.concurrent.INodeBase", + "fields":[{"name":"mainnode"}] +}, +{ + "name":"scala.collection.concurrent.MainNode", + "fields":[{"name":"prev"}] +}, +{ + "name":"scala.collection.concurrent.TrieMap", + "fields":[{"name":"root"}] +}, +{ + "name":"sun.management.ClassLoadingImpl", + "queryAllPublicConstructors":true +}, +{ + "name":"sun.management.CompilationImpl", + "queryAllPublicConstructors":true +}, +{ + "name":"sun.management.ManagementFactoryHelper$1", + "queryAllPublicConstructors":true +}, +{ + "name":"sun.management.ManagementFactoryHelper$PlatformLoggingImpl", + "queryAllPublicConstructors":true +}, +{ + "name":"sun.management.MemoryImpl", + "queryAllPublicConstructors":true +}, +{ + "name":"sun.management.MemoryManagerImpl", + "queryAllPublicConstructors":true +}, +{ + "name":"sun.management.MemoryPoolImpl", + "queryAllPublicConstructors":true +}, +{ + "name":"sun.management.RuntimeImpl", + "queryAllPublicConstructors":true +}, +{ + "name":"sun.security.pkcs12.PKCS12KeyStore", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.pkcs12.PKCS12KeyStore$DualFormatPKCS12", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.provider.DSA$SHA224withDSA", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.provider.DSA$SHA256withDSA", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.provider.JavaKeyStore$DualFormatJKS", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.provider.JavaKeyStore$JKS", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.provider.NativePRNG", + "methods":[{"name":"","parameterTypes":[] }, {"name":"","parameterTypes":["java.security.SecureRandomParameters"] }] +}, +{ + "name":"sun.security.provider.NativePRNG$NonBlocking", + "methods":[{"name":"","parameterTypes":[] }, {"name":"","parameterTypes":["java.security.SecureRandomParameters"] }] +}, +{ + "name":"sun.security.provider.SHA", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.provider.SHA2$SHA224", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.provider.SHA2$SHA256", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.provider.SHA5$SHA384", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.provider.SHA5$SHA512", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.provider.X509Factory", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.provider.certpath.PKIXCertPathValidator", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.rsa.PSSParameters", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.rsa.RSAKeyFactory$Legacy", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.rsa.RSAPSSSignature", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.rsa.RSASignature$SHA224withRSA", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.rsa.RSASignature$SHA256withRSA", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.ssl.KeyManagerFactoryImpl$SunX509", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.ssl.SSLContextImpl$DefaultSSLContext", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.ssl.TrustManagerFactoryImpl$PKIXFactory", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.util.ObjectIdentifier" +}, +{ + "name":"sun.security.x509.AuthorityInfoAccessExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.AuthorityKeyIdentifierExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.BasicConstraintsExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.CRLDistributionPointsExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.CertificateExtensions" +}, +{ + "name":"sun.security.x509.CertificatePoliciesExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.ExtendedKeyUsageExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.IssuerAlternativeNameExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.KeyUsageExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.NetscapeCertTypeExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.PrivateKeyUsageExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.SubjectAlternativeNameExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.SubjectKeyIdentifierExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name": "org.enso.languageserver.boot.LanguageServerRunner", + "methods": [ + { + "name": "", + "parameterTypes":[] + }, + { + "name": "runLanguageServer", + "parameterTypes":["org.apache.commons.cli.CommandLine", "org.enso.runner.common.ProfilingConfig", "org.slf4j.event.Level"] + } + ] +} +] diff --git a/engine/language-server/src/main/resources/META-INF/native-image/org/enso/languageserver/serialization-config.json b/engine/language-server/src/main/resources/META-INF/native-image/org/enso/languageserver/serialization-config.json new file mode 100644 index 000000000000..33406459f3aa --- /dev/null +++ b/engine/language-server/src/main/resources/META-INF/native-image/org/enso/languageserver/serialization-config.json @@ -0,0 +1,59 @@ +{ + "types":[ + { + "name":"ch.qos.logback.classic.spi.IThrowableProxy[]" + }, + { + "name":"ch.qos.logback.classic.spi.LoggerContextVO" + }, + { + "name":"ch.qos.logback.classic.spi.LoggingEventVO" + }, + { + "name":"ch.qos.logback.classic.spi.StackTraceElementProxy" + }, + { + "name":"ch.qos.logback.classic.spi.StackTraceElementProxy[]" + }, + { + "name":"ch.qos.logback.classic.spi.ThrowableProxyVO" + }, + { + "name":"org.slf4j.helpers.BasicMarker" + }, + { + "name":"java.lang.StackTraceElement" + }, + { + "name":"java.lang.String" + }, + { + "name":"java.util.Collections$EmptyMap" + }, + { + "name":"java.util.HashMap" + }, + { + "name":"java.lang.Throwable" + }, + { + "name":"java.lang.Object" + }, + { + "name":"java.lang.Exception" + }, + { + "name":"java.io.IOException" + }, + { + "name":"java.util.ArrayList" + }, + { + "name":"java.util.concurrent.CopyOnWriteArrayList" + } + ], + "lambdaCapturingTypes":[ + ], + "proxies":[ + ] +} diff --git a/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json b/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json index 306a5bab286c..6bbb3c167f64 100644 --- a/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json +++ b/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/reflect-config.json @@ -870,15 +870,6 @@ { "name":"java.util.Base64.Encoder" }, -{ - "name":"java.util.Collection", - "methods": [ - { - "name":"contains", - "parameterTypes":["java.lang.Object"] - } - ] -}, { "name":"java.util.Date" }, @@ -948,188 +939,6 @@ { "name":"java.util.logging.Logger" }, -{ - "name":"org.slf4j.Logger", - "methods": [{"name":"getLogger", "parameterTypes":["java.lang.Class"]}] -}, -{"name": "ch.qos.logback.core.status.InfoStatus"}, -{ - "name":"[Lakka.actor.LightArrayRevolverScheduler$TaskQueue;" -}, -{ - "name":"akka.event.DefaultLoggingFilter", - "methods":[{"name":"","parameterTypes":["akka.actor.ActorSystem$Settings", "akka.event.EventStream"] }] -}, -{ - "name":"akka.actor.ActorCell", - "fields":[{"name":"akka$actor$dungeon$Children$$_childrenRefsDoNotCallMeDirectly"}, {"name":"akka$actor$dungeon$Children$$_functionRefsDoNotCallMeDirectly"}, {"name":"akka$actor$dungeon$Children$$_nextNameDoNotCallMeDirectly"}, {"name":"akka$actor$dungeon$Dispatch$$_mailboxDoNotCallMeDirectly"}] -}, -{ - "name":"akka.actor.DefaultSupervisorStrategy", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"akka.actor.LightArrayRevolverScheduler", - "methods":[{"name":"","parameterTypes":["com.typesafe.config.Config","akka.event.LoggingAdapter","java.util.concurrent.ThreadFactory"] }] -}, -{ - "name":"akka.actor.LightArrayRevolverScheduler$TaskHolder", - "fields":[{"name":"task"}] -}, -{ - "name":"akka.actor.LocalActorRefProvider", - "methods":[{"name":"","parameterTypes":["java.lang.String","akka.actor.ActorSystem$Settings","akka.event.EventStream","akka.actor.DynamicAccess"] }] -}, -{ - "name":"akka.actor.LocalActorRefProvider$Guardian", - "queryAllDeclaredConstructors":true, - "methods":[{"name":"","parameterTypes":["akka.actor.SupervisorStrategy"] }] -}, -{ - "name":"akka.actor.LocalActorRefProvider$SystemGuardian", - "queryAllDeclaredConstructors":true, - "methods":[{"name":"","parameterTypes":["akka.actor.SupervisorStrategy","akka.actor.ActorRef"] }] -}, -{ - "name":"akka.actor.Props$EmptyActor", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"akka.actor.RepointableActorRef", - "fields":[{"name":"_cellDoNotCallMeDirectly"}, {"name":"_lookupDoNotCallMeDirectly"}] -}, -{ - "name":"akka.dispatch.AbstractNodeQueue", - "fields":[{"name":"_tailDoNotCallMeDirectly"}] -}, -{ - "name":"akka.dispatch.AbstractNodeQueue$Node", - "fields":[{"name":"_nextDoNotCallMeDirectly"}] -}, -{ - "name":"akka.dispatch.BoundedControlAwareMessageQueueSemantics" -}, -{ - "name":"akka.dispatch.BoundedDequeBasedMessageQueueSemantics" -}, -{ - "name":"akka.dispatch.BoundedMessageQueueSemantics" -}, -{ - "name":"akka.dispatch.ControlAwareMessageQueueSemantics" -}, -{ - "name":"akka.dispatch.DequeBasedMessageQueueSemantics" -}, -{ - "name":"akka.dispatch.Dispatcher", - "fields":[{"name":"executorServiceDelegate"}] -}, -{ - "name":"akka.dispatch.Mailbox", - "fields":[{"name":"_statusDoNotCallMeDirectly"}, {"name":"_systemQueueDoNotCallMeDirectly"}] -}, -{ - "name":"akka.dispatch.MessageDispatcher", - "fields":[{"name":"_inhabitantsDoNotCallMeDirectly"}, {"name":"_shutdownScheduleDoNotCallMeDirectly"}] -}, -{ - "name":"akka.dispatch.MultipleConsumerSemantics" -}, -{ - "name":"akka.dispatch.UnboundedControlAwareMessageQueueSemantics" -}, -{ - "name":"akka.dispatch.UnboundedDequeBasedMailbox", - "methods":[{"name":"","parameterTypes":["akka.actor.ActorSystem$Settings","com.typesafe.config.Config"] }] -}, -{ - "name":"akka.dispatch.UnboundedDequeBasedMessageQueueSemantics" -}, -{ - "name":"akka.dispatch.UnboundedMailbox", - "methods":[{"name":"","parameterTypes":["akka.actor.ActorSystem$Settings","com.typesafe.config.Config"] }] -}, -{ - "name":"akka.dispatch.UnboundedMessageQueueSemantics" -}, -{ - "name":"akka.event.DeadLetterListener", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name": "akka.event.DefaultLoggingFilter", - "methods": [{"name":"", "parameterTypes": ["akka.actor.ActorSystem$Settings", "akka.event.EventStream"]}] -}, -{ - "name":"akka.event.EventStreamUnsubscriber", - "queryAllDeclaredConstructors":true, - "methods":[{"name":"","parameterTypes":["akka.event.EventStream","boolean"] }] -}, -{ - "name":"akka.event.LoggerMailboxType", - "methods":[{"name":"","parameterTypes":["akka.actor.ActorSystem$Settings","com.typesafe.config.Config"] }] -}, -{ - "name":"akka.event.LoggerMessageQueueSemantics" -}, -{ - "name":"akka.event.slf4j.Slf4jLogger", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"akka.event.slf4j.Slf4jLoggingFilter", - "methods":[{"name":"","parameterTypes":["akka.actor.ActorSystem$Settings","akka.event.EventStream"] }] -}, -{ - "name":"akka.http.DefaultParsingErrorHandler$", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"akka.http.impl.engine.client.PoolMasterActor", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"akka.io.SelectionHandler", - "queryAllDeclaredConstructors":true, - "methods":[{"name":"","parameterTypes":["akka.io.SelectionHandlerSettings"] }] -}, -{ - "name":"akka.io.TcpIncomingConnection", - "queryAllDeclaredConstructors":true, - "methods":[{"name":"","parameterTypes":["akka.io.TcpExt","java.nio.channels.SocketChannel","akka.io.ChannelRegistry","akka.actor.ActorRef","scala.collection.immutable.Iterable","boolean"] }] -}, -{ - "name":"akka.io.TcpListener", - "queryAllDeclaredConstructors":true, - "methods":[{"name":"","parameterTypes":["akka.actor.ActorRef","akka.io.TcpExt","akka.io.ChannelRegistry","akka.actor.ActorRef","akka.io.Tcp$Bind"] }] -}, -{ - "name":"akka.io.TcpManager", - "queryAllDeclaredConstructors":true, - "methods":[{"name":"","parameterTypes":["akka.io.TcpExt"] }] -}, -{ - "name":"akka.pattern.PromiseActorRef", - "fields":[{"name":"_stateDoNotCallMeDirectly"}, {"name":"_watchedByDoNotCallMeDirectly"}] -}, -{ - "name":"akka.routing.ConsistentHashingPool", - "methods":[{"name":"","parameterTypes":["com.typesafe.config.Config"] }] -}, -{ - "name":"akka.routing.RoundRobinPool", - "methods":[{"name":"","parameterTypes":["com.typesafe.config.Config"] }] -}, -{ - "name":"akka.routing.RoutedActorCell$RouterActorCreator", - "queryAllDeclaredConstructors":true, - "methods":[{"name":"","parameterTypes":["akka.routing.RouterConfig"] }] -}, -{ - "name":"akka.stream.SystemMaterializer$", - "fields":[{"name":"MODULE$"}] -}, { "name":"java.util.logging.LoggingMXBean", "queryAllPublicMethods":true @@ -3875,18 +3684,5 @@ { "name":"sun.security.x509.SubjectKeyIdentifierExtension", "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, -{ - "name": "org.enso.languageserver.boot.LanguageServerRunner", - "methods": [ - { - "name": "", - "parameterTypes":[] - }, - { - "name": "runLanguageServer", - "parameterTypes":["org.apache.commons.cli.CommandLine", "org.enso.runner.common.ProfilingConfig", "org.slf4j.event.Level"] - } - ] } ] diff --git a/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/serialization-config.json b/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/serialization-config.json index 33406459f3aa..f3d7e06e3392 100644 --- a/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/serialization-config.json +++ b/engine/runner/src/main/resources/META-INF/native-image/org/enso/runner/serialization-config.json @@ -1,56 +1,5 @@ { "types":[ - { - "name":"ch.qos.logback.classic.spi.IThrowableProxy[]" - }, - { - "name":"ch.qos.logback.classic.spi.LoggerContextVO" - }, - { - "name":"ch.qos.logback.classic.spi.LoggingEventVO" - }, - { - "name":"ch.qos.logback.classic.spi.StackTraceElementProxy" - }, - { - "name":"ch.qos.logback.classic.spi.StackTraceElementProxy[]" - }, - { - "name":"ch.qos.logback.classic.spi.ThrowableProxyVO" - }, - { - "name":"org.slf4j.helpers.BasicMarker" - }, - { - "name":"java.lang.StackTraceElement" - }, - { - "name":"java.lang.String" - }, - { - "name":"java.util.Collections$EmptyMap" - }, - { - "name":"java.util.HashMap" - }, - { - "name":"java.lang.Throwable" - }, - { - "name":"java.lang.Object" - }, - { - "name":"java.lang.Exception" - }, - { - "name":"java.io.IOException" - }, - { - "name":"java.util.ArrayList" - }, - { - "name":"java.util.concurrent.CopyOnWriteArrayList" - } ], "lambdaCapturingTypes":[ ], From ea2f21469ac8ddaadbc14486fa5219f83a62df7f Mon Sep 17 00:00:00 2001 From: Hubert Plociniczak Date: Mon, 6 Jan 2025 11:05:57 +0100 Subject: [PATCH 15/17] Remove automatically added module dependency --- engine/language-server/src/main/java/module-info.java | 1 - 1 file changed, 1 deletion(-) diff --git a/engine/language-server/src/main/java/module-info.java b/engine/language-server/src/main/java/module-info.java index d0acf7391f28..e288913bc7ca 100644 --- a/engine/language-server/src/main/java/module-info.java +++ b/engine/language-server/src/main/java/module-info.java @@ -37,7 +37,6 @@ requires org.enso.text.buffer; requires org.enso.task.progress.notifications; requires org.enso.ydoc.polyfill; - requires org.openide.util.lookup.RELEASE180; exports org.enso.languageserver.filemanager to scala.library; exports org.enso.languageserver.runtime to scala.library; From 6e8c05b9b0d63f7cbba9393efea8b276f46cdd15 Mon Sep 17 00:00:00 2001 From: Hubert Plociniczak Date: Mon, 6 Jan 2025 15:04:52 +0100 Subject: [PATCH 16/17] Move AOT Context-creation logic to factory Context creation for AOT needs to define a separate Engine configuration rather than using a shared engine to be able to use message transport. --- build.sbt | 1 - .../java/org/enso/common/ContextFactory.java | 19 ++++++++++++++----- .../enso/languageserver/boot/MainModule.scala | 7 +------ 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/build.sbt b/build.sbt index 059b03bd59f0..819649c046fe 100644 --- a/build.sbt +++ b/build.sbt @@ -3710,7 +3710,6 @@ lazy val `engine-runner` = project "-H:IncludeResources=.*Main.enso$", "-H:+AddAllCharsets", "-H:+IncludeAllLocales", - "-H:+UnlockExperimentalVMOptions", "-ea", // useful perf & debug switches: // "-g", diff --git a/engine/common/src/main/java/org/enso/common/ContextFactory.java b/engine/common/src/main/java/org/enso/common/ContextFactory.java index 209e14fdbb38..efc33cade708 100644 --- a/engine/common/src/main/java/org/enso/common/ContextFactory.java +++ b/engine/common/src/main/java/org/enso/common/ContextFactory.java @@ -53,7 +53,7 @@ public final class ContextFactory { private String checkForWarnings; private int warningsLimit = 100; private java.util.Map options = new HashMap<>(); - private java.util.Map engineOptions = null; + private String runtimerServerKey; private boolean enableDebugServer; private ContextFactory() {} @@ -147,8 +147,8 @@ public ContextFactory options(Map options) { return this; } - public ContextFactory engineOptions(Map options) { - this.engineOptions = options; + public ContextFactory enableRuntimeServerInfoKey(String keyName) { + this.runtimerServerKey = keyName; return this; } @@ -168,6 +168,16 @@ public Context build() { } var julLogLevel = Converter.toJavaLevel(logLevel); var logLevelName = julLogLevel.getName(); + var inAOTMode = java.lang.Boolean.getBoolean("com.oracle.graalvm.isaot"); + java.util.Map engineOptions = null; + if (runtimerServerKey != null) { + if (!inAOTMode) { + options.put(runtimerServerKey, "true"); + } else { + engineOptions = new java.util.HashMap<>(); + engineOptions.put(runtimerServerKey, "true"); + } + } var builder = Context.newBuilder() .allowExperimentalOptions(true) @@ -232,11 +242,10 @@ public Context build() { .allowCreateThread(true); } - if (engineOptions != null) { + if (inAOTMode) { // In AOT mode one must not use a shared engine; the latter causes issues when initializing // message transport - it is set to `null`. var eng = Engine.newBuilder().allowExperimentalOptions(true).options(engineOptions); - if (messageTransport != null) { eng.serverTransport(messageTransport); } diff --git a/engine/language-server/src/main/scala/org/enso/languageserver/boot/MainModule.scala b/engine/language-server/src/main/scala/org/enso/languageserver/boot/MainModule.scala index 67044df0a854..1a00b1782994 100644 --- a/engine/language-server/src/main/scala/org/enso/languageserver/boot/MainModule.scala +++ b/engine/language-server/src/main/scala/org/enso/languageserver/boot/MainModule.scala @@ -63,7 +63,6 @@ import java.io.{File, PrintStream} import java.net.URI import java.nio.charset.StandardCharsets import java.time.Clock -import java.util import scala.concurrent.duration.DurationInt /** A main module containing all components of the server. @@ -317,14 +316,10 @@ class MainModule(serverConfig: LanguageServerConfig, logLevel: Level) { Runtime.getRuntime.availableProcessors().toString ) - var extraEngineOptions: util.HashMap[String, String] = null if (java.lang.Boolean.getBoolean("com.oracle.graalvm.isaot")) { - extraEngineOptions = new util.HashMap[String, String]() log.trace("Running Language Server in AOT mode") - extraEngineOptions.put(RuntimeServerInfo.ENABLE_OPTION, "true") } else { log.trace("Running Language Server in non-AOT mode") - extraOptions.put(RuntimeServerInfo.ENABLE_OPTION, "true") } private val builder = ContextFactory @@ -338,7 +333,7 @@ class MainModule(serverConfig: LanguageServerConfig, logLevel: Level) { .err(stdErr) .in(stdIn) .options(extraOptions) - .engineOptions(extraEngineOptions) + .enableRuntimeServerInfoKey(RuntimeServerInfo.ENABLE_OPTION) .messageTransport((uri: URI, peerEndpoint: MessageEndpoint) => { if (uri.toString == RuntimeServerInfo.URI) { val connection = new RuntimeConnector.Endpoint( From 3ce25770e8e13e3e71289c0cb732594ea649436a Mon Sep 17 00:00:00 2001 From: Hubert Plociniczak Date: Tue, 7 Jan 2025 01:02:57 +0100 Subject: [PATCH 17/17] PR review --- .../launcher/components/LauncherRunner.scala | 3 +- .../components/LauncherRunnerSpec.scala | 2 +- .../org/enso/projectmanager/boot/Cli.scala | 9 --- .../projectmanager/boot/ProjectManager.scala | 1 - .../projectmanager/boot/configuration.scala | 1 - .../ExecutorWithUnlimitedPool.scala | 3 +- .../LanguageServerController.scala | 3 +- .../LanguageServerDescriptor.scala | 1 - .../service/ProjectCreationService.scala | 3 +- .../enso/projectmanager/BaseServerSpec.scala | 1 - .../TestDistributionConfiguration.scala | 4 +- .../runner/ExecCommand.scala | 12 +++ .../runner/JVMSettings.scala | 4 +- .../runner/JavaCommand.scala | 32 -------- .../runner/JavaExecCommand.scala | 69 ++++++++++++++++ .../runner/NativeExecCommand.scala | 32 ++++++++ .../runner/NativeJavaCommand.scala | 20 ----- .../{Command.scala => RawCommand.scala} | 4 +- .../runtimeversionmanager/runner/Runner.scala | 78 ++++--------------- 19 files changed, 141 insertions(+), 141 deletions(-) create mode 100644 lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/ExecCommand.scala delete mode 100644 lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/JavaCommand.scala create mode 100644 lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/JavaExecCommand.scala create mode 100644 lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/NativeExecCommand.scala delete mode 100644 lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/NativeJavaCommand.scala rename lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/{Command.scala => RawCommand.scala} (98%) diff --git a/engine/launcher/src/main/scala/org/enso/launcher/components/LauncherRunner.scala b/engine/launcher/src/main/scala/org/enso/launcher/components/LauncherRunner.scala index 559080affb60..0aa5f63ebf30 100644 --- a/engine/launcher/src/main/scala/org/enso/launcher/components/LauncherRunner.scala +++ b/engine/launcher/src/main/scala/org/enso/launcher/components/LauncherRunner.scala @@ -33,8 +33,7 @@ class LauncherRunner( configurationManager, editionManager, environment, - loggerConnection, - false + loggerConnection ) { /** Creates [[RunSettings]] for launching the REPL. diff --git a/engine/launcher/src/test/scala/org/enso/launcher/components/LauncherRunnerSpec.scala b/engine/launcher/src/test/scala/org/enso/launcher/components/LauncherRunnerSpec.scala index e8f8d1d4b11e..b24e60aa8268 100644 --- a/engine/launcher/src/test/scala/org/enso/launcher/components/LauncherRunnerSpec.scala +++ b/engine/launcher/src/test/scala/org/enso/launcher/components/LauncherRunnerSpec.scala @@ -70,7 +70,7 @@ class LauncherRunnerSpec extends RuntimeVersionManagerTest with FlakySpec { val jvmOptions = Seq(("locally-added-options", "value1")) val runnerEntryPoint = "org.enso.runner/org.enso.runner.Main" - def checkCommandLine(command: Command): Unit = { + def checkCommandLine(command: RawCommand): Unit = { val arguments = command.command.tail val javaArguments = arguments.takeWhile(_ != "-jar") val appArguments = arguments.dropWhile(_ != runnerEntryPoint).tail diff --git a/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/boot/Cli.scala b/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/boot/Cli.scala index 5a82d1df21c7..9072aec6778b 100644 --- a/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/boot/Cli.scala +++ b/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/boot/Cli.scala @@ -12,7 +12,6 @@ object Cli { val NO_LOG_MASKING = "no-log-masking" val VERBOSE_OPTION = "verbose" val VERSION_OPTION = "version" - val NATIVE_OPTION = "native-language-server" val PROFILING_PATH = "profiling-path" val PROFILING_TIME = "profiling-time" val PROJECTS_DIRECTORY = "projects-directory" @@ -46,13 +45,6 @@ object Cli { .desc("Checks the version of the Enso executable.") .build() - val native: cli.Option = cli.Option.builder - .longOpt(NATIVE_OPTION) - .desc( - "(experimental) Attempts to use the native-image of any subprocess." - ) - .build() - val json: cli.Option = cli.Option.builder .longOpt(JSON_OPTION) .desc("Switches the --version option to JSON output.") @@ -172,7 +164,6 @@ object Cli { .addOption(option.version) .addOption(option.json) .addOption(option.noLogMasking) - .addOption(option.native) .addOption(option.profilingPath) .addOption(option.profilingTime) .addOption(option.projectsDirectory) diff --git a/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/boot/ProjectManager.scala b/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/boot/ProjectManager.scala index 5615ee32146b..516ad153b154 100644 --- a/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/boot/ProjectManager.scala +++ b/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/boot/ProjectManager.scala @@ -296,7 +296,6 @@ object ProjectManager extends ZIOAppDefault with LazyLogging { logLevel <- setupLogging(verbosity, logMasking) procConf = MainProcessConfig( logLevel, - options.hasOption(Cli.NATIVE_OPTION), opts.profilingPath, opts.profilingTime ) diff --git a/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/boot/configuration.scala b/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/boot/configuration.scala index 5c1a0043e5ad..9ccaf55cd667 100644 --- a/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/boot/configuration.scala +++ b/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/boot/configuration.scala @@ -19,7 +19,6 @@ object configuration { */ case class MainProcessConfig( logLevel: Level, - nativeImage: Boolean, profilingPath: Option[Path], profilingTime: Option[FiniteDuration] ) diff --git a/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/infrastructure/languageserver/ExecutorWithUnlimitedPool.scala b/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/infrastructure/languageserver/ExecutorWithUnlimitedPool.scala index 43cd9e704f9d..d77361ae0615 100644 --- a/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/infrastructure/languageserver/ExecutorWithUnlimitedPool.scala +++ b/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/infrastructure/languageserver/ExecutorWithUnlimitedPool.scala @@ -100,8 +100,7 @@ object ExecutorWithUnlimitedPool extends LanguageServerExecutor { globalConfigurationManager = configurationManager, editionManager = distributionConfiguration.editionManager, environment = distributionConfiguration.environment, - loggerConnection = descriptor.deferredLoggingServiceEndpoint, - nativeImage = descriptor.nativeImage + loggerConnection = descriptor.deferredLoggingServiceEndpoint ) val profilingPathArguments = descriptor.profilingPath.toSeq diff --git a/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/infrastructure/languageserver/LanguageServerController.scala b/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/infrastructure/languageserver/LanguageServerController.scala index 8f7bb8880dfb..2281e77183eb 100644 --- a/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/infrastructure/languageserver/LanguageServerController.scala +++ b/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/infrastructure/languageserver/LanguageServerController.scala @@ -89,8 +89,7 @@ class LanguageServerController( profilingPath = processConfig.profilingPath, profilingTime = processConfig.profilingTime, deferredLoggingServiceEndpoint = loggingServiceDescriptor.getEndpoint, - skipGraalVMUpdater = bootloaderConfig.skipGraalVMUpdater, - nativeImage = processConfig.nativeImage + skipGraalVMUpdater = bootloaderConfig.skipGraalVMUpdater ) override def supervisorStrategy: SupervisorStrategy = diff --git a/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/infrastructure/languageserver/LanguageServerDescriptor.scala b/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/infrastructure/languageserver/LanguageServerDescriptor.scala index ff1a2556457c..53691948b1c2 100644 --- a/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/infrastructure/languageserver/LanguageServerDescriptor.scala +++ b/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/infrastructure/languageserver/LanguageServerDescriptor.scala @@ -43,7 +43,6 @@ case class LanguageServerDescriptor( engineVersion: SemVer, jvmSettings: JVMSettings, discardOutput: Boolean, - nativeImage: Boolean, profilingPath: Option[Path], profilingTime: Option[FiniteDuration], deferredLoggingServiceEndpoint: Future[Option[URI]], diff --git a/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/service/ProjectCreationService.scala b/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/service/ProjectCreationService.scala index 76aad6be3bca..68678163b69c 100644 --- a/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/service/ProjectCreationService.scala +++ b/lib/scala/project-manager/src/main/scala/org/enso/projectmanager/service/ProjectCreationService.scala @@ -52,8 +52,7 @@ class ProjectCreationService[ globalConfigurationManager = configurationManager, editionManager = distributionConfiguration.editionManager, environment = distributionConfiguration.environment, - loggerConnection = loggingServiceDescriptor.getEndpoint, - nativeImage = false + loggerConnection = loggingServiceDescriptor.getEndpoint ) val settings = diff --git a/lib/scala/project-manager/src/test/scala/org/enso/projectmanager/BaseServerSpec.scala b/lib/scala/project-manager/src/test/scala/org/enso/projectmanager/BaseServerSpec.scala index 3372b1eaf9b0..633cda4d5a8b 100644 --- a/lib/scala/project-manager/src/test/scala/org/enso/projectmanager/BaseServerSpec.scala +++ b/lib/scala/project-manager/src/test/scala/org/enso/projectmanager/BaseServerSpec.scala @@ -93,7 +93,6 @@ class BaseServerSpec extends JsonRpcServerTestKit with BeforeAndAfterAll { val processConfig: MainProcessConfig = MainProcessConfig( logLevel = if (debugLogs) Level.TRACE else Level.ERROR, - nativeImage = false, profilingPath = profilingPath, profilingTime = None ) diff --git a/lib/scala/project-manager/src/test/scala/org/enso/projectmanager/TestDistributionConfiguration.scala b/lib/scala/project-manager/src/test/scala/org/enso/projectmanager/TestDistributionConfiguration.scala index caff26e794cc..3385893815ca 100644 --- a/lib/scala/project-manager/src/test/scala/org/enso/projectmanager/TestDistributionConfiguration.scala +++ b/lib/scala/project-manager/src/test/scala/org/enso/projectmanager/TestDistributionConfiguration.scala @@ -25,7 +25,7 @@ import org.enso.runtimeversionmanager.releases.{ ReleaseProvider, SimpleReleaseProvider } -import org.enso.runtimeversionmanager.runner.{JVMSettings, JavaCommand} +import org.enso.runtimeversionmanager.runner.{JVMSettings, JavaExecCommand} import org.enso.runtimeversionmanager.test.{ FakeEnvironment, TestLocalLockManager @@ -94,7 +94,7 @@ class TestDistributionConfiguration( override def defaultJVMSettings: JVMSettings = { val currentProcess = ProcessHandle.current().info().command().toScala.getOrElse("java") - val javaCommand = new JavaCommand(currentProcess, None) + val javaCommand = new JavaExecCommand(currentProcess, None) new JVMSettings( javaCommandOverride = Some(javaCommand), jvmOptions = Seq(), diff --git a/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/ExecCommand.scala b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/ExecCommand.scala new file mode 100644 index 000000000000..1dca0bbc6498 --- /dev/null +++ b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/ExecCommand.scala @@ -0,0 +1,12 @@ +package org.enso.runtimeversionmanager.runner + +import org.enso.runtimeversionmanager.components.Engine + +/** Executable command used to trigger a Runner. Can be either a Java command or a native image executable. + */ +trait ExecCommand { + // Path to executable + def path: String + def cmdArguments(engine: Engine, jvmSettings: JVMSettings): Seq[String] + def javaHome: Option[String] +} diff --git a/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/JVMSettings.scala b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/JVMSettings.scala index c79e02c3688a..25cd1e04cb3d 100644 --- a/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/JVMSettings.scala +++ b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/JVMSettings.scala @@ -10,7 +10,7 @@ package org.enso.runtimeversionmanager.runner * @param extraOptions extra options that should be added to the launched JVM */ case class JVMSettings( - javaCommandOverride: Option[JavaCommand], + javaCommandOverride: Option[JavaExecCommand], jvmOptions: Seq[(String, String)], extraOptions: Seq[(String, String)], nativeImage: Boolean @@ -32,7 +32,7 @@ object JVMSettings { nativeImage: Boolean = false ): JVMSettings = new JVMSettings( - if (useSystemJVM) Some(JavaCommand.systemJavaCommand) else None, + if (useSystemJVM) Some(JavaExecCommand.defaultSystem) else None, jvmOptions, extraOptions, nativeImage diff --git a/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/JavaCommand.scala b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/JavaCommand.scala deleted file mode 100644 index 1b1920cd8cf2..000000000000 --- a/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/JavaCommand.scala +++ /dev/null @@ -1,32 +0,0 @@ -package org.enso.runtimeversionmanager.runner - -import org.enso.runtimeversionmanager.components.GraalRuntime - -/** Represents a way of launching the JVM. - * - * @param executableName name of the `java` executable to run - * @param javaHomeOverride if set, asks to override the JAVA_HOME environment - * variable when launching the JVM - */ -class JavaCommand( - val executableName: String, - val javaHomeOverride: Option[String] -) - -object JavaCommand { - - /** The [[JavaCommand]] representing the system-configured JVM. - */ - def systemJavaCommand: JavaCommand = new JavaCommand("java", None) - - /** The [[JavaCommand]] representing a managed [[GraalRuntime]]. - */ - def forRuntime(runtime: GraalRuntime): JavaCommand = - new JavaCommand( - executableName = runtime.javaExecutable.toAbsolutePath.normalize.toString, - javaHomeOverride = Some( - runtime.javaHome.toAbsolutePath.normalize.toString - ) - ) - -} diff --git a/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/JavaExecCommand.scala b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/JavaExecCommand.scala new file mode 100644 index 000000000000..aa821552ba16 --- /dev/null +++ b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/JavaExecCommand.scala @@ -0,0 +1,69 @@ +package org.enso.runtimeversionmanager.runner + +import org.enso.runtimeversionmanager.components.{Engine, GraalRuntime} +import org.enso.runtimeversionmanager.components.Manifest.JVMOptionsContext + +/** Represents a way of launching the JVM. + * + * @param executableName name of the `java` executable to run + * @param javaHomeOverride if set, asks to override the JAVA_HOME environment + * variable when launching the JVM + */ +class JavaExecCommand( + val executableName: String, + val javaHome: Option[String] +) extends ExecCommand { + def path: String = executableName + + override def cmdArguments( + engine: Engine, + jvmSettings: JVMSettings + ): Seq[String] = { + def translateJVMOption( + option: (String, String), + standardOption: Boolean + ): String = { + val name = option._1 + val value = option._2 + if (standardOption) s"-D$name=$value" else s"--$name=$value" + } + + val context = JVMOptionsContext(enginePackagePath = engine.path) + + val manifestOptions = + engine.defaultJVMOptions + .filter(_.isRelevant) + .map(_.substitute(context)) + val commandLineOptions = jvmSettings.jvmOptions.map( + translateJVMOption(_, standardOption = true) + ) ++ jvmSettings.extraOptions.map( + translateJVMOption(_, standardOption = false) + ) + val componentPath = engine.componentDirPath.toAbsolutePath.normalize + val modulePathOptions = + Seq( + "--module-path", + componentPath.toString, + "-m", + "org.enso.runner/org.enso.runner.Main" + ) + + manifestOptions ++ commandLineOptions ++ modulePathOptions + } +} + +object JavaExecCommand { + + /** The [[JavaExecCommand]] representing the system-configured JVM. + */ + def defaultSystem: JavaExecCommand = new JavaExecCommand("java", None) + + /** The [[JavaExecCommand]] representing a managed [[GraalRuntime]]. + */ + def forRuntime(runtime: GraalRuntime): JavaExecCommand = + new JavaExecCommand( + executableName = runtime.javaExecutable.toAbsolutePath.normalize.toString, + javaHome = Some(runtime.javaHome.toAbsolutePath.normalize.toString) + ) + +} diff --git a/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/NativeExecCommand.scala b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/NativeExecCommand.scala new file mode 100644 index 000000000000..33beca0aa1c3 --- /dev/null +++ b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/NativeExecCommand.scala @@ -0,0 +1,32 @@ +package org.enso.runtimeversionmanager.runner + +import org.enso.cli.OS +import org.enso.distribution.{DistributionManager, Environment} +import org.enso.runtimeversionmanager.components.Engine + +import java.nio.file.Path + +case class NativeExecCommand(executablePath: Path) extends ExecCommand { + override def path: String = executablePath.toString + + override def cmdArguments( + engine: Engine, + jvmSettings: JVMSettings + ): Seq[String] = + Seq("-Dcom.oracle.graalvm.isaot=true") + + override def javaHome: Option[String] = None +} + +object NativeExecCommand { + def apply(version: String): Option[NativeExecCommand] = { + val env = new Environment() {} + val dm = new DistributionManager(env) + val execName = OS.executableName("enso") + val fullExecPath = + dm.paths.engines.resolve(version).resolve("bin").resolve(execName) + + if (fullExecPath.toFile.exists()) Some(NativeExecCommand(fullExecPath)) + else None + } +} diff --git a/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/NativeJavaCommand.scala b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/NativeJavaCommand.scala deleted file mode 100644 index 51b4dd4ac5fa..000000000000 --- a/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/NativeJavaCommand.scala +++ /dev/null @@ -1,20 +0,0 @@ -package org.enso.runtimeversionmanager.runner - -import org.enso.cli.OS -import org.enso.distribution.{DistributionManager, Environment} - -import java.nio.file.Path - -case class NativeJavaCommand(executablePath: Path) - extends JavaCommand(executablePath.toString, None) - -object NativeJavaCommand { - def apply(version: String): NativeJavaCommand = { - val env = new Environment() {} - val dm = new DistributionManager(env) - val execName = OS.executableName("enso") - val fullExecPath = - dm.paths.engines.resolve(version).resolve("bin").resolve(execName) - new NativeJavaCommand(fullExecPath) - } -} diff --git a/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/Command.scala b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/RawCommand.scala similarity index 98% rename from lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/Command.scala rename to lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/RawCommand.scala index 4c2e38e895fc..3395a069dc6e 100644 --- a/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/Command.scala +++ b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/RawCommand.scala @@ -13,12 +13,12 @@ import scala.util.{Failure, Try} * @param extraEnv environment variables that should be overridden * @param workingDirectory the working directory in which the command should be executed (if None, the working directory is not overridden and is inherited instead) */ -case class Command( +case class RawCommand( command: Seq[String], extraEnv: Seq[(String, String)], workingDirectory: Option[Path] ) { - private val logger = Logger[Command] + private val logger = Logger[RawCommand] /** Runs the command and returns its exit code. * diff --git a/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/Runner.scala b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/Runner.scala index 65ac4f47e285..aaa0e1b1642d 100644 --- a/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/Runner.scala +++ b/lib/scala/runtime-version-manager/src/main/scala/org/enso/runtimeversionmanager/runner/Runner.scala @@ -9,7 +9,6 @@ import org.enso.logger.masking.MaskedString import org.slf4j.event.Level import java.net.URI -import org.enso.runtimeversionmanager.components.Manifest.JVMOptionsContext import org.enso.runtimeversionmanager.components.{ Engine, GraalRuntime, @@ -32,8 +31,7 @@ class Runner( globalConfigurationManager: GlobalRunnerConfigurationManager, editionManager: EditionManager, environment: Environment, - loggerConnection: Future[Option[URI]], - nativeImage: Boolean + loggerConnection: Future[Option[URI]] ) { /** The current working directory that is a starting point when checking if @@ -164,9 +162,9 @@ class Runner( * the underlying JVM to get the full command for launching the component. */ def withCommand[R](runSettings: RunSettings, jvmSettings: JVMSettings)( - action: Command => R + action: RawCommand => R ): R = { - def prepareAndRunCommand(engine: Engine, javaCommand: JavaCommand): R = { + def prepareAndRunCommand(engine: Engine, cmd: ExecCommand): R = { val jvmOptsFromEnvironment = environment.getEnvVar(JVM_OPTIONS_ENV_VAR) jvmOptsFromEnvironment.foreach { opts => Logger[Runner].debug( @@ -177,48 +175,11 @@ class Runner( ) } - def translateJVMOption( - option: (String, String), - standardOption: Boolean - ): String = { - val name = option._1 - val value = option._2 - if (standardOption) s"-D$name=$value" else s"--$name=$value" - } - - val context = JVMOptionsContext(enginePackagePath = engine.path) - - val manifestOptions = - if (nativeImage) Seq() - else - engine.defaultJVMOptions - .filter(_.isRelevant) - .map(_.substitute(context)) val environmentOptions = jvmOptsFromEnvironment.map(_.split(' ').toIndexedSeq).getOrElse(Seq()) - val commandLineOptions = jvmSettings.jvmOptions.map( - translateJVMOption(_, standardOption = true) - ) ++ (if (nativeImage) Seq() - else - jvmSettings.extraOptions.map( - translateJVMOption(_, standardOption = false) - )) - val componentPath = engine.componentDirPath.toAbsolutePath.normalize - val modulePathOptions = - if (nativeImage) Seq() - else - Seq( - "--module-path", - componentPath.toString, - "-m", - "org.enso.runner/org.enso.runner.Main" - ) + val jvmArguments = - if (nativeImage) Seq("-Dcom.oracle.graalvm.isaot=true") - else - Seq() ++ - manifestOptions ++ - environmentOptions ++ commandLineOptions ++ modulePathOptions + environmentOptions ++ cmd.cmdArguments(engine, jvmSettings) val loggingConnectionArguments = if (runSettings.connectLoggerIfAvailable) @@ -226,7 +187,7 @@ class Runner( else Seq() val command = Seq( - javaCommand.executableName + cmd.path ) ++ jvmArguments ++ loggingConnectionArguments ++ runSettings.runnerArguments val distributionSettings = @@ -240,13 +201,13 @@ class Runner( ) p.toString() } - .orElse(javaCommand.javaHomeOverride) + .orElse(cmd.javaHome) val extraEnvironmentOverrides = javaHome.map("JAVA_HOME" -> _).toSeq ++ distributionSettings.toSeq action( - Command( + RawCommand( command, extraEnvironmentOverrides, runSettings.workingDirectory @@ -256,19 +217,6 @@ class Runner( val engineVersion = runSettings.engineVersion jvmSettings.javaCommandOverride match { - case _ if nativeImage => - runtimeVersionManager.withEngineAndRuntime(engineVersion) { - case (engine, runtime) => - val cmd = NativeJavaCommand.apply(engineVersion.toString) - if (cmd.executablePath.toFile.exists()) { - prepareAndRunCommand(engine, cmd) - } else { - Logger[Runner].warn( - "Unable to locate native Language Server executable at " + cmd.executablePath + ". Reverting to regular invocation" - ) - prepareAndRunCommand(engine, JavaCommand.forRuntime(runtime)) - } - } case Some(overriddenCommand) => runtimeVersionManager.withEngine(engineVersion) { engine => prepareAndRunCommand(engine, overriddenCommand) @@ -276,7 +224,15 @@ class Runner( case None => runtimeVersionManager.withEngineAndRuntime(engineVersion) { (engine, runtime) => - prepareAndRunCommand(engine, JavaCommand.forRuntime(runtime)) + NativeExecCommand.apply(engineVersion.toString) match { + case Some(cmd) => + prepareAndRunCommand(engine, cmd) + case None => + prepareAndRunCommand( + engine, + JavaExecCommand.forRuntime(runtime) + ) + } } } }