Simplify check for that gradle script configurations is up to date

Get time stamp for script inputs before gradle import
This commit is contained in:
Natalia Selezneva
2019-12-19 13:18:04 +03:00
parent 3dfbd824e4
commit 6bf0e4b1a9
7 changed files with 12 additions and 20 deletions
@@ -102,7 +102,7 @@ private class ScriptConfigurationSnapshotForFS(
private var VirtualFile.scriptConfigurationSnapshot: ScriptConfigurationSnapshotForFS? by cachedFileAttribute( private var VirtualFile.scriptConfigurationSnapshot: ScriptConfigurationSnapshotForFS? by cachedFileAttribute(
name = "kotlin-script-dependencies", name = "kotlin-script-dependencies",
version = 4, version = 5,
read = { readObject<ScriptConfigurationSnapshotForFS>() }, read = { readObject<ScriptConfigurationSnapshotForFS>() },
write = { writeObject<ScriptConfigurationSnapshotForFS>(it) } write = { writeObject<ScriptConfigurationSnapshotForFS>(it) }
) )
@@ -18,23 +18,17 @@ import org.jetbrains.kotlin.psi.KtFile
* 2. When some related file is changed (other gradle script, gradle.properties file) * 2. When some related file is changed (other gradle script, gradle.properties file)
* @see GradleScriptInputsWatcher.areRelatedFilesUpToDate * @see GradleScriptInputsWatcher.areRelatedFilesUpToDate
* *
* [inputsTimeStamp] is needed to check if some related file was changed between updates * [inputsTS] is needed to check if some related file was changed since last update
* [relatedFilesTimeStamp] is needed to check if we already loaded a configuration after the last related file change
*
* In case when [relatedFilesTimeStamp]s are equal there is no needs to check if related files were changed
*/ */
data class GradleKotlinScriptConfigurationInputs( data class GradleKotlinScriptConfigurationInputs(
val sections: String, val sections: String,
val inputsTimeStamp: Long, val inputsTS: Long
val relatedFilesTimeStamp: Long
) : CachedConfigurationInputs { ) : CachedConfigurationInputs {
override fun isUpToDate(project: Project, file: VirtualFile, ktFile: KtFile?): Boolean { override fun isUpToDate(project: Project, file: VirtualFile, ktFile: KtFile?): Boolean {
val actualStamp = getGradleScriptInputsStamp(project, file, ktFile) ?: return false val actualStamp = getGradleScriptInputsStamp(project, file, ktFile) ?: return false
if (actualStamp.sections != this.sections) return false if (actualStamp.sections != this.sections) return false
if (actualStamp.relatedFilesTimeStamp == this.relatedFilesTimeStamp) return true return project.service<GradleScriptInputsWatcher>().areRelatedFilesUpToDate(file, inputsTS)
return project.service<GradleScriptInputsWatcher>().areRelatedFilesUpToDate(file, inputsTimeStamp)
} }
} }
@@ -40,10 +40,8 @@ class GradleScriptInputsWatcher(val project: Project) : PersistentStateComponent
} }
} }
fun lastModifiedFileTimeStamp(file: VirtualFile): Long = storage.lastModifiedTimeStampExcept(file)
fun areRelatedFilesUpToDate(file: VirtualFile, timeStamp: Long): Boolean { fun areRelatedFilesUpToDate(file: VirtualFile, timeStamp: Long): Boolean {
return lastModifiedFileTimeStamp(file) < timeStamp return storage.lastModifiedTimeStampExcept(file) < timeStamp
} }
class Storage( class Storage(
@@ -8,8 +8,6 @@ package org.jetbrains.kotlin.idea.scripting.gradle.importing
import com.intellij.openapi.externalSystem.model.DataNode import com.intellij.openapi.externalSystem.model.DataNode
import com.intellij.openapi.externalSystem.model.project.ProjectData import com.intellij.openapi.externalSystem.model.project.ProjectData
import com.intellij.openapi.util.Key import com.intellij.openapi.util.Key
import org.gradle.tooling.model.kotlin.dsl.EditorReportSeverity
import org.gradle.tooling.model.kotlin.dsl.KotlinDslScriptsModel
import org.jetbrains.kotlin.idea.util.NotNullableCopyableDataNodeUserDataProperty import org.jetbrains.kotlin.idea.util.NotNullableCopyableDataNodeUserDataProperty
var DataNode<out ProjectData>.KOTLIN_DSL_SCRIPT_MODELS: MutableList<KotlinDslScriptModel> var DataNode<out ProjectData>.KOTLIN_DSL_SCRIPT_MODELS: MutableList<KotlinDslScriptModel>
@@ -22,6 +20,7 @@ var DataNode<out ProjectData>.KOTLIN_DSL_SCRIPT_MODELS: MutableList<KotlinDslScr
data class KotlinDslScriptModel( data class KotlinDslScriptModel(
val file: String, val file: String,
val inputsTimeStamp: Long,
val classPath: List<String>, val classPath: List<String>,
val sourcePath: List<String>, val sourcePath: List<String>,
val imports: List<String>, val imports: List<String>,
@@ -69,8 +69,7 @@ class KotlinDslScriptModelDataService : AbstractProjectDataService<ProjectData,
val scriptFile = File(buildScript.file) val scriptFile = File(buildScript.file)
val virtualFile = VfsUtil.findFile(scriptFile.toPath(), true)!! val virtualFile = VfsUtil.findFile(scriptFile.toPath(), true)!!
// todo(KT-34440): take inputs snapshot before starting import val inputs = getGradleScriptInputsStamp(project, virtualFile, givenTimeStamp = buildScript.inputsTimeStamp)
val inputs = getGradleScriptInputsStamp(project, virtualFile)
val definition = virtualFile.findScriptDefinition(project) ?: return@forEach val definition = virtualFile.findScriptDefinition(project) ?: return@forEach
@@ -61,8 +61,10 @@ abstract class KotlinDslScriptModelResolverCommon : AbstractProjectResolverExten
)) ))
} }
// todo(KT-34440): take inputs snapshot before starting import
KotlinDslScriptModel( KotlinDslScriptModel(
file.absolutePath, file.absolutePath,
System.currentTimeMillis(),
model.classPath.map { it.absolutePath }, model.classPath.map { it.absolutePath },
model.sourcePath.map { it.absolutePath }, model.sourcePath.map { it.absolutePath },
model.implicitImports, model.implicitImports,
@@ -56,7 +56,8 @@ fun getAffectedGradleProjectFiles(project: Project): List<File> {
fun getGradleScriptInputsStamp( fun getGradleScriptInputsStamp(
project: Project, project: Project,
file: VirtualFile, file: VirtualFile,
givenKtFile: KtFile? = null givenKtFile: KtFile? = null,
givenTimeStamp: Long = System.currentTimeMillis()
): GradleKotlinScriptConfigurationInputs? { ): GradleKotlinScriptConfigurationInputs? {
if (!isGradleKotlinScript(file)) return null if (!isGradleKotlinScript(file)) return null
@@ -87,8 +88,7 @@ fun getGradleScriptInputsStamp(
} }
} }
val relatedFilesTimeStamp = project.service<GradleScriptInputsWatcher>().lastModifiedFileTimeStamp(file) GradleKotlinScriptConfigurationInputs(result.toString(), givenTimeStamp)
GradleKotlinScriptConfigurationInputs(result.toString(), file.timeStamp, relatedFilesTimeStamp)
} else null } else null
} }
} }