From 37406e5b889e058a9fd7868a8d1092fe6cbd01d1 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Wed, 1 Nov 2023 13:49:35 +0100 Subject: [PATCH 1/4] Add disable-private-check option processing --- .../src/main/java/org/enso/polyglot/RuntimeOptions.java | 6 ++++++ .../src/main/scala/org/enso/runner/ContextFactory.scala | 3 +++ engine/runner/src/main/scala/org/enso/runner/Main.scala | 5 +++++ .../java/org/enso/interpreter/runtime/EnsoContext.java | 9 +++++++++ 4 files changed, 23 insertions(+) diff --git a/engine/polyglot-api/src/main/java/org/enso/polyglot/RuntimeOptions.java b/engine/polyglot-api/src/main/java/org/enso/polyglot/RuntimeOptions.java index 284d0e88c805..7bdfeca705f2 100644 --- a/engine/polyglot-api/src/main/java/org/enso/polyglot/RuntimeOptions.java +++ b/engine/polyglot-api/src/main/java/org/enso/polyglot/RuntimeOptions.java @@ -21,6 +21,11 @@ public class RuntimeOptions { private static final OptionDescriptor DISABLE_INLINE_CACHES_DESCRIPTOR = OptionDescriptor.newBuilder(DISABLE_INLINE_CACHES_KEY, DISABLE_INLINE_CACHES).build(); + public static final String DISABLE_PRIVATE_CHECK = optionName("disablePrivateCheck"); + public static final OptionKey DISABLE_PRIVATE_CHECK_KEY = new OptionKey<>(false); + private static final OptionDescriptor DISABLE_PRIVATE_CHECK_DESCRIPTOR = + OptionDescriptor.newBuilder(DISABLE_PRIVATE_CHECK_KEY, DISABLE_PRIVATE_CHECK).build(); + public static final String ENABLE_AUTO_PARALLELISM = optionName("withAutoParallelism"); public static final OptionKey ENABLE_AUTO_PARALLELISM_KEY = new OptionKey<>(false); private static final OptionDescriptor ENABLE_AUTO_PARALLELISM_DESCRIPTOR = @@ -125,6 +130,7 @@ public class RuntimeOptions { STRICT_ERRORS_DESCRIPTOR, LOG_MASKING_DESCRIPTOR, DISABLE_INLINE_CACHES_DESCRIPTOR, + DISABLE_PRIVATE_CHECK_DESCRIPTOR, ENABLE_AUTO_PARALLELISM_DESCRIPTOR, ENABLE_PROJECT_SUGGESTIONS_DESCRIPTOR, ENABLE_GLOBAL_SUGGESTIONS_DESCRIPTOR, diff --git a/engine/runner/src/main/scala/org/enso/runner/ContextFactory.scala b/engine/runner/src/main/scala/org/enso/runner/ContextFactory.scala index 3078fb03ffbe..d1f9009f8645 100644 --- a/engine/runner/src/main/scala/org/enso/runner/ContextFactory.scala +++ b/engine/runner/src/main/scala/org/enso/runner/ContextFactory.scala @@ -26,6 +26,7 @@ class ContextFactory { * @param repl the Repl manager to use for this context * @param logLevel the log level for this context * @param enableIrCaches whether or not IR caching should be enabled + * @param disablePrivateCheck If `private` keyword should be disabled. * @param strictErrors whether or not to use strict errors * @param useGlobalIrCacheLocation whether or not to use the global IR cache * location @@ -42,6 +43,7 @@ class ContextFactory { logLevel: Level, logMasking: Boolean, enableIrCaches: Boolean, + disablePrivateCheck: Boolean = false, strictErrors: Boolean = false, useGlobalIrCacheLocation: Boolean = true, enableAutoParallelism: Boolean = false, @@ -76,6 +78,7 @@ class ContextFactory { useGlobalIrCacheLocation.toString ) .option(RuntimeOptions.DISABLE_IR_CACHES, (!enableIrCaches).toString) + .option(RuntimeOptions.DISABLE_PRIVATE_CHECK, disablePrivateCheck.toString) .option(DebugServerInfo.ENABLE_OPTION, "true") .option(RuntimeOptions.LOG_MASKING, logMasking.toString) .options(options) diff --git a/engine/runner/src/main/scala/org/enso/runner/Main.scala b/engine/runner/src/main/scala/org/enso/runner/Main.scala index 877b5a87dfe7..3fa8d820c398 100644 --- a/engine/runner/src/main/scala/org/enso/runner/Main.scala +++ b/engine/runner/src/main/scala/org/enso/runner/Main.scala @@ -67,6 +67,7 @@ object Main { private val IR_CACHES_OPTION = "ir-caches" private val NO_IR_CACHES_OPTION = "no-ir-caches" private val NO_READ_IR_CACHES_OPTION = "no-read-ir-caches" + private val DISABLE_PRIVATE_CHECK_OPTION = "disable-private-check" private val COMPILE_OPTION = "compile" private val NO_COMPILE_DEPENDENCIES_OPTION = "no-compile-dependencies" private val NO_GLOBAL_CACHE_OPTION = "no-global-cache" @@ -586,6 +587,7 @@ object Main { * @param logLevel log level to set for the engine runtime * @param logMasking is the log masking enabled * @param enableIrCaches are IR caches enabled + * @param disablePrivateCheck Is private modules check disabled. If yes, `private` keyword is ignored. * @param inspect shall inspect option be enabled * @param dump shall graphs be sent to the IGV * @param executionEnvironment optional name of the execution environment to use during execution @@ -597,6 +599,7 @@ object Main { logLevel: Level, logMasking: Boolean, enableIrCaches: Boolean, + disablePrivateCheck: Boolean, enableAutoParallelism: Boolean, inspect: Boolean, dump: Boolean, @@ -639,6 +642,7 @@ object Main { logLevel, logMasking, enableIrCaches, + disablePrivateCheck, strictErrors = true, enableAutoParallelism = enableAutoParallelism, executionEnvironment = executionEnvironment, @@ -1171,6 +1175,7 @@ object Main { logLevel, logMasking, shouldEnableIrCaches(line), + line.hasOption(DISABLE_PRIVATE_CHECK_OPTION), line.hasOption(AUTO_PARALLELISM_OPTION), line.hasOption(INSPECT_OPTION), line.hasOption(DUMP_GRAPHS_OPTION), diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/EnsoContext.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/EnsoContext.java index dca976e2af97..37bc6c9ac06a 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/EnsoContext.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/EnsoContext.java @@ -80,6 +80,7 @@ public final class EnsoContext { private final EnsoLanguage language; private final Env environment; private final boolean assertionsEnabled; + private final boolean isPrivateCheckDisabled; private @CompilationFinal Compiler compiler; private final PrintStream out; @@ -140,6 +141,7 @@ public EnsoContext( var isParallelismEnabled = getOption(RuntimeOptions.ENABLE_AUTO_PARALLELISM_KEY); this.isIrCachingDisabled = getOption(RuntimeOptions.DISABLE_IR_CACHES_KEY) || isParallelismEnabled; + this.isPrivateCheckDisabled = getOption(RuntimeOptions.DISABLE_PRIVATE_CHECK_KEY); this.executionEnvironment = getOption(EnsoLanguage.EXECUTION_ENVIRONMENT); this.assertionsEnabled = shouldAssertionsBeEnabled(); this.shouldWaitForPendingSerializationJobs @@ -729,6 +731,13 @@ public boolean isInlineCachingDisabled() { return isInlineCachingDisabled; } + /** + * @return when {@code private} keyword should be checked. + */ + public boolean isPrivateCheckDisabled() { + return isPrivateCheckDisabled; + } + /** * @return whether IR caching should be disabled for this context. */ From dadae7487262bf463aeb4b0a5339d4c952ccf879 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Wed, 1 Nov 2023 14:14:10 +0100 Subject: [PATCH 2/4] Add tests --- .../org/enso/interpreter/test/PackageTest.scala | 12 +++++++++--- .../interpreter/test/semantic/ImportsTest.scala | 15 +++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/engine/runtime/src/test/scala/org/enso/interpreter/test/PackageTest.scala b/engine/runtime/src/test/scala/org/enso/interpreter/test/PackageTest.scala index d41a3322aaf3..9306ac65330e 100644 --- a/engine/runtime/src/test/scala/org/enso/interpreter/test/PackageTest.scala +++ b/engine/runtime/src/test/scala/org/enso/interpreter/test/PackageTest.scala @@ -13,13 +13,16 @@ import java.util.logging.Level trait PackageTest extends AnyFlatSpec with Matchers with ValueEquality { val output = new ByteArrayOutputStream() - def evalTestProject(name: String): Value = { + def evalTestProject( + name: String, + customOptions: Map[String, String] = Map.empty + ): Value = { val pkgPath = new File(getClass.getClassLoader.getResource(name).getPath) val pkg = PackageManager.Default.fromDirectory(pkgPath).get val mainFile = pkg.mainFile val mainModule = pkg.moduleNameForFile(mainFile) - val context = Context + val ctxBuilder = Context .newBuilder(LanguageInfo.ID) .allowExperimentalOptions(true) .allowAllAccess(true) @@ -38,7 +41,10 @@ trait PackageTest extends AnyFlatSpec with Matchers with ValueEquality { .in(System.in) .option(RuntimeOptions.LOG_LEVEL, Level.WARNING.getName()) .logHandler(System.err) - .build() + for ((key, value) <- customOptions) { + ctxBuilder.option(key, value) + } + val context = ctxBuilder.build() context.initialize(LanguageInfo.ID) val executionContext = new PolyglotContext(context) InterpreterException.rethrowPolyglot( diff --git a/engine/runtime/src/test/scala/org/enso/interpreter/test/semantic/ImportsTest.scala b/engine/runtime/src/test/scala/org/enso/interpreter/test/semantic/ImportsTest.scala index 73aaa97c3251..0557e176d768 100644 --- a/engine/runtime/src/test/scala/org/enso/interpreter/test/semantic/ImportsTest.scala +++ b/engine/runtime/src/test/scala/org/enso/interpreter/test/semantic/ImportsTest.scala @@ -1,6 +1,7 @@ package org.enso.interpreter.test.semantic import org.enso.interpreter.test.{InterpreterException, PackageTest} +import org.enso.polyglot.RuntimeOptions class ImportsTest extends PackageTest { implicit def messagingNatureOInterpreterException @@ -256,4 +257,18 @@ class ImportsTest extends PackageTest { "Test_Private_Modules_5" ) shouldEqual 42 } + + "Private modules" should "be able to mix private and public submodules when private checks are disabled" in { + evalTestProject( + "Test_Private_Modules_4", + Map(RuntimeOptions.DISABLE_PRIVATE_CHECK -> "true") + ) shouldEqual 42 + } + + "Private modules" should "be able to import private modules from different project when private checks are disabled" in { + evalTestProject( + "Test_Private_Modules_3", + Map(RuntimeOptions.DISABLE_PRIVATE_CHECK -> "true") + ) shouldEqual "Success" + } } From 1ef701a94a86f9880f2dc94398c3d9414c818c65 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Wed, 1 Nov 2023 14:32:06 +0100 Subject: [PATCH 3/4] Implement --private-check-disable --- .../java/org/enso/compiler/context/CompilerContext.java | 1 + .../src/main/scala/org/enso/compiler/Passes.scala | 9 +++++++-- .../scala/org/enso/compiler/data/CompilerConfig.scala | 2 ++ .../src/main/java/org/enso/interpreter/EnsoLanguage.java | 1 + .../java/org/enso/interpreter/runtime/EnsoContext.java | 1 + .../enso/interpreter/runtime/TruffleCompilerContext.java | 5 +++++ 6 files changed, 17 insertions(+), 2 deletions(-) diff --git a/engine/runtime-compiler/src/main/java/org/enso/compiler/context/CompilerContext.java b/engine/runtime-compiler/src/main/java/org/enso/compiler/context/CompilerContext.java index 6ad07e3db611..5945a153b1e3 100644 --- a/engine/runtime-compiler/src/main/java/org/enso/compiler/context/CompilerContext.java +++ b/engine/runtime-compiler/src/main/java/org/enso/compiler/context/CompilerContext.java @@ -27,6 +27,7 @@ */ public interface CompilerContext { boolean isIrCachingDisabled(); + boolean isPrivateCheckDisabled(); boolean isUseGlobalCacheLocations(); diff --git a/engine/runtime-compiler/src/main/scala/org/enso/compiler/Passes.scala b/engine/runtime-compiler/src/main/scala/org/enso/compiler/Passes.scala index b12de383fd83..0dfb7932ce4d 100644 --- a/engine/runtime-compiler/src/main/scala/org/enso/compiler/Passes.scala +++ b/engine/runtime-compiler/src/main/scala/org/enso/compiler/Passes.scala @@ -47,8 +47,13 @@ class Passes( OperatorToFunction, LambdaShorthandToLambda, ImportSymbolAnalysis, - AmbiguousImportsAnalysis, - PrivateModuleAnalysis.INSTANCE, + AmbiguousImportsAnalysis + ) ++ (if (config.privateCheckEnabled) { + List ( + PrivateModuleAnalysis.INSTANCE + ) + } else List()) + ++ List( ExportSymbolAnalysis.INSTANCE, ShadowedPatternFields, UnreachableMatchBranches, diff --git a/engine/runtime-compiler/src/main/scala/org/enso/compiler/data/CompilerConfig.scala b/engine/runtime-compiler/src/main/scala/org/enso/compiler/data/CompilerConfig.scala index 7e9b332f9871..44dc4cc1d417 100644 --- a/engine/runtime-compiler/src/main/scala/org/enso/compiler/data/CompilerConfig.scala +++ b/engine/runtime-compiler/src/main/scala/org/enso/compiler/data/CompilerConfig.scala @@ -7,12 +7,14 @@ import java.io.PrintStream * @param autoParallelismEnabled whether or not automatic parallelism detection * is enabled. * @param warningsEnabled whether or not warnings are enabled + * @param privateCheckEnabled whether or not private keyword is enabled * @param isStrictErrors if true, presence of any Error in IR will result in an exception * @param outputRedirect redirection of the output of warnings and errors of compiler */ case class CompilerConfig( autoParallelismEnabled: Boolean = false, warningsEnabled: Boolean = true, + privateCheckEnabled: Boolean = true, isStrictErrors: Boolean = false, outputRedirect: Option[PrintStream] = None ) { 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 13e9215dead4..8ecb2dff409e 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/EnsoLanguage.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/EnsoLanguage.java @@ -243,6 +243,7 @@ protected ExecutableNode parse(InlineParsingRequest request) throws InlineParsin false, false, true, + true, scala.Option.apply(new PrintStream(outputRedirect)) ); var moduleContext = new ModuleContext( diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/EnsoContext.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/EnsoContext.java index 37bc6c9ac06a..dc71ad275034 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/EnsoContext.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/EnsoContext.java @@ -150,6 +150,7 @@ public EnsoContext( = new CompilerConfig( isParallelismEnabled, true, + !isPrivateCheckDisabled, getOption(RuntimeOptions.STRICT_ERRORS_KEY), scala.Option.empty()); this.home = home; diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/TruffleCompilerContext.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/TruffleCompilerContext.java index 2bcc3677c18c..dcab9963978b 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/TruffleCompilerContext.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/TruffleCompilerContext.java @@ -54,6 +54,11 @@ public boolean isIrCachingDisabled() { return context.isIrCachingDisabled(); } + @Override + public boolean isPrivateCheckDisabled() { + return context.isPrivateCheckDisabled(); + } + @Override public boolean isUseGlobalCacheLocations() { return context.isUseGlobalCache(); From 7456b71daf1b81505fc7ce4797a23aa5e50248e2 Mon Sep 17 00:00:00 2001 From: Pavel Marek Date: Wed, 1 Nov 2023 14:33:06 +0100 Subject: [PATCH 4/4] fmt --- .../main/scala/org/enso/runner/ContextFactory.scala | 7 +++++-- .../org/enso/compiler/context/CompilerContext.java | 1 + .../src/main/scala/org/enso/compiler/Passes.scala | 10 +++++----- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/engine/runner/src/main/scala/org/enso/runner/ContextFactory.scala b/engine/runner/src/main/scala/org/enso/runner/ContextFactory.scala index d1f9009f8645..a93bc0d9f13a 100644 --- a/engine/runner/src/main/scala/org/enso/runner/ContextFactory.scala +++ b/engine/runner/src/main/scala/org/enso/runner/ContextFactory.scala @@ -26,7 +26,7 @@ class ContextFactory { * @param repl the Repl manager to use for this context * @param logLevel the log level for this context * @param enableIrCaches whether or not IR caching should be enabled - * @param disablePrivateCheck If `private` keyword should be disabled. + * @param disablePrivateCheck If `private` keyword should be disabled. * @param strictErrors whether or not to use strict errors * @param useGlobalIrCacheLocation whether or not to use the global IR cache * location @@ -78,7 +78,10 @@ class ContextFactory { useGlobalIrCacheLocation.toString ) .option(RuntimeOptions.DISABLE_IR_CACHES, (!enableIrCaches).toString) - .option(RuntimeOptions.DISABLE_PRIVATE_CHECK, disablePrivateCheck.toString) + .option( + RuntimeOptions.DISABLE_PRIVATE_CHECK, + disablePrivateCheck.toString + ) .option(DebugServerInfo.ENABLE_OPTION, "true") .option(RuntimeOptions.LOG_MASKING, logMasking.toString) .options(options) diff --git a/engine/runtime-compiler/src/main/java/org/enso/compiler/context/CompilerContext.java b/engine/runtime-compiler/src/main/java/org/enso/compiler/context/CompilerContext.java index 5945a153b1e3..8f106a1e6c5f 100644 --- a/engine/runtime-compiler/src/main/java/org/enso/compiler/context/CompilerContext.java +++ b/engine/runtime-compiler/src/main/java/org/enso/compiler/context/CompilerContext.java @@ -27,6 +27,7 @@ */ public interface CompilerContext { boolean isIrCachingDisabled(); + boolean isPrivateCheckDisabled(); boolean isUseGlobalCacheLocations(); diff --git a/engine/runtime-compiler/src/main/scala/org/enso/compiler/Passes.scala b/engine/runtime-compiler/src/main/scala/org/enso/compiler/Passes.scala index 0dfb7932ce4d..174b319c6774 100644 --- a/engine/runtime-compiler/src/main/scala/org/enso/compiler/Passes.scala +++ b/engine/runtime-compiler/src/main/scala/org/enso/compiler/Passes.scala @@ -49,11 +49,11 @@ class Passes( ImportSymbolAnalysis, AmbiguousImportsAnalysis ) ++ (if (config.privateCheckEnabled) { - List ( - PrivateModuleAnalysis.INSTANCE - ) - } else List()) - ++ List( + List( + PrivateModuleAnalysis.INSTANCE + ) + } else List()) + ++ List( ExportSymbolAnalysis.INSTANCE, ShadowedPatternFields, UnreachableMatchBranches,