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
This commit is contained in:
Nikolay Krasko
2017-06-27 20:11:19 +03:00
parent 9f873f869a
commit 9eefbc2036
@@ -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<Unit> = storageManager.createLazyValue {
val explicitClassImports = HashMultimap.create<String, KtImportDirective>()
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