Scripting: add check for 'kotlin' package similar to the regular sources
#KT-52598 fixed
This commit is contained in:
@@ -42,11 +42,10 @@ fun incrementalCompilationIsEnabledForJs(arguments: CommonCompilerArguments): Bo
|
||||
return arguments.incrementalCompilation ?: IncrementalCompilation.isEnabledForJs()
|
||||
}
|
||||
|
||||
fun checkKotlinPackageUsage(configuration: CompilerConfiguration, files: Collection<KtFile>): Boolean {
|
||||
fun checkKotlinPackageUsage(configuration: CompilerConfiguration, files: Collection<KtFile>, messageCollector: MessageCollector): Boolean {
|
||||
if (configuration.getBoolean(CLIConfigurationKeys.ALLOW_KOTLIN_PACKAGE)) {
|
||||
return true
|
||||
}
|
||||
val messageCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, MessageCollector.NONE)
|
||||
val kotlinPackage = FqName("kotlin")
|
||||
for (file in files) {
|
||||
if (file.packageFqName.isSubpackageOf(kotlinPackage)) {
|
||||
@@ -61,6 +60,9 @@ fun checkKotlinPackageUsage(configuration: CompilerConfiguration, files: Collect
|
||||
return true
|
||||
}
|
||||
|
||||
fun checkKotlinPackageUsage(configuration: CompilerConfiguration, files: Collection<KtFile>): Boolean =
|
||||
checkKotlinPackageUsage(configuration, files, configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, MessageCollector.NONE))
|
||||
|
||||
fun getLibraryFromHome(
|
||||
paths: KotlinPaths?,
|
||||
getLibrary: (KotlinPaths) -> File,
|
||||
|
||||
+23
@@ -382,6 +382,29 @@ class ReplTest : TestCase() {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testKotlinPackage() {
|
||||
val greeting = "Hello from script!"
|
||||
val error = "Only the Kotlin standard library is allowed to use the 'kotlin' package"
|
||||
val script = "package kotlin\n\"$greeting\""
|
||||
checkEvaluateInReplDiags(
|
||||
sequenceOf(script),
|
||||
sequenceOf(
|
||||
makeFailureResult(
|
||||
error, path = "Line_0.simplescript.kts",
|
||||
location = SourceCode.Location(SourceCode.Position(1, 1), SourceCode.Position(1, 15))
|
||||
)
|
||||
)
|
||||
)
|
||||
checkEvaluateInRepl(
|
||||
sequenceOf(script),
|
||||
sequenceOf(greeting),
|
||||
simpleScriptCompilationConfiguration.with {
|
||||
compilerOptions("-Xallow-kotlin-package")
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
companion object {
|
||||
private fun positionsEqual(a: SourceCode.Position?, b: SourceCode.Position?): Boolean {
|
||||
if (a == null || b == null) {
|
||||
|
||||
+19
@@ -315,6 +315,25 @@ class ScriptingHostTest : TestCase() {
|
||||
Assert.assertEquals(greeting, output)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testKotlinPackage() {
|
||||
val greeting = "Hello from script!"
|
||||
val error = "Only the Kotlin standard library is allowed to use the 'kotlin' package"
|
||||
val script = "package kotlin\nprintln(\"$greeting\")"
|
||||
val res0 = evalScript(script)
|
||||
Assert.assertTrue(res0.reports.any { it.message == error })
|
||||
Assert.assertTrue(res0 is ResultWithDiagnostics.Failure)
|
||||
|
||||
val output = captureOut {
|
||||
val res1 = evalScriptWithConfiguration(script) {
|
||||
compilerOptions("-Xallow-kotlin-package")
|
||||
}
|
||||
Assert.assertTrue(res1.reports.none { it.message == error })
|
||||
Assert.assertTrue(res1 is ResultWithDiagnostics.Success)
|
||||
}
|
||||
Assert.assertEquals(greeting, output)
|
||||
}
|
||||
|
||||
private fun doDiamondImportTest(evaluationConfiguration: ScriptEvaluationConfiguration? = null): List<String> {
|
||||
val mainScript = "sharedVar += 1\nprintln(\"sharedVar == \$sharedVar\")".toScriptSource("main.kts")
|
||||
val middleScript = File(TEST_DATA_DIR, "importTest/diamondImportMiddle.kts").toScriptSource()
|
||||
|
||||
+3
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.backend.jvm.JvmGeneratorExtensionsImpl
|
||||
import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory
|
||||
import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor
|
||||
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
|
||||
import org.jetbrains.kotlin.cli.common.checkKotlinPackageUsage
|
||||
import org.jetbrains.kotlin.cli.common.environment.setIdeaIoUseFallback
|
||||
import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport
|
||||
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
|
||||
@@ -94,6 +95,8 @@ open class KJvmReplCompilerBase<AnalyzerT : ReplCodeAnalyzerBase>(
|
||||
if (firstFailure != null)
|
||||
return firstFailure
|
||||
|
||||
checkKotlinPackageUsage(context.environment.configuration, sourceFiles, messageCollector)
|
||||
|
||||
if (messageCollector.hasErrors()) return failure(messageCollector)
|
||||
|
||||
// TODO: support case then JvmDependencyFromClassLoader is registered in non-first line
|
||||
|
||||
+3
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.scripting.compiler.plugin.impl
|
||||
import org.jetbrains.kotlin.analyzer.AnalysisResult
|
||||
import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory
|
||||
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
|
||||
import org.jetbrains.kotlin.cli.common.checkKotlinPackageUsage
|
||||
import org.jetbrains.kotlin.cli.common.fir.FirDiagnosticsCompilerResultsReporter
|
||||
import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport
|
||||
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
|
||||
@@ -126,6 +127,8 @@ private fun compileImpl(
|
||||
messageCollector
|
||||
)
|
||||
|
||||
checkKotlinPackageUsage(context.environment.configuration, sourceFiles, messageCollector)
|
||||
|
||||
if (messageCollector.hasErrors() || sourceDependencies.any { it.sourceDependencies is ResultWithDiagnostics.Failure }) {
|
||||
return failure(messageCollector)
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package kotlin.scripting.fibonacci
|
||||
package org.jetbrains.kotlin.scripting.fibonacci
|
||||
// this script expected parameter num : Int
|
||||
|
||||
fun fib(n: Int): Int {
|
||||
|
||||
Reference in New Issue
Block a user