Change dependencies resolver API - it gets message reporter and returns Future now
This commit is contained in:
@@ -30,6 +30,8 @@ import org.jetbrains.kotlin.psi.KtScript
|
|||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
|
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import java.util.concurrent.Future
|
||||||
|
import java.util.concurrent.TimeUnit
|
||||||
import kotlin.reflect.*
|
import kotlin.reflect.*
|
||||||
|
|
||||||
const val DEFAULT_SCRIPT_FILE_PATTERN = "*.\\.kts"
|
const val DEFAULT_SCRIPT_FILE_PATTERN = "*.\\.kts"
|
||||||
@@ -50,17 +52,34 @@ annotation class ScriptFilePattern(val pattern: String)
|
|||||||
annotation class ScriptDependencyResolver(val resolver: KClass<out ScriptDependenciesResolver>)
|
annotation class ScriptDependencyResolver(val resolver: KClass<out ScriptDependenciesResolver>)
|
||||||
|
|
||||||
interface ScriptContents {
|
interface ScriptContents {
|
||||||
|
|
||||||
|
data class Position(val line: Int, val col: Int)
|
||||||
|
|
||||||
val file: File?
|
val file: File?
|
||||||
val annotations: Iterable<Annotation>
|
val annotations: Iterable<Annotation>
|
||||||
val text: CharSequence?
|
val text: CharSequence?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class PseudoFuture<T>(private val value: T): Future<T> {
|
||||||
|
override fun get(): T = value
|
||||||
|
override fun get(p0: Long, p1: TimeUnit): T = value
|
||||||
|
override fun cancel(p0: Boolean): Boolean = false
|
||||||
|
override fun isDone(): Boolean = true
|
||||||
|
override fun isCancelled(): Boolean = false
|
||||||
|
}
|
||||||
|
|
||||||
|
fun KotlinScriptExternalDependencies?.asFuture(): PseudoFuture<KotlinScriptExternalDependencies?> = PseudoFuture(this)
|
||||||
|
|
||||||
// TODO: rename to just ScriptDependenciesResolver as soon as current deprecated one will be dropped
|
// TODO: rename to just ScriptDependenciesResolver as soon as current deprecated one will be dropped
|
||||||
interface ScriptDependenciesResolverEx {
|
interface ScriptDependenciesResolverEx {
|
||||||
|
|
||||||
|
enum class ReportSeverity { ERROR, WARNING, INFO, DEBUG }
|
||||||
|
|
||||||
fun resolve(script: ScriptContents,
|
fun resolve(script: ScriptContents,
|
||||||
environment: Map<String, Any?>?,
|
environment: Map<String, Any?>?,
|
||||||
previousDependencies: KotlinScriptExternalDependencies? = null
|
report: (ReportSeverity, String, ScriptContents.Position?) -> Unit,
|
||||||
): KotlinScriptExternalDependencies? = null
|
previousDependencies: KotlinScriptExternalDependencies?
|
||||||
|
): Future<KotlinScriptExternalDependencies?> = PseudoFuture(null)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated("Use new ScriptDependenciesResolverEx")
|
@Deprecated("Use new ScriptDependenciesResolverEx")
|
||||||
@@ -108,14 +127,16 @@ data class KotlinScriptDefinitionFromTemplate(val template: KClass<out Any>,
|
|||||||
private val resolver by lazy { resolverAnn?.resolver?.primaryConstructor?.call() }
|
private val resolver by lazy { resolverAnn?.resolver?.primaryConstructor?.call() }
|
||||||
override fun resolve(script: ScriptContents,
|
override fun resolve(script: ScriptContents,
|
||||||
environment: Map<String, Any?>?,
|
environment: Map<String, Any?>?,
|
||||||
|
report: (ScriptDependenciesResolverEx.ReportSeverity, String, ScriptContents.Position?) -> Unit,
|
||||||
previousDependencies: KotlinScriptExternalDependencies?
|
previousDependencies: KotlinScriptExternalDependencies?
|
||||||
): KotlinScriptExternalDependencies? =
|
): Future<KotlinScriptExternalDependencies?> =
|
||||||
resolver?.resolve(
|
resolver?.resolve(
|
||||||
environment?.get("projectRoot") as? File?,
|
environment?.get("projectRoot") as? File?,
|
||||||
script.file,
|
script.file,
|
||||||
emptyList(),
|
emptyList(),
|
||||||
environment as Any?
|
environment as Any?
|
||||||
)
|
)
|
||||||
|
.asFuture()
|
||||||
}
|
}
|
||||||
|
|
||||||
private val definitionData by lazy {
|
private val definitionData by lazy {
|
||||||
@@ -158,8 +179,11 @@ data class KotlinScriptDefinitionFromTemplate(val template: KClass<out Any>,
|
|||||||
psiAnn.typeName.let { it == ann.simpleName || it == ann.qualifiedName }
|
psiAnn.typeName.let { it == ann.simpleName || it == ann.qualifiedName }
|
||||||
}?.let { KtAnnotationWrapper(psiAnn, classLoader.loadClass(it.qualifiedName).kotlin as KClass<out Annotation>) }
|
}?.let { KtAnnotationWrapper(psiAnn, classLoader.loadClass(it.qualifiedName).kotlin as KClass<out Annotation>) }
|
||||||
}
|
}
|
||||||
val fileDeps = definitionData.resolver?.resolve(BasicScriptContents(file, annotationWrappers.map { it.getProxy(classLoader) }), environment, previousDependencies)
|
val fileDeps = definitionData.resolver?.resolve(BasicScriptContents(file, annotationWrappers.map { it.getProxy(classLoader) }),
|
||||||
return fileDeps
|
environment,
|
||||||
|
{ reportSeverity: ScriptDependenciesResolverEx.ReportSeverity, s: String, position: ScriptContents.Position? -> },
|
||||||
|
previousDependencies)
|
||||||
|
return fileDeps?.get()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun <TF> getAnnotationEntries(file: TF, project: Project): Iterable<KtAnnotationEntry> = when (file) {
|
private fun <TF> getAnnotationEntries(file: TF, project: Project): Iterable<KtAnnotationEntry> = when (file) {
|
||||||
|
|||||||
@@ -133,8 +133,9 @@ class TestKotlinScriptDependenciesResolver : ScriptDependenciesResolverEx {
|
|||||||
@AcceptedAnnotations(DependsOn::class, DependsOnTwo::class)
|
@AcceptedAnnotations(DependsOn::class, DependsOnTwo::class)
|
||||||
override fun resolve(script: ScriptContents,
|
override fun resolve(script: ScriptContents,
|
||||||
environment: Map<String, Any?>?,
|
environment: Map<String, Any?>?,
|
||||||
|
report: (ScriptDependenciesResolverEx.ReportSeverity, String, ScriptContents.Position?) -> Unit,
|
||||||
previousDependencies: KotlinScriptExternalDependencies?
|
previousDependencies: KotlinScriptExternalDependencies?
|
||||||
): KotlinScriptExternalDependencies?
|
): Future<KotlinScriptExternalDependencies?>
|
||||||
{
|
{
|
||||||
val cp = script.annotations.flatMap {
|
val cp = script.annotations.flatMap {
|
||||||
when (it) {
|
when (it) {
|
||||||
@@ -153,7 +154,7 @@ class TestKotlinScriptDependenciesResolver : ScriptDependenciesResolverEx {
|
|||||||
return object : KotlinScriptExternalDependencies {
|
return object : KotlinScriptExternalDependencies {
|
||||||
override val classpath: Iterable<File> = classpathFromClassloader() + cp
|
override val classpath: Iterable<File> = classpathFromClassloader() + cp
|
||||||
override val imports: Iterable<String> = listOf("org.jetbrains.kotlin.scripts.DependsOn", "org.jetbrains.kotlin.scripts.DependsOnTwo")
|
override val imports: Iterable<String> = listOf("org.jetbrains.kotlin.scripts.DependsOn", "org.jetbrains.kotlin.scripts.DependsOnTwo")
|
||||||
}
|
}.asFuture()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun classpathFromClassloader(): List<File> =
|
private fun classpathFromClassloader(): List<File> =
|
||||||
|
|||||||
Reference in New Issue
Block a user