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()
|
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)) {
|
if (configuration.getBoolean(CLIConfigurationKeys.ALLOW_KOTLIN_PACKAGE)) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
val messageCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, MessageCollector.NONE)
|
|
||||||
val kotlinPackage = FqName("kotlin")
|
val kotlinPackage = FqName("kotlin")
|
||||||
for (file in files) {
|
for (file in files) {
|
||||||
if (file.packageFqName.isSubpackageOf(kotlinPackage)) {
|
if (file.packageFqName.isSubpackageOf(kotlinPackage)) {
|
||||||
@@ -61,6 +60,9 @@ fun checkKotlinPackageUsage(configuration: CompilerConfiguration, files: Collect
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun checkKotlinPackageUsage(configuration: CompilerConfiguration, files: Collection<KtFile>): Boolean =
|
||||||
|
checkKotlinPackageUsage(configuration, files, configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, MessageCollector.NONE))
|
||||||
|
|
||||||
fun getLibraryFromHome(
|
fun getLibraryFromHome(
|
||||||
paths: KotlinPaths?,
|
paths: KotlinPaths?,
|
||||||
getLibrary: (KotlinPaths) -> File,
|
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 {
|
companion object {
|
||||||
private fun positionsEqual(a: SourceCode.Position?, b: SourceCode.Position?): Boolean {
|
private fun positionsEqual(a: SourceCode.Position?, b: SourceCode.Position?): Boolean {
|
||||||
if (a == null || b == null) {
|
if (a == null || b == null) {
|
||||||
|
|||||||
+19
@@ -315,6 +315,25 @@ class ScriptingHostTest : TestCase() {
|
|||||||
Assert.assertEquals(greeting, output)
|
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> {
|
private fun doDiamondImportTest(evaluationConfiguration: ScriptEvaluationConfiguration? = null): List<String> {
|
||||||
val mainScript = "sharedVar += 1\nprintln(\"sharedVar == \$sharedVar\")".toScriptSource("main.kts")
|
val mainScript = "sharedVar += 1\nprintln(\"sharedVar == \$sharedVar\")".toScriptSource("main.kts")
|
||||||
val middleScript = File(TEST_DATA_DIR, "importTest/diamondImportMiddle.kts").toScriptSource()
|
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.JvmIrCodegenFactory
|
||||||
import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor
|
import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor
|
||||||
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
|
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.environment.setIdeaIoUseFallback
|
||||||
import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport
|
import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport
|
||||||
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
|
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
|
||||||
@@ -94,6 +95,8 @@ open class KJvmReplCompilerBase<AnalyzerT : ReplCodeAnalyzerBase>(
|
|||||||
if (firstFailure != null)
|
if (firstFailure != null)
|
||||||
return firstFailure
|
return firstFailure
|
||||||
|
|
||||||
|
checkKotlinPackageUsage(context.environment.configuration, sourceFiles, messageCollector)
|
||||||
|
|
||||||
if (messageCollector.hasErrors()) return failure(messageCollector)
|
if (messageCollector.hasErrors()) return failure(messageCollector)
|
||||||
|
|
||||||
// TODO: support case then JvmDependencyFromClassLoader is registered in non-first line
|
// 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.analyzer.AnalysisResult
|
||||||
import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory
|
import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory
|
||||||
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
|
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.fir.FirDiagnosticsCompilerResultsReporter
|
||||||
import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport
|
import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport
|
||||||
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
|
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
|
||||||
@@ -126,6 +127,8 @@ private fun compileImpl(
|
|||||||
messageCollector
|
messageCollector
|
||||||
)
|
)
|
||||||
|
|
||||||
|
checkKotlinPackageUsage(context.environment.configuration, sourceFiles, messageCollector)
|
||||||
|
|
||||||
if (messageCollector.hasErrors() || sourceDependencies.any { it.sourceDependencies is ResultWithDiagnostics.Failure }) {
|
if (messageCollector.hasErrors() || sourceDependencies.any { it.sourceDependencies is ResultWithDiagnostics.Failure }) {
|
||||||
return failure(messageCollector)
|
return failure(messageCollector)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package kotlin.scripting.fibonacci
|
package org.jetbrains.kotlin.scripting.fibonacci
|
||||||
// this script expected parameter num : Int
|
// this script expected parameter num : Int
|
||||||
|
|
||||||
fun fib(n: Int): Int {
|
fun fib(n: Int): Int {
|
||||||
|
|||||||
Reference in New Issue
Block a user