Scripting: add check for 'kotlin' package similar to the regular sources

#KT-52598 fixed
This commit is contained in:
Ilya Chernikov
2022-05-31 15:55:47 +02:00
committed by teamcity
parent f5950ac8f3
commit a8c4ea04c8
6 changed files with 53 additions and 3 deletions
@@ -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,
@@ -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) {
@@ -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()
@@ -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
@@ -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 {