do not read content if composite class file builder is enabled and configuration is not changed

GitOrigin-RevId: 8c3e48c6fc1285d5affc5d074afd6210ae969068
This commit is contained in:
Dmitro Batko
2020-01-16 08:11:51 +00:00
committed by intellij-monorepo-bot
parent c551615594
commit 341b7b68be
5 changed files with 135 additions and 9 deletions
@@ -17,6 +17,7 @@ import org.jetbrains.annotations.Nullable;
import java.util.Comparator;
import java.util.List;
import java.util.function.Supplier;
import java.util.stream.Stream;
import static com.intellij.psi.compiled.ClassFileDecompilers.Full;
@@ -33,6 +34,12 @@ public class ClassFileStubBuilder implements BinaryFileStubBuilder.CompositeBina
return true;
}
@NotNull
@Override
public Stream<ClassFileDecompilers.Decompiler> getAllSubBuilders() {
return ClassFileDecompilers.EP_NAME.extensions();
}
@Nullable
@Override
public ClassFileDecompilers.Decompiler getSubBuilder(@NotNull FileContent fileContent) {
@@ -24,6 +24,8 @@ import com.intellij.util.indexing.FileContent;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.stream.Stream;
public interface BinaryFileStubBuilder {
boolean acceptsFile(@NotNull VirtualFile file);
@@ -33,6 +35,9 @@ public interface BinaryFileStubBuilder {
int getStubVersion();
interface CompositeBinaryFileStubBuilder<SubBuilder> extends BinaryFileStubBuilder {
@NotNull
Stream<SubBuilder> getAllSubBuilders();
@Nullable
SubBuilder getSubBuilder(@NotNull FileContent fileContent);
@@ -0,0 +1,85 @@
// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.psi.stubs;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.newvfs.FileAttribute;
import com.intellij.openapi.vfs.newvfs.persistent.FSRecords;
import com.intellij.util.indexing.IndexInfrastructure;
import com.intellij.util.io.DataInputOutputUtil;
import com.intellij.util.io.PersistentStringEnumerator;
import gnu.trove.TObjectIntHashMap;
import org.jetbrains.annotations.NotNull;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.Map;
class CompositeBinaryBuilderMap {
private static final FileAttribute VERSION_STAMP = new FileAttribute("stubIndex.cumulativeBinaryBuilder", 1, true);
private final TObjectIntHashMap<FileType> myCumulativeVersionMap;
CompositeBinaryBuilderMap() throws IOException {
try (PersistentStringEnumerator cumulativeVersionEnumerator = new PersistentStringEnumerator(registeredCompositeBinaryBuilderFiles())) {
myCumulativeVersionMap = new TObjectIntHashMap<>();
for (Map.Entry<FileType, BinaryFileStubBuilder> entry : BinaryFileStubBuilders.INSTANCE.getAllRegisteredExtensions().entrySet()) {
FileType fileType = entry.getKey();
BinaryFileStubBuilder builder = entry.getValue();
if (builder instanceof BinaryFileStubBuilder.CompositeBinaryFileStubBuilder<?>) {
StringBuilder cumulativeVersion = new StringBuilder();
cumulativeVersion.append(fileType.getName());
cumulativeVersion.append("->");
cumulativeVersion.append(builder.getClass().getName());
cumulativeVersion.append(":");
cumulativeVersion.append(builder.getStubVersion());
BinaryFileStubBuilder.CompositeBinaryFileStubBuilder compositeBuilder = (BinaryFileStubBuilder.CompositeBinaryFileStubBuilder<?>)builder;
compositeBuilder.getAllSubBuilders().forEach(b -> {
cumulativeVersion.append(";");
cumulativeVersion.append(compositeBuilder.getSubBuilderVersion(b));
});
myCumulativeVersionMap.put(fileType, cumulativeVersionEnumerator.enumerate(cumulativeVersion.toString()));
}
}
}
}
void persistState(int fileId, @NotNull VirtualFile file) throws IOException {
int version = getBuilderCumulativeVersion(file);
if (version == 0) return;
try (DataOutputStream stream = FSRecords.writeAttribute(fileId, VERSION_STAMP)) {
DataInputOutputUtil.writeINT(stream, version);
}
}
boolean isUpToDateState(int fileId, @NotNull VirtualFile file) throws IOException {
DataInputStream stream = FSRecords.readAttributeWithLock(fileId, VERSION_STAMP);
int indexedVersion = stream != null ? DataInputOutputUtil.readINT(stream) : 0;
if (indexedVersion == 0) return false;
int actualVersion = getBuilderCumulativeVersion(file);
return actualVersion == indexedVersion;
}
private int getBuilderCumulativeVersion(@NotNull VirtualFile file) {
FileType[] type = {null};
ProgressManager.getInstance().executeNonCancelableSection(() -> {
type[0] = file.getFileType();
});
return myCumulativeVersionMap.get(type[0]);
}
@NotNull
private static Path registeredCompositeBinaryBuilderFiles() {
return new File(IndexInfrastructure.getIndexRootDir(StubUpdatingIndex.INDEX_ID), ".binary_builders").toPath();
}
}
@@ -16,7 +16,6 @@ import com.intellij.openapi.project.ProjectUtil;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.newvfs.FileAttribute;
import com.intellij.openapi.vfs.newvfs.NewVirtualFile;
import com.intellij.psi.tree.IFileElementType;
import com.intellij.psi.tree.IStubFileElementType;
import com.intellij.util.BitUtil;
@@ -40,7 +39,7 @@ import java.util.Map;
public class StubUpdatingIndex extends SingleEntryFileBasedIndexExtension<SerializedStubTree>
implements CustomImplementationFileBasedIndexExtension<Integer, SerializedStubTree> {
static final Logger LOG = Logger.getInstance(StubUpdatingIndex.class);
private static final int VERSION = 43 + (PersistentHashMapValueStorage.COMPRESSION_ENABLED ? 1 : 0) + (InvertedIndex.ARE_COMPOSITE_INDEXERS_ENABLED ? 1 : 0);
private static final int VERSION = 43 + (PersistentHashMapValueStorage.COMPRESSION_ENABLED ? 1 : 0) + (InvertedIndex.ARE_COMPOSITE_INDEXERS_ENABLED ? 2 : 0);
// todo remove once we don't need this for stub-ast mismatch debug info
private static final FileAttribute INDEXED_STAMP = new FileAttribute("stubIndexStamp", 3, true);
@@ -280,7 +279,11 @@ public class StubUpdatingIndex extends SingleEntryFileBasedIndexExtension<Serial
private static class MyIndex extends VfsAwareMapReduceIndex<Integer, SerializedStubTree, FileContent> {
private StubIndexImpl myStubIndex;
@Nullable
private final StubVersionMap myStubVersionMap = InvertedIndex.ARE_COMPOSITE_INDEXERS_ENABLED ? null : new StubVersionMap();
private final StubVersionMap myStubVersionMap =
InvertedIndex.ARE_COMPOSITE_INDEXERS_ENABLED ? null : new StubVersionMap();
@Nullable
private final CompositeBinaryBuilderMap myCompositeBinaryBuilderMap =
InvertedIndex.ARE_COMPOSITE_INDEXERS_ENABLED ? new CompositeBinaryBuilderMap() : null;
MyIndex(@NotNull FileBasedIndexExtension<Integer, SerializedStubTree> extension, @NotNull IndexStorage<Integer, SerializedStubTree> storage)
throws StorageException, IOException {
@@ -393,11 +396,20 @@ public class StubUpdatingIndex extends SingleEntryFileBasedIndexExtension<Serial
public void setIndexedStateForFile(int fileId, @NotNull IndexedFile file) {
super.setIndexedStateForFile(fileId, file);
if (myStubVersionMap == null) return;
try {
myStubVersionMap.persistIndexedState(fileId, file.getFile());
} catch (IOException e) {
LOG.error(e);
if (myStubVersionMap != null) {
try {
myStubVersionMap.persistIndexedState(fileId, file.getFile());
} catch (IOException e) {
LOG.error(e);
}
}
if (myCompositeBinaryBuilderMap != null) {
try {
myCompositeBinaryBuilderMap.persistState(fileId, file.getFile());
} catch (IOException e) {
LOG.error(e);
}
}
}
@@ -416,5 +428,18 @@ public class StubUpdatingIndex extends SingleEntryFileBasedIndexExtension<Serial
return false;
}
}
@Override
protected boolean isIndexConfigurationUpToDate(int fileId, @NotNull IndexedFile file) {
if (myCompositeBinaryBuilderMap != null) {
try {
return myCompositeBinaryBuilderMap.isUpToDateState(fileId, file.getFile());
} catch (IOException e) {
LOG.error(e);
return false;
}
}
return false;
}
}
}
@@ -208,7 +208,7 @@ public class VfsAwareMapReduceIndex<Key, Value, Input> extends MapReduceIndex<Ke
if (mySubIndexerRetriever == null) return true;
if (!(file instanceof FileContent)) {
if (((CompositeDataIndexer)myIndexer).requiresContentForSubIndexerEvaluation(file)) {
return false;
return isIndexConfigurationUpToDate(fileId, file);
}
}
try {
@@ -220,6 +220,10 @@ public class VfsAwareMapReduceIndex<Key, Value, Input> extends MapReduceIndex<Ke
}
}
protected boolean isIndexConfigurationUpToDate(int fileId, @NotNull IndexedFile file) {
return false;
}
@Override
public void removeTransientDataForFile(int inputId) {
Lock lock = getWriteLock();