fix KT-7512 JS: project with external library lead to deadlock and IDEA freeze due to wrong storage manager configured
#KT-7512 Fixed
This commit is contained in:
+2
-1
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.js.analyze.TopDownAnalyzerFacadeForJS
|
|||||||
import org.jetbrains.kotlin.js.config.LibrarySourcesConfig
|
import org.jetbrains.kotlin.js.config.LibrarySourcesConfig
|
||||||
import org.jetbrains.kotlin.jvm.compiler.LoadDescriptorUtil.TEST_PACKAGE_FQNAME
|
import org.jetbrains.kotlin.jvm.compiler.LoadDescriptorUtil.TEST_PACKAGE_FQNAME
|
||||||
import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializationUtil
|
import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializationUtil
|
||||||
|
import org.jetbrains.kotlin.storage.LockBasedStorageManager
|
||||||
import org.jetbrains.kotlin.test.JetTestUtils
|
import org.jetbrains.kotlin.test.JetTestUtils
|
||||||
import org.jetbrains.kotlin.test.TestCaseWithTmpdir
|
import org.jetbrains.kotlin.test.TestCaseWithTmpdir
|
||||||
import org.jetbrains.kotlin.test.util.RecursiveDescriptorComparator
|
import org.jetbrains.kotlin.test.util.RecursiveDescriptorComparator
|
||||||
@@ -81,7 +82,7 @@ public class KotlinJavascriptSerializerTest : TestCaseWithTmpdir() {
|
|||||||
val metadata = KotlinJavascriptMetadataUtils.loadMetadata(metaFile)
|
val metadata = KotlinJavascriptMetadataUtils.loadMetadata(metaFile)
|
||||||
assert(metadata.size() == 1)
|
assert(metadata.size() == 1)
|
||||||
|
|
||||||
val provider = KotlinJavascriptSerializationUtil.createPackageFragmentProvider(module, metadata[0].body)
|
val provider = KotlinJavascriptSerializationUtil.createPackageFragmentProvider(module, metadata[0].body, LockBasedStorageManager())
|
||||||
.sure { "No package fragment provider was created" }
|
.sure { "No package fragment provider was created" }
|
||||||
|
|
||||||
module.initialize(provider)
|
module.initialize(provider)
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ public object JsAnalyzerFacade : AnalyzerFacade<JsResolverForModule, PlatformAna
|
|||||||
if (!JsHeaderLibraryDetectionUtil.isJsHeaderLibraryWithSources(files.toList())) {
|
if (!JsHeaderLibraryDetectionUtil.isJsHeaderLibraryWithSources(files.toList())) {
|
||||||
val providers = moduleInfo.library.getFiles(OrderRootType.CLASSES)
|
val providers = moduleInfo.library.getFiles(OrderRootType.CLASSES)
|
||||||
.flatMap { KotlinJavascriptMetadataUtils.loadMetadata(PathUtil.getLocalPath(it)!!) }
|
.flatMap { KotlinJavascriptMetadataUtils.loadMetadata(PathUtil.getLocalPath(it)!!) }
|
||||||
.map { KotlinJavascriptSerializationUtil.createPackageFragmentProvider(moduleDescriptor, it.body) }
|
.map { KotlinJavascriptSerializationUtil.createPackageFragmentProvider(moduleDescriptor, it.body, globalContext.storageManager) }
|
||||||
.filterNotNull()
|
.filterNotNull()
|
||||||
|
|
||||||
if (providers.isNotEmpty()) {
|
if (providers.isNotEmpty()) {
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl;
|
|||||||
import org.jetbrains.kotlin.js.analyze.TopDownAnalyzerFacadeForJS;
|
import org.jetbrains.kotlin.js.analyze.TopDownAnalyzerFacadeForJS;
|
||||||
import org.jetbrains.kotlin.psi.JetFile;
|
import org.jetbrains.kotlin.psi.JetFile;
|
||||||
import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializationUtil;
|
import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializationUtil;
|
||||||
|
import org.jetbrains.kotlin.storage.LockBasedStorageManager;
|
||||||
import org.jetbrains.kotlin.utils.KotlinJavascriptMetadata;
|
import org.jetbrains.kotlin.utils.KotlinJavascriptMetadata;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@@ -149,7 +150,7 @@ public abstract class Config {
|
|||||||
ModuleDescriptorImpl moduleDescriptor = TopDownAnalyzerFacadeForJS.createJsModule("<" + metadata.getModuleName() + ">");
|
ModuleDescriptorImpl moduleDescriptor = TopDownAnalyzerFacadeForJS.createJsModule("<" + metadata.getModuleName() + ">");
|
||||||
|
|
||||||
PackageFragmentProvider provider =
|
PackageFragmentProvider provider =
|
||||||
KotlinJavascriptSerializationUtil.createPackageFragmentProvider(moduleDescriptor, metadata.getBody());
|
KotlinJavascriptSerializationUtil.createPackageFragmentProvider(moduleDescriptor, metadata.getBody(), new LockBasedStorageManager());
|
||||||
|
|
||||||
moduleDescriptor.initialize(provider != null ? provider : PackageFragmentProvider.Empty.INSTANCE$);
|
moduleDescriptor.initialize(provider != null ? provider : PackageFragmentProvider.Empty.INSTANCE$);
|
||||||
moduleDescriptor.addDependencyOnModule(KotlinBuiltIns.getInstance().getBuiltInsModule());
|
moduleDescriptor.addDependencyOnModule(KotlinBuiltIns.getInstance().getBuiltInsModule());
|
||||||
|
|||||||
+3
-3
@@ -32,7 +32,7 @@ import org.jetbrains.kotlin.serialization.ProtoBuf
|
|||||||
import org.jetbrains.kotlin.serialization.SerializationUtil
|
import org.jetbrains.kotlin.serialization.SerializationUtil
|
||||||
import org.jetbrains.kotlin.serialization.builtins.BuiltInsSerializerExtension
|
import org.jetbrains.kotlin.serialization.builtins.BuiltInsSerializerExtension
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.FlexibleTypeCapabilitiesDeserializer
|
import org.jetbrains.kotlin.serialization.deserialization.FlexibleTypeCapabilitiesDeserializer
|
||||||
import org.jetbrains.kotlin.storage.LockBasedStorageManager
|
import org.jetbrains.kotlin.storage.StorageManager
|
||||||
import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils
|
import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils
|
||||||
import java.io.ByteArrayInputStream
|
import java.io.ByteArrayInputStream
|
||||||
import java.io.ByteArrayOutputStream
|
import java.io.ByteArrayOutputStream
|
||||||
@@ -44,7 +44,7 @@ public object KotlinJavascriptSerializationUtil {
|
|||||||
private val PACKAGE_FILE_SUFFIX = "/.kotlin_package"
|
private val PACKAGE_FILE_SUFFIX = "/.kotlin_package"
|
||||||
|
|
||||||
platformStatic
|
platformStatic
|
||||||
public fun createPackageFragmentProvider(moduleDescriptor: ModuleDescriptor, metadata: ByteArray): PackageFragmentProvider? {
|
public fun createPackageFragmentProvider(moduleDescriptor: ModuleDescriptor, metadata: ByteArray, storageManager: StorageManager): PackageFragmentProvider? {
|
||||||
val gzipInputStream = GZIPInputStream(ByteArrayInputStream(metadata))
|
val gzipInputStream = GZIPInputStream(ByteArrayInputStream(metadata))
|
||||||
val content = JsProtoBuf.Library.parseFrom(gzipInputStream)
|
val content = JsProtoBuf.Library.parseFrom(gzipInputStream)
|
||||||
gzipInputStream.close()
|
gzipInputStream.close()
|
||||||
@@ -59,7 +59,7 @@ public object KotlinJavascriptSerializationUtil {
|
|||||||
if (packageFqNames.isEmpty()) return null
|
if (packageFqNames.isEmpty()) return null
|
||||||
|
|
||||||
return createBuiltInPackageFragmentProvider(
|
return createBuiltInPackageFragmentProvider(
|
||||||
LockBasedStorageManager(), moduleDescriptor, packageFqNames, FlexibleTypeCapabilitiesDeserializer.Dynamic
|
storageManager, moduleDescriptor, packageFqNames, FlexibleTypeCapabilitiesDeserializer.Dynamic
|
||||||
) {
|
) {
|
||||||
path ->
|
path ->
|
||||||
if (!contentMap.containsKey(path)) null else ByteArrayInputStream(contentMap.get(path))
|
if (!contentMap.containsKey(path)) null else ByteArrayInputStream(contentMap.get(path))
|
||||||
|
|||||||
Reference in New Issue
Block a user