Scripting: report error on duplicate import
#KT-48177 fixed (due to the path normalization)
This commit is contained in:
committed by
TeamCityServer
parent
306a035c68
commit
c204d7a86f
+6
@@ -121,6 +121,12 @@ class MainKtsTest {
|
|||||||
Assert.assertEquals(OUT_FROM_IMPORT_TEST, out)
|
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
|
@Test
|
||||||
fun testCompilerOptions() {
|
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()
|
?: return context.compilationConfiguration.asSuccess()
|
||||||
|
|
||||||
val scriptBaseDir = (context.script as? FileBasedScriptSource)?.file?.parentFile
|
val scriptBaseDir = (context.script as? FileBasedScriptSource)?.file?.parentFile
|
||||||
val importedSources = annotations.filterByAnnotationType<Import>().flatMap {
|
val importedSources = linkedMapOf<String, Pair<File, String>>()
|
||||||
it.annotation.paths.map { sourceName ->
|
var hasImportErrors = false
|
||||||
FileScriptSource(scriptBaseDir?.resolve(sourceName) ?: File(sourceName))
|
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 {
|
val compileOptions = annotations.filterByAnnotationType<CompilerOptions>().flatMap {
|
||||||
it.annotation.options.toList()
|
it.annotation.options.toList()
|
||||||
}
|
}
|
||||||
@@ -140,13 +155,14 @@ class MainKtsConfigurator : RefineScriptCompilationConfigurationHandler {
|
|||||||
resolver.resolveFromScriptSourceAnnotations(annotations.filter { it.annotation is DependsOn || it.annotation is Repository })
|
resolver.resolveFromScriptSourceAnnotations(annotations.filter { it.annotation is DependsOn || it.annotation is Repository })
|
||||||
}
|
}
|
||||||
} catch (e: Throwable) {
|
} 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 ->
|
return resolveResult.onSuccess { resolvedClassPath ->
|
||||||
ScriptCompilationConfiguration(context.compilationConfiguration) {
|
ScriptCompilationConfiguration(context.compilationConfiguration) {
|
||||||
updateClasspath(resolvedClassPath)
|
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)
|
if (compileOptions.isNotEmpty()) compilerOptions.append(compileOptions)
|
||||||
}.asSuccess()
|
}.asSuccess()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user