From 744cf7ddc8fe48859dd619b8db5c4d8d6ca41fde Mon Sep 17 00:00:00 2001 From: Dmitry Batkovich Date: Fri, 7 Jun 2019 17:40:26 +0300 Subject: [PATCH] allow SerializationManager to be unmodifiable (fix serializer set) GitOrigin-RevId: 748d549ec4113081cd644506b4f8154655e57200 --- .../com/intellij/psi/stubs/PrebuiltStubs.kt | 2 +- .../psi/stubs/SerializationManagerImpl.java | 16 ++++++++------ .../psi/stubs/StubSerializationHelper.java | 21 ++++++++++++++++--- .../jetbrains/index/stubs/StubsGenerator.kt | 6 +++--- 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/psi/stubs/PrebuiltStubs.kt b/platform/lang-impl/src/com/intellij/psi/stubs/PrebuiltStubs.kt index 7cdb6fd3ae68..a7e0c9e1d32c 100644 --- a/platform/lang-impl/src/com/intellij/psi/stubs/PrebuiltStubs.kt +++ b/platform/lang-impl/src/com/intellij/psi/stubs/PrebuiltStubs.kt @@ -88,7 +88,7 @@ abstract class PrebuiltStubsProviderBase : PrebuiltIndexProviderBase String mappings due to StringRefs and stubs indexing that initially creates stubs (doing enumerate on String) // and then index them (valueOf), also similar string items are expected to be enumerated during stubs processing myNameStorage = new PersistentStringEnumerator(myFile, true); - myStubSerializationHelper = new StubSerializationHelper(myNameStorage, this); + myStubSerializationHelper = new StubSerializationHelper(myNameStorage, unmodifiable, this); } catch (IOException e) { nameStorageCrashed(); @@ -83,10 +84,13 @@ public class SerializationManagerImpl extends SerializationManagerEx implements } StubSerializationHelper prevHelper = myStubSerializationHelper; + if (myUnmodifiable) { + LOG.error("Data provided by unmodifiable serialization manager can be invalid after repair"); + } IOUtil.deleteAllFilesStartingWith(myFile); myNameStorage = new PersistentStringEnumerator(myFile, true); - myStubSerializationHelper = new StubSerializationHelper(myNameStorage, this); + myStubSerializationHelper = new StubSerializationHelper(myNameStorage, myUnmodifiable, this); myStubSerializationHelper.copyFrom(prevHelper); } catch (IOException e) { diff --git a/platform/lang-impl/src/com/intellij/psi/stubs/StubSerializationHelper.java b/platform/lang-impl/src/com/intellij/psi/stubs/StubSerializationHelper.java index a897b1580832..297e2a118fdb 100644 --- a/platform/lang-impl/src/com/intellij/psi/stubs/StubSerializationHelper.java +++ b/platform/lang-impl/src/com/intellij/psi/stubs/StubSerializationHelper.java @@ -14,6 +14,7 @@ import com.intellij.util.containers.RecentStringInterner; import com.intellij.util.io.AbstractStringEnumerator; import com.intellij.util.io.DataInputOutputUtil; import com.intellij.util.io.IOUtil; +import com.intellij.util.io.PersistentStringEnumerator; import gnu.trove.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -25,7 +26,9 @@ import java.util.*; * Author: dmitrylomov */ class StubSerializationHelper { - private final AbstractStringEnumerator myNameStorage; + private static final Logger LOG = Logger.getInstance(StubSerializationHelper.class); + + private final PersistentStringEnumerator myNameStorage; private final TIntObjectHashMap myIdToName = new TIntObjectHashMap<>(); private final TObjectIntHashMap myNameToId = new TObjectIntHashMap<>(); @@ -34,10 +37,12 @@ class StubSerializationHelper { private final ConcurrentIntObjectMap myIdToSerializer = ContainerUtil.createConcurrentIntObjectMap(); private final Map mySerializerToId = ContainerUtil.newConcurrentMap(); + private final boolean myUnmodifiable; private final RecentStringInterner myStringInterner; - StubSerializationHelper(@NotNull AbstractStringEnumerator nameStorage, @NotNull Disposable parentDisposable) { + StubSerializationHelper(@NotNull PersistentStringEnumerator nameStorage, boolean unmodifiable, @NotNull Disposable parentDisposable) { myNameStorage = nameStorage; + myUnmodifiable = unmodifiable; myStringInterner = new RecentStringInterner(parentDisposable); } @@ -53,7 +58,17 @@ class StubSerializationHelper { return; } - int id = myNameStorage.enumerate(name); + int id; + if (myUnmodifiable) { + id = myNameStorage.tryEnumerate(name); + if (id == 0) { + LOG.info("serialized " + name + " is ignored in unmodifiable stub serialization manager"); + return; + } + } + else { + id = myNameStorage.enumerate(name); + } myIdToName.put(id, name); myNameToId.put(name, id); } diff --git a/tools/index-tools/src/org/jetbrains/index/stubs/StubsGenerator.kt b/tools/index-tools/src/org/jetbrains/index/stubs/StubsGenerator.kt index 78a006aa0e92..8f7183a4e42a 100644 --- a/tools/index-tools/src/org/jetbrains/index/stubs/StubsGenerator.kt +++ b/tools/index-tools/src/org/jetbrains/index/stubs/StubsGenerator.kt @@ -31,7 +31,7 @@ import java.util.* open class StubsGenerator(private val stubsVersion: String, private val stubsStorageFilePath: String) : IndexGenerator(stubsStorageFilePath) { - private val serializationManager = SerializationManagerImpl(File("$stubsStorageFilePath.names")) + private val serializationManager = SerializationManagerImpl(File("$stubsStorageFilePath.names"), false) fun buildStubsForRoots(roots: Collection) { try { @@ -96,7 +96,7 @@ fun mergeStubs(paths: List, stubsFilePath: String, stubsFileName: String stringEnumeratorFile.delete() } - val newSerializationManager = SerializationManagerImpl(stringEnumeratorFile) + val newSerializationManager = SerializationManagerImpl(stringEnumeratorFile, false) val map = HashMap() @@ -109,7 +109,7 @@ fun mergeStubs(paths: List, stubsFilePath: String, stubsFileName: String val fromStorage = PersistentHashMap(fromStorageFile, HashCodeDescriptor.instance, stubExternalizer) - val serializationManager = SerializationManagerImpl(File(path, "$stubsFileName.names")) + val serializationManager = SerializationManagerImpl(File(path, "$stubsFileName.names"), true) try { fromStorage.processKeysWithExistingMapping { key ->