Avoid creating a separate synthetic file for each default import

This commit is contained in:
Denis Zharkov
2017-11-15 11:24:41 +03:00
parent 2d82cb936e
commit cc312bcaa2
3 changed files with 29 additions and 6 deletions
@@ -51,4 +51,9 @@ public class KtImportsFactory {
public Collection<KtImportDirective> createImportDirectives(@NotNull Collection<ImportPath> importPaths) { public Collection<KtImportDirective> createImportDirectives(@NotNull Collection<ImportPath> importPaths) {
return CollectionsKt.map(importPaths, this::createImportDirective); return CollectionsKt.map(importPaths, this::createImportDirective);
} }
@NotNull
public Collection<KtImportDirective> createImportDirectivesNotCached(@NotNull Collection<ImportPath> importPaths) {
return KtPsiFactoryKt.KtPsiFactory(project, false).createImportDirectives(importPaths);
}
} }
@@ -410,16 +410,34 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
throw IllegalArgumentException("import path must not be empty") throw IllegalArgumentException("import path must not be empty")
} }
val importDirectiveBuilder = StringBuilder("import ") val file = createFile(buildString { appendImport (importPath) })
importDirectiveBuilder.append(importPath.pathStr) 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 val alias = importPath.alias
if (alias != null) { if (alias != null) {
importDirectiveBuilder.append(" as ").append(alias.asString()) append(" as ").append(alias.asString())
}
}
fun createImportDirectives(paths: Collection<ImportPath>): List<KtImportDirective> {
val fileContent = buildString {
for (path in paths) {
appendImport(path)
append('\n')
}
} }
val file = createFile(importDirectiveBuilder.toString()) val file = createFile(fileContent)
return file.importDirectives.first() return file.importDirectives
} }
fun createPrimaryConstructor(): KtPrimaryConstructor { fun createPrimaryConstructor(): KtPrimaryConstructor {
@@ -50,7 +50,7 @@ class FileScopeFactory(
) { ) {
/* avoid constructing psi for default imports prematurely (time consuming in some scenarios) */ /* avoid constructing psi for default imports prematurely (time consuming in some scenarios) */
private val defaultImports by storageManager.createLazyValue { private val defaultImports by storageManager.createLazyValue {
ktImportsFactory.createImportDirectives(defaultImportProvider.defaultImports) ktImportsFactory.createImportDirectivesNotCached(defaultImportProvider.defaultImports)
} }
fun createScopesForFile(file: KtFile, existingImports: ImportingScope? = null): FileScopes { fun createScopesForFile(file: KtFile, existingImports: ImportingScope? = null): FileScopes {