Skip to content
This repository has been archived by the owner on Aug 19, 2020. It is now read-only.

Commit

Permalink
Merge pull request #972 from gradle/eskatos/intellij-resolver/remove-…
Browse files Browse the repository at this point in the history
…short-circuit

Let buildSrc changes be reflected in IntelliJ script editor instantly
  • Loading branch information
eskatos committed Jul 17, 2018
2 parents 716ce85 + a5105d9 commit 5c39c87
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 193 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,7 @@ class PrecompiledScriptDependenciesResolver : ScriptDependenciesResolver {
KotlinBuildScriptDependencies(
imports = implicitImportsFrom(environment),
classpath = emptyList(),
sources = emptyList(),
buildscriptBlockHash = null))
sources = emptyList()))

private
fun implicitImportsFrom(environment: Environment?) =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,6 @@ import org.gradle.kotlin.dsl.tooling.models.KotlinBuildScriptModel

import java.io.File
import java.net.URI
import java.security.MessageDigest
import java.util.Arrays.equals

import kotlin.coroutines.experimental.Continuation
import kotlin.coroutines.experimental.suspendCoroutine
Expand Down Expand Up @@ -74,24 +72,11 @@ class KotlinBuildScriptDependenciesResolver : ScriptDependenciesResolver {

try {
log(ResolutionRequest(script.file, environment, previousDependencies))
val action = ResolverCoordinator.selectNextActionFor(script, environment, previousDependencies)
when (action) {
is ResolverAction.Return -> {
action.dependencies
}
is ResolverAction.ReturnPrevious -> {
log(ResolvedToPrevious(script.file, previousDependencies))
previousDependencies
}
is ResolverAction.RequestNew -> {
assembleDependenciesFrom(
script.file,
environment!!,
report,
previousDependencies,
action.buildscriptBlockHash)
}
}
assembleDependenciesFrom(
script.file,
environment!!,
report,
previousDependencies)
} catch (e: Exception) {
if (previousDependencies == null) report.error("Script dependencies resolution failed")
else report.warning("Script dependencies resolution failed, using previous dependencies")
Expand All @@ -105,8 +90,7 @@ class KotlinBuildScriptDependenciesResolver : ScriptDependenciesResolver {
scriptFile: File?,
environment: Environment,
report: Report,
previousDependencies: KotlinScriptExternalDependencies?,
buildscriptBlockHash: ByteArray?
previousDependencies: KotlinScriptExternalDependencies?
): KotlinScriptExternalDependencies {

val request = modelRequestFrom(scriptFile, environment)
Expand All @@ -117,7 +101,7 @@ class KotlinBuildScriptDependenciesResolver : ScriptDependenciesResolver {

return when {
response.exceptions.isEmpty() ->
dependenciesFrom(response, buildscriptBlockHash).also {
dependenciesFrom(response).also {
log(ResolvedDependencies(scriptFile, it))
}
previousDependencies != null && previousDependencies.classpath.count() > response.classPath.size ->
Expand All @@ -126,7 +110,7 @@ class KotlinBuildScriptDependenciesResolver : ScriptDependenciesResolver {
log(ResolvedToPreviousWithErrors(scriptFile, previousDependencies, response.exceptions))
}
else ->
dependenciesFrom(response, buildscriptBlockHash).also {
dependenciesFrom(response).also {
report.warning("There were some errors during script dependencies resolution, some dependencies might be missing")
log(ResolvedDependenciesWithErrors(scriptFile, it, response.exceptions))
}
Expand Down Expand Up @@ -162,103 +146,24 @@ class KotlinBuildScriptDependenciesResolver : ScriptDependenciesResolver {
?: GradleInstallation.Wrapper

private
fun dependenciesFrom(
response: KotlinBuildScriptModel,
hash: ByteArray?
) =

fun dependenciesFrom(response: KotlinBuildScriptModel) =
KotlinBuildScriptDependencies(
response.classPath,
response.sourcePath,
response.implicitImports,
hash)
response.implicitImports
)

private
fun log(event: ResolverEvent) =
ResolverEventLogger.log(event)
}


/**
* The resolver can either return the previous result
* or request new dependency information from Gradle.
*/
internal
sealed class ResolverAction {
object ReturnPrevious : ResolverAction()
class RequestNew(val buildscriptBlockHash: ByteArray?) : ResolverAction()
class Return(val dependencies: KotlinScriptExternalDependencies?) : ResolverAction()
}


internal
object ResolverCoordinator {

/**
* Decides which action the resolver should take based on the given [script] and [environment].
*/
fun selectNextActionFor(
script: ScriptContents,
environment: Environment?,
previousDependencies: KotlinScriptExternalDependencies?
): ResolverAction {

if (environment == null) {
return ResolverAction.ReturnPrevious
}

val buildscriptBlockHash = buildscriptBlockHashFor(script, environment)
if (sameBuildscriptBlockHashAs(previousDependencies, buildscriptBlockHash)) {
return ResolverAction.ReturnPrevious
}

return ResolverAction.RequestNew(buildscriptBlockHash)
}

private
fun sameBuildscriptBlockHashAs(previousDependencies: KotlinScriptExternalDependencies?, hash: ByteArray?) =
hash?.let { nonNullHash -> buildscriptBlockHashOf(previousDependencies)?.let { equals(it, nonNullHash) } }
?: false

private
fun buildscriptBlockHashOf(previousDependencies: KotlinScriptExternalDependencies?) =
(previousDependencies as? KotlinBuildScriptDependencies)?.buildscriptBlockHash

private
fun buildscriptBlockHashFor(script: ScriptContents, environment: Environment): ByteArray? {

@Suppress("unchecked_cast")
val getScriptSectionTokens = environment["getScriptSectionTokens"] as? ScriptSectionTokensProvider
return when (getScriptSectionTokens) {
null -> null
else ->
MessageDigest.getInstance("MD5").run {
val text = script.text ?: script.file?.readText()
text?.let { nonNullText ->
fun updateWith(section: String) =
getScriptSectionTokens(nonNullText, section).forEach {
update(it.toString().toByteArray())
}
updateWith("buildscript")
updateWith("plugins")
}
digest()
}
}
}
}


internal
typealias ScriptSectionTokensProvider = (CharSequence, String) -> Sequence<CharSequence>


internal
class KotlinBuildScriptDependencies(
override val classpath: Iterable<File>,
override val sources: Iterable<File>,
override val imports: Iterable<String>,
val buildscriptBlockHash: ByteArray?
override val imports: Iterable<String>
) : KotlinScriptExternalDependencies


Expand Down

This file was deleted.

0 comments on commit 5c39c87

Please sign in to comment.