From 9eefbc2036d2772b058bbfd2250afdf9823a8ebe Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Tue, 27 Jun 2017 20:11:19 +0300 Subject: [PATCH] Perform 'all import resolve' once and protect it with lock (EA-79696) Binding context and diagnostic structures are not thread-safe now and need to be protected with the lock. Fix flacky test testRemoveDuplicateImport This also probably fixes some traces in EA-79696 --- .../org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt index d445761dc83..0dd56b8070e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt @@ -29,10 +29,10 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.platform.PlatformToKotlinClassMap import org.jetbrains.kotlin.psi.KtImportDirective import org.jetbrains.kotlin.psi.KtPsiUtil -import org.jetbrains.kotlin.psi.KtReferenceExpression import org.jetbrains.kotlin.resolve.* import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.ImportingScope +import org.jetbrains.kotlin.storage.NotNullLazyValue import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.types.expressions.OperatorConventions import org.jetbrains.kotlin.util.collectionUtils.concat @@ -104,7 +104,7 @@ class LazyImportResolver( Unit } - override fun forceResolveAllImports() { + private val forceResolveAllImportsTask: NotNullLazyValue = storageManager.createLazyValue { val explicitClassImports = HashMultimap.create() for (importDirective in indexedImports.imports) { forceResolveImport(importDirective) @@ -134,6 +134,10 @@ class LazyImportResolver( } } + override fun forceResolveAllImports() { + forceResolveAllImportsTask() + } + private fun checkResolvedImportDirective(importDirective: KtImportDirective) { val importedReference = KtPsiUtil.getLastReference(importDirective.importedReference ?: return) ?: return val importedDescriptor = traceForImportResolve.bindingContext.get(BindingContext.REFERENCE_TARGET, importedReference) ?: return