Clarify API so that it's possible to get single KotlinScriptExternalDependencies per script file
This commit is contained in:
committed by
Ilya Chernikov
parent
59712d4bf8
commit
500554e58c
@@ -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()
|
||||
|
||||
|
||||
+12
-9
@@ -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)
|
||||
+1
-3
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user