diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt index 676a5fb2b77..ab32d6f5f91 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt @@ -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() diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptExternalImportsProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptExternalImportsProvider.kt index b3999d3e193..0eb971f3429 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptExternalImportsProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptExternalImportsProvider.kt @@ -29,16 +29,20 @@ class KotlinScriptExternalImportsProvider(val project: Project, private val scri private val cache = hashMapOf() private val cacheOfNulls = hashSetOf() - fun getExternalImports(vararg files: TF): List = getExternalImports(files.asIterable()) + fun getExternalImports(file: TF): KotlinScriptExternalDependencies? = cacheLock.read { calculateExternalDependencies(file) } fun getExternalImports(files: Iterable): List = cacheLock.read { - files.mapNotNull { file -> - val path = getFilePath(file) - cache[path] - ?: if (cacheOfNulls.contains(path)) null + files.mapNotNull { calculateExternalDependencies(it) } + } + + private fun 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 diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/getScriptDefinition.kt b/compiler/frontend/src/org/jetbrains/kotlin/script/getScriptDefinition.kt index 3b7e04ee6ee..93526199ec1 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/getScriptDefinition.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/getScriptDefinition.kt @@ -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 = - KotlinScriptExternalImportsProvider.getInstance(project)?.getExternalImports(file) ?: emptyList() - -fun getScriptExternalDependencies(psiFile: PsiFile): List = - psiFile.virtualFile?.let { file -> - KotlinScriptExternalImportsProvider.getInstance(psiFile.project)?.getExternalImports(file) - } ?: emptyList() - +fun getScriptExternalDependencies(file: VirtualFile, project: Project): KotlinScriptExternalDependencies? = + KotlinScriptExternalImportsProvider.getInstance(project)?.getExternalImports(file) \ No newline at end of file diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/KotlinScriptConfigurationManager.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/KotlinScriptConfigurationManager.kt index 5df138002b5..633a2f0db09 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/KotlinScriptConfigurationManager.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/KotlinScriptConfigurationManager.kt @@ -87,9 +87,7 @@ class KotlinScriptConfigurationManager( } fun getScriptClasspath(file: VirtualFile): List = - scriptExternalImportsProvider.getExternalImports(file) - .flatMap { it.classpath } - .mapNotNull { it.classpathEntryToVfs() } + scriptExternalImportsProvider.getExternalImports(file)?.classpath?.mapNotNull { it.classpathEntryToVfs() } ?: emptyList() fun getAllScriptsClasspath(): List = allScriptsClasspathCache.get()