11package systems.danger.kts
22
3- import kotlinx.coroutines.runBlocking
43import org.jetbrains.kotlin.mainKts.*
5- import org.jetbrains.kotlin.mainKts.impl.IvyResolver
64import java.io.File
75import kotlin.script.dependencies.ScriptContents
86import kotlin.script.dependencies.ScriptDependenciesResolver
97import kotlin.script.experimental.annotations.KotlinScript
108import kotlin.script.experimental.api.*
119import kotlin.script.experimental.dependencies.*
10+ import kotlin.script.experimental.dependencies.maven.MavenDependenciesResolver
1211import kotlin.script.experimental.host.FileBasedScriptSource
1312import kotlin.script.experimental.host.FileScriptSource
13+ import kotlin.script.experimental.impl.internalScriptingRunSuspend
1414import kotlin.script.experimental.jvm.compat.mapLegacyDiagnosticSeverity
1515import kotlin.script.experimental.jvm.compat.mapLegacyScriptPosition
1616import kotlin.script.experimental.jvm.dependenciesFromClassContext
@@ -32,7 +32,7 @@ abstract class DangerFileScript(val args: Array<String>)
3232
3333object DangerFileScriptDefinition : ScriptCompilationConfiguration(
3434 {
35- defaultImports(DependsOn ::class, Repository ::class, Import ::class, CompilerOptions ::class)
35+ defaultImports(DependsOn ::class, Repository ::class, Import ::class, CompilerOptions ::class, ScriptFileLocation ::class )
3636 jvm {
3737 dependenciesFromClassContext(
3838 DangerFileScriptDefinition ::class,
@@ -49,6 +49,8 @@ object DangerFileScriptDefinition : ScriptCompilationConfiguration(
4949 CompilerOptions ::class,
5050 handler = DangerFileKtsConfigurator ()
5151 )
52+ onAnnotations(ScriptFileLocation ::class, handler = ScriptFileLocationCustomConfigurator ())
53+ beforeCompiling(::configureScriptFileLocationPathVariablesForCompilation)
5254 beforeCompiling(::configureProvidedPropertiesFromJsr223Context)
5355 }
5456 ide {
@@ -64,7 +66,8 @@ class DangerFileKtsConfigurator : RefineScriptCompilationConfigurationHandler {
6466
6567 private val resolver = CompoundDependenciesResolver (
6668 FileSystemDependenciesResolver (DANGER_LIBS_FLAT_DIR ),
67- IvyResolver ()
69+ FileSystemDependenciesResolver (),
70+ MavenDependenciesResolver ()
6871 )
6972
7073 override operator fun invoke (context : ScriptConfigurationRefinementContext ): ResultWithDiagnostics <ScriptCompilationConfiguration > =
@@ -89,28 +92,44 @@ class DangerFileKtsConfigurator : RefineScriptCompilationConfigurationHandler {
8992 ? : return context.compilationConfiguration.asSuccess()
9093
9194 val scriptBaseDir = (context.script as ? FileBasedScriptSource )?.file?.parentFile
92- val importedSources = annotations.filterByAnnotationType<Import >().flatMap {
93- it.annotation.paths.map { sourceName ->
94- FileScriptSource (scriptBaseDir?.resolve(sourceName) ? : File (sourceName))
95+ val importedSources = linkedMapOf<String , Pair <File , String >>()
96+ var hasImportErrors = false
97+ annotations.filterByAnnotationType<Import >().forEach { scriptAnnotation ->
98+ scriptAnnotation.annotation.paths.forEach { sourceName ->
99+ val file = (scriptBaseDir?.resolve(sourceName) ? : File (sourceName)).normalize()
100+ val keyPath = file.absolutePath
101+ val prevImport = importedSources.put(keyPath, file to sourceName)
102+ if (prevImport != null ) {
103+ diagnostics.add(
104+ ScriptDiagnostic (
105+ ScriptDiagnostic .unspecifiedError, " Duplicate imports: \" ${prevImport.second} \" and \" $sourceName \" " ,
106+ sourcePath = context.script.locationId, location = scriptAnnotation.location?.locationInText
107+ )
108+ )
109+ hasImportErrors = true
110+ }
95111 }
96112 }
113+ if (hasImportErrors) return ResultWithDiagnostics .Failure (diagnostics)
114+
97115 val compileOptions = annotations.filterByAnnotationType<CompilerOptions >().flatMap {
98116 it.annotation.options.toList()
99117 }
100118
101119 val resolveResult = try {
102- runBlocking {
120+ @Suppress(" DEPRECATION_ERROR" )
121+ internalScriptingRunSuspend {
103122 resolver.resolveFromScriptSourceAnnotations(annotations.filter { it.annotation is DependsOn || it.annotation is Repository })
104123 }
105-
106124 } catch (e: Throwable ) {
107- ResultWithDiagnostics .Failure (* diagnostics.toTypedArray(), e.asDiagnostics(path = context.script.locationId))
125+ diagnostics.add(e.asDiagnostics(path = context.script.locationId))
126+ ResultWithDiagnostics .Failure (diagnostics)
108127 }
109128
110129 return resolveResult.onSuccess { resolvedClassPath ->
111130 ScriptCompilationConfiguration (context.compilationConfiguration) {
112131 updateClasspath(resolvedClassPath)
113- if (importedSources.isNotEmpty()) importScripts.append(importedSources)
132+ if (importedSources.isNotEmpty()) importScripts.append(importedSources.values.map { FileScriptSource (it.first) } )
114133 if (compileOptions.isNotEmpty()) compilerOptions.append(compileOptions)
115134 }.asSuccess()
116135 }
0 commit comments