Scripting: report error on duplicate import

#KT-48177 fixed
(due to the path normalization)
This commit is contained in:
Ilya Chernikov
2021-08-17 11:40:03 +02:00
committed by TeamCityServer
parent 306a035c68
commit c204d7a86f
3 changed files with 32 additions and 5 deletions
@@ -121,6 +121,12 @@ class MainKtsTest {
Assert.assertEquals(OUT_FROM_IMPORT_TEST, out)
}
@Test
fun testDuplicateImportError() {
val res = evalFile(File("$TEST_DATA_ROOT/import-duplicate-test.main.kts"))
assertFailed("Duplicate imports:", res)
}
@Test
fun testCompilerOptions() {
@@ -0,0 +1,5 @@
@file:Import("import-common.main.kts")
@file:Import("../testData/import-common.main.kts")
sharedVar = sharedVar + 1
@@ -125,11 +125,26 @@ class MainKtsConfigurator : RefineScriptCompilationConfigurationHandler {
?: return context.compilationConfiguration.asSuccess()
val scriptBaseDir = (context.script as? FileBasedScriptSource)?.file?.parentFile
val importedSources = annotations.filterByAnnotationType<Import>().flatMap {
it.annotation.paths.map { sourceName ->
FileScriptSource(scriptBaseDir?.resolve(sourceName) ?: File(sourceName))
val importedSources = linkedMapOf<String, Pair<File, String>>()
var hasImportErrors = false
annotations.filterByAnnotationType<Import>().forEach { scriptAnnotation ->
scriptAnnotation.annotation.paths.forEach { sourceName ->
val file = (scriptBaseDir?.resolve(sourceName) ?: File(sourceName)).normalize()
val keyPath = file.absolutePath
val prevImport = importedSources.put(keyPath, file to sourceName)
if (prevImport != null) {
diagnostics.add(
ScriptDiagnostic(
ScriptDiagnostic.unspecifiedError, "Duplicate imports: \"${prevImport.second}\" and \"$sourceName\"",
sourcePath = context.script.locationId, location = scriptAnnotation.location?.locationInText
)
)
hasImportErrors = true
}
}
}
if (hasImportErrors) return ResultWithDiagnostics.Failure(diagnostics)
val compileOptions = annotations.filterByAnnotationType<CompilerOptions>().flatMap {
it.annotation.options.toList()
}
@@ -140,13 +155,14 @@ class MainKtsConfigurator : RefineScriptCompilationConfigurationHandler {
resolver.resolveFromScriptSourceAnnotations(annotations.filter { it.annotation is DependsOn || it.annotation is Repository })
}
} catch (e: Throwable) {
ResultWithDiagnostics.Failure(*diagnostics.toTypedArray(), e.asDiagnostics(path = context.script.locationId))
diagnostics.add(e.asDiagnostics(path = context.script.locationId))
ResultWithDiagnostics.Failure(diagnostics)
}
return resolveResult.onSuccess { resolvedClassPath ->
ScriptCompilationConfiguration(context.compilationConfiguration) {
updateClasspath(resolvedClassPath)
if (importedSources.isNotEmpty()) importScripts.append(importedSources)
if (importedSources.isNotEmpty()) importScripts.append(importedSources.values.map { FileScriptSource(it.first) })
if (compileOptions.isNotEmpty()) compilerOptions.append(compileOptions)
}.asSuccess()
}