From cc312bcaa2679c474a46d1e04967564ca97d7c9a Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Wed, 15 Nov 2017 11:24:41 +0300 Subject: [PATCH] Avoid creating a separate synthetic file for each default import --- .../kotlin/psi/KtImportsFactory.java | 5 ++++ .../org/jetbrains/kotlin/psi/KtPsiFactory.kt | 28 +++++++++++++++---- .../kotlin/resolve/lazy/FileScopeFactory.kt | 2 +- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtImportsFactory.java b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtImportsFactory.java index 83d4bd1854b..c8969fa350b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtImportsFactory.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtImportsFactory.java @@ -51,4 +51,9 @@ public class KtImportsFactory { public Collection createImportDirectives(@NotNull Collection importPaths) { return CollectionsKt.map(importPaths, this::createImportDirective); } + + @NotNull + public Collection createImportDirectivesNotCached(@NotNull Collection importPaths) { + return KtPsiFactoryKt.KtPsiFactory(project, false).createImportDirectives(importPaths); + } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtPsiFactory.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtPsiFactory.kt index f9b367957b2..62218d4896e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtPsiFactory.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtPsiFactory.kt @@ -410,16 +410,34 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m throw IllegalArgumentException("import path must not be empty") } - val importDirectiveBuilder = StringBuilder("import ") - importDirectiveBuilder.append(importPath.pathStr) + val file = createFile(buildString { appendImport (importPath) }) + return file.importDirectives.first() + } + + private fun StringBuilder.appendImport(importPath: ImportPath) { + if (importPath.fqName.isRoot) { + throw IllegalArgumentException("import path must not be empty") + } + + append("import ") + append(importPath.pathStr) val alias = importPath.alias if (alias != null) { - importDirectiveBuilder.append(" as ").append(alias.asString()) + append(" as ").append(alias.asString()) + } + } + + fun createImportDirectives(paths: Collection): List { + val fileContent = buildString { + for (path in paths) { + appendImport(path) + append('\n') + } } - val file = createFile(importDirectiveBuilder.toString()) - return file.importDirectives.first() + val file = createFile(fileContent) + return file.importDirectives } fun createPrimaryConstructor(): KtPrimaryConstructor { 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 ec1a6099dcd..0f23a3ba5e1 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt @@ -50,7 +50,7 @@ class FileScopeFactory( ) { /* avoid constructing psi for default imports prematurely (time consuming in some scenarios) */ private val defaultImports by storageManager.createLazyValue { - ktImportsFactory.createImportDirectives(defaultImportProvider.defaultImports) + ktImportsFactory.createImportDirectivesNotCached(defaultImportProvider.defaultImports) } fun createScopesForFile(file: KtFile, existingImports: ImportingScope? = null): FileScopes {