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(
name = "kotlin-script-dependencies",
version = 4,
version = 5,
read = { readObject<ScriptConfigurationSnapshotForFS>() },
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)
* @see GradleScriptInputsWatcher.areRelatedFilesUpToDate
*
* [inputsTimeStamp] is needed to check if some related file was changed between updates
* [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
* [inputsTS] is needed to check if some related file was changed since last update
*/
data class GradleKotlinScriptConfigurationInputs(
val sections: String,
val inputsTimeStamp: Long,
val relatedFilesTimeStamp: Long
val inputsTS: Long
) : CachedConfigurationInputs {
override fun isUpToDate(project: Project, file: VirtualFile, ktFile: KtFile?): Boolean {
val actualStamp = getGradleScriptInputsStamp(project, file, ktFile) ?: return false
if (actualStamp.sections != this.sections) return false
if (actualStamp.relatedFilesTimeStamp == this.relatedFilesTimeStamp) return true
return project.service<GradleScriptInputsWatcher>().areRelatedFilesUpToDate(file, inputsTimeStamp)
return project.service<GradleScriptInputsWatcher>().areRelatedFilesUpToDate(file, inputsTS)
}
}
@@ -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 {
return lastModifiedFileTimeStamp(file) < timeStamp
return storage.lastModifiedTimeStampExcept(file) < timeStamp
}
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.project.ProjectData
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
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(
val file: String,
val inputsTimeStamp: Long,
val classPath: List<String>,
val sourcePath: List<String>,
val imports: List<String>,
@@ -69,8 +69,7 @@ class KotlinDslScriptModelDataService : AbstractProjectDataService<ProjectData,
val scriptFile = File(buildScript.file)
val virtualFile = VfsUtil.findFile(scriptFile.toPath(), true)!!
// todo(KT-34440): take inputs snapshot before starting import
val inputs = getGradleScriptInputsStamp(project, virtualFile)
val inputs = getGradleScriptInputsStamp(project, virtualFile, givenTimeStamp = buildScript.inputsTimeStamp)
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(
file.absolutePath,
System.currentTimeMillis(),
model.classPath.map { it.absolutePath },
model.sourcePath.map { it.absolutePath },
model.implicitImports,
@@ -56,7 +56,8 @@ fun getAffectedGradleProjectFiles(project: Project): List<File> {
fun getGradleScriptInputsStamp(
project: Project,
file: VirtualFile,
givenKtFile: KtFile? = null
givenKtFile: KtFile? = null,
givenTimeStamp: Long = System.currentTimeMillis()
): GradleKotlinScriptConfigurationInputs? {
if (!isGradleKotlinScript(file)) return null
@@ -87,8 +88,7 @@ fun getGradleScriptInputsStamp(
}
}
val relatedFilesTimeStamp = project.service<GradleScriptInputsWatcher>().lastModifiedFileTimeStamp(file)
GradleKotlinScriptConfigurationInputs(result.toString(), file.timeStamp, relatedFilesTimeStamp)
GradleKotlinScriptConfigurationInputs(result.toString(), givenTimeStamp)
} else null
}
}