1
1
package systems.danger.kts
2
2
3
- import kotlinx.coroutines.runBlocking
4
3
import org.jetbrains.kotlin.mainKts.*
5
- import org.jetbrains.kotlin.mainKts.impl.IvyResolver
6
4
import java.io.File
7
5
import kotlin.script.dependencies.ScriptContents
8
6
import kotlin.script.dependencies.ScriptDependenciesResolver
9
7
import kotlin.script.experimental.annotations.KotlinScript
10
8
import kotlin.script.experimental.api.*
11
9
import kotlin.script.experimental.dependencies.*
10
+ import kotlin.script.experimental.dependencies.maven.MavenDependenciesResolver
12
11
import kotlin.script.experimental.host.FileBasedScriptSource
13
12
import kotlin.script.experimental.host.FileScriptSource
13
+ import kotlin.script.experimental.impl.internalScriptingRunSuspend
14
14
import kotlin.script.experimental.jvm.compat.mapLegacyDiagnosticSeverity
15
15
import kotlin.script.experimental.jvm.compat.mapLegacyScriptPosition
16
16
import kotlin.script.experimental.jvm.dependenciesFromClassContext
@@ -32,7 +32,7 @@ abstract class DangerFileScript(val args: Array<String>)
32
32
33
33
object DangerFileScriptDefinition : ScriptCompilationConfiguration(
34
34
{
35
- defaultImports(DependsOn ::class, Repository ::class, Import ::class, CompilerOptions ::class)
35
+ defaultImports(DependsOn ::class, Repository ::class, Import ::class, CompilerOptions ::class, ScriptFileLocation ::class )
36
36
jvm {
37
37
dependenciesFromClassContext(
38
38
DangerFileScriptDefinition ::class,
@@ -49,6 +49,8 @@ object DangerFileScriptDefinition : ScriptCompilationConfiguration(
49
49
CompilerOptions ::class,
50
50
handler = DangerFileKtsConfigurator ()
51
51
)
52
+ onAnnotations(ScriptFileLocation ::class, handler = ScriptFileLocationCustomConfigurator ())
53
+ beforeCompiling(::configureScriptFileLocationPathVariablesForCompilation)
52
54
beforeCompiling(::configureProvidedPropertiesFromJsr223Context)
53
55
}
54
56
ide {
@@ -64,7 +66,8 @@ class DangerFileKtsConfigurator : RefineScriptCompilationConfigurationHandler {
64
66
65
67
private val resolver = CompoundDependenciesResolver (
66
68
FileSystemDependenciesResolver (DANGER_LIBS_FLAT_DIR ),
67
- IvyResolver ()
69
+ FileSystemDependenciesResolver (),
70
+ MavenDependenciesResolver ()
68
71
)
69
72
70
73
override operator fun invoke (context : ScriptConfigurationRefinementContext ): ResultWithDiagnostics <ScriptCompilationConfiguration > =
@@ -89,28 +92,44 @@ class DangerFileKtsConfigurator : RefineScriptCompilationConfigurationHandler {
89
92
? : return context.compilationConfiguration.asSuccess()
90
93
91
94
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
+ }
95
111
}
96
112
}
113
+ if (hasImportErrors) return ResultWithDiagnostics .Failure (diagnostics)
114
+
97
115
val compileOptions = annotations.filterByAnnotationType<CompilerOptions >().flatMap {
98
116
it.annotation.options.toList()
99
117
}
100
118
101
119
val resolveResult = try {
102
- runBlocking {
120
+ @Suppress(" DEPRECATION_ERROR" )
121
+ internalScriptingRunSuspend {
103
122
resolver.resolveFromScriptSourceAnnotations(annotations.filter { it.annotation is DependsOn || it.annotation is Repository })
104
123
}
105
-
106
124
} 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)
108
127
}
109
128
110
129
return resolveResult.onSuccess { resolvedClassPath ->
111
130
ScriptCompilationConfiguration (context.compilationConfiguration) {
112
131
updateClasspath(resolvedClassPath)
113
- if (importedSources.isNotEmpty()) importScripts.append(importedSources)
132
+ if (importedSources.isNotEmpty()) importScripts.append(importedSources.values.map { FileScriptSource (it.first) } )
114
133
if (compileOptions.isNotEmpty()) compilerOptions.append(compileOptions)
115
134
}.asSuccess()
116
135
}
0 commit comments