@@ -30,6 +30,8 @@ import org.jetbrains.kotlin.psi.KtScript
30
30
import org.jetbrains.kotlin.types.KotlinType
31
31
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
32
32
import java.io.File
33
+ import java.util.concurrent.Future
34
+ import java.util.concurrent.TimeUnit
33
35
import kotlin.reflect.*
34
36
35
37
const val DEFAULT_SCRIPT_FILE_PATTERN = " *.\\ .kts"
@@ -50,17 +52,34 @@ annotation class ScriptFilePattern(val pattern: String)
50
52
annotation class ScriptDependencyResolver (val resolver : KClass <out ScriptDependenciesResolver >)
51
53
52
54
interface ScriptContents {
55
+
56
+ data class Position (val line : Int , val col : Int )
57
+
53
58
val file: File ?
54
59
val annotations: Iterable <Annotation >
55
60
val text: CharSequence?
56
61
}
57
62
63
+ class PseudoFuture <T >(private val value : T ): Future<T> {
64
+ override fun get (): T = value
65
+ override fun get (p0 : Long , p1 : TimeUnit ): T = value
66
+ override fun cancel (p0 : Boolean ): Boolean = false
67
+ override fun isDone (): Boolean = true
68
+ override fun isCancelled (): Boolean = false
69
+ }
70
+
71
+ fun KotlinScriptExternalDependencies?.asFuture (): PseudoFuture <KotlinScriptExternalDependencies ?> = PseudoFuture (this )
72
+
58
73
// TODO: rename to just ScriptDependenciesResolver as soon as current deprecated one will be dropped
59
74
interface ScriptDependenciesResolverEx {
75
+
76
+ enum class ReportSeverity { ERROR , WARNING , INFO , DEBUG }
77
+
60
78
fun resolve (script : ScriptContents ,
61
79
environment : Map <String , Any ?>? ,
62
- previousDependencies : KotlinScriptExternalDependencies ? = null
63
- ): KotlinScriptExternalDependencies ? = null
80
+ report : (ReportSeverity , String , ScriptContents .Position ? ) -> Unit ,
81
+ previousDependencies : KotlinScriptExternalDependencies ?
82
+ ): Future <KotlinScriptExternalDependencies ?> = PseudoFuture (null )
64
83
}
65
84
66
85
@Deprecated(" Use new ScriptDependenciesResolverEx" )
@@ -108,14 +127,16 @@ data class KotlinScriptDefinitionFromTemplate(val template: KClass<out Any>,
108
127
private val resolver by lazy { resolverAnn?.resolver?.primaryConstructor?.call() }
109
128
override fun resolve (script : ScriptContents ,
110
129
environment : Map <String , Any ?>? ,
130
+ report : (ScriptDependenciesResolverEx .ReportSeverity , String , ScriptContents .Position ? ) -> Unit ,
111
131
previousDependencies : KotlinScriptExternalDependencies ?
112
- ): KotlinScriptExternalDependencies ? =
132
+ ): Future < KotlinScriptExternalDependencies ?> =
113
133
resolver?.resolve(
114
134
environment?.get(" projectRoot" ) as ? File ? ,
115
135
script.file,
116
136
emptyList(),
117
137
environment as Any?
118
138
)
139
+ .asFuture()
119
140
}
120
141
121
142
private val definitionData by lazy {
@@ -158,8 +179,11 @@ data class KotlinScriptDefinitionFromTemplate(val template: KClass<out Any>,
158
179
psiAnn.typeName.let { it == ann.simpleName || it == ann.qualifiedName }
159
180
}?.let { KtAnnotationWrapper (psiAnn, classLoader.loadClass(it.qualifiedName).kotlin as KClass <out Annotation >) }
160
181
}
161
- val fileDeps = definitionData.resolver?.resolve(BasicScriptContents (file, annotationWrappers.map { it.getProxy(classLoader) }), environment, previousDependencies)
162
- return fileDeps
182
+ val fileDeps = definitionData.resolver?.resolve(BasicScriptContents (file, annotationWrappers.map { it.getProxy(classLoader) }),
183
+ environment,
184
+ { reportSeverity: ScriptDependenciesResolverEx .ReportSeverity , s: String , position: ScriptContents .Position ? -> },
185
+ previousDependencies)
186
+ return fileDeps?.get()
163
187
}
164
188
165
189
private fun <TF > getAnnotationEntries (file : TF , project : Project ): Iterable <KtAnnotationEntry > = when (file) {
0 commit comments