Clarify API so that it's possible to get single KotlinScriptExternalDependencies per script file

This commit is contained in:
Pavel V. Talanov
2016-07-13 17:56:29 +03:00
committed by Ilya Chernikov
parent 59712d4bf8
commit 500554e58c
4 changed files with 19 additions and 22 deletions
@@ -72,8 +72,10 @@ class FileScopeFactory(
val explicitImportResolver = createImportResolver(ExplicitImportsIndexed(imports), bindingTrace)
val allUnderImportResolver = createImportResolver(AllUnderImportsIndexed(imports), bindingTrace)
val extraImports = file.originalFile.virtualFile?.let { getScriptExternalDependencies(it, file.project) }
?.flatMap { ktImportsFactory.createImportDirectives(it.imports.map { ImportPath(it) }) }
val extraImports = file.originalFile.virtualFile?.let { vFile ->
val scriptExternalDependencies = getScriptExternalDependencies(vFile, file.project)
ktImportsFactory.createImportDirectives(scriptExternalDependencies?.imports?.map { ImportPath(it) }.orEmpty())
}
val allImplicitImports = defaultImports + extraImports.orEmpty()
@@ -29,16 +29,20 @@ class KotlinScriptExternalImportsProvider(val project: Project, private val scri
private val cache = hashMapOf<String, KotlinScriptExternalDependencies>()
private val cacheOfNulls = hashSetOf<String>()
fun <TF> getExternalImports(vararg files: TF): List<KotlinScriptExternalDependencies> = getExternalImports(files.asIterable())
fun <TF> getExternalImports(file: TF): KotlinScriptExternalDependencies? = cacheLock.read { calculateExternalDependencies(file) }
fun <TF> getExternalImports(files: Iterable<TF>): List<KotlinScriptExternalDependencies> = cacheLock.read {
files.mapNotNull { file ->
val path = getFilePath(file)
cache[path]
?: if (cacheOfNulls.contains(path)) null
files.mapNotNull { calculateExternalDependencies(it) }
}
private fun <TF> calculateExternalDependencies(file: TF): KotlinScriptExternalDependencies? {
val path = getFilePath(file)
return cache[path]
?: if (cacheOfNulls.contains(path)) null
else scriptDefinitionProvider.findScriptDefinition(file)
?.let { it.getDependenciesFor(file, project, null) }
.apply { cacheLock.write {
?.let { it.getDependenciesFor(file, project, null) }
.apply {
cacheLock.write {
if (this == null) {
cacheOfNulls.add(path)
}
@@ -46,8 +50,7 @@ class KotlinScriptExternalImportsProvider(val project: Project, private val scri
cache.put(path, this)
}
}
}
}
}
}
// optimized for initial caching, additional handling of possible duplicates to save a call to distinct
@@ -26,11 +26,5 @@ fun getScriptDefinition(file: VirtualFile, project: Project): KotlinScriptDefini
fun getScriptDefinition(psiFile: PsiFile): KotlinScriptDefinition? =
KotlinScriptDefinitionProvider.getInstance(psiFile.project).findScriptDefinition(psiFile)
fun getScriptExternalDependencies(file: VirtualFile, project: Project): List<KotlinScriptExternalDependencies> =
KotlinScriptExternalImportsProvider.getInstance(project)?.getExternalImports(file) ?: emptyList()
fun getScriptExternalDependencies(psiFile: PsiFile): List<KotlinScriptExternalDependencies> =
psiFile.virtualFile?.let { file ->
KotlinScriptExternalImportsProvider.getInstance(psiFile.project)?.getExternalImports(file)
} ?: emptyList()
fun getScriptExternalDependencies(file: VirtualFile, project: Project): KotlinScriptExternalDependencies? =
KotlinScriptExternalImportsProvider.getInstance(project)?.getExternalImports(file)
@@ -87,9 +87,7 @@ class KotlinScriptConfigurationManager(
}
fun getScriptClasspath(file: VirtualFile): List<VirtualFile> =
scriptExternalImportsProvider.getExternalImports(file)
.flatMap { it.classpath }
.mapNotNull { it.classpathEntryToVfs() }
scriptExternalImportsProvider.getExternalImports(file)?.classpath?.mapNotNull { it.classpathEntryToVfs() } ?: emptyList()
fun getAllScriptsClasspath(): List<VirtualFile> = allScriptsClasspathCache.get()