From 7bf754f94ba19aa1884b3b9be7dc72ddf6f2e102 Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Fri, 27 Nov 2015 16:35:31 +0100 Subject: [PATCH] [performance for 143] make somewhat less intrusive but more public way of reusing loaded file content --- .../impl/compiled/ClassFileStubBuilder.java | 6 ++---- .../com/intellij/openapi/vfs/VirtualFile.java | 3 +++ .../vfs/newvfs/impl/VirtualFileImpl.java | 21 ++++++++++++++++++- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClassFileStubBuilder.java b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClassFileStubBuilder.java index 4402f10afbf7..894b5b85f321 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClassFileStubBuilder.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClassFileStubBuilder.java @@ -16,7 +16,6 @@ package com.intellij.psi.impl.compiled; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.util.Key; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.compiled.ClassFileDecompilers; import com.intellij.psi.stubs.BinaryFileStubBuilder; @@ -40,7 +39,6 @@ public class ClassFileStubBuilder implements BinaryFileStubBuilder { private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.compiled.ClassFileStubBuilder"); public static final int STUB_VERSION = 12; - public static final Key ourCompiledClassContentHintKey = Key.create("compiled.class.content.hint"); @Override public boolean acceptsFile(@NotNull VirtualFile file) { @@ -53,7 +51,7 @@ public class ClassFileStubBuilder implements BinaryFileStubBuilder { byte[] content = fileContent.getContent(); try { - file.putUserData(ourCompiledClassContentHintKey, content); + file.setForcedContentHint(content); ClassFileDecompilers.Decompiler decompiler = ClassFileDecompilers.find(file); if (decompiler instanceof Full) { return ((Full)decompiler).getStubBuilder().buildFileStub(fileContent); @@ -63,7 +61,7 @@ public class ClassFileStubBuilder implements BinaryFileStubBuilder { LOG.debug(e); } finally { - file.putUserData(ourCompiledClassContentHintKey, null); + file.setForcedContentHint(null); } try { diff --git a/platform/core-api/src/com/intellij/openapi/vfs/VirtualFile.java b/platform/core-api/src/com/intellij/openapi/vfs/VirtualFile.java index b3568051dae0..152ef431143b 100644 --- a/platform/core-api/src/com/intellij/openapi/vfs/VirtualFile.java +++ b/platform/core-api/src/com/intellij/openapi/vfs/VirtualFile.java @@ -750,4 +750,7 @@ public abstract class VirtualFile extends UserDataHolderBase implements Modifica public CharSequence getNameSequence() { return getName(); } + + public void setForcedContentHint(byte[] forcedContent) { + } } diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualFileImpl.java b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualFileImpl.java index 11119fcccfda..e138237fb4b8 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualFileImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualFileImpl.java @@ -19,17 +19,20 @@ */ package com.intellij.openapi.vfs.newvfs.impl; +import com.intellij.openapi.util.Key; import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.newvfs.NewVirtualFile; import com.intellij.openapi.vfs.newvfs.NewVirtualFileSystem; import com.intellij.util.LineSeparator; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.io.UnsyncByteArrayInputStream; import com.intellij.util.keyFMap.KeyFMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -90,10 +93,24 @@ public class VirtualFileImpl extends VirtualFileSystemEntry { return false; } + private static final Key ourForcedContentKey = Key.create("forced.content.key"); + + @Override + public void setForcedContentHint(byte[] forcedContent) { + putUserData(ourForcedContentKey, forcedContent); + } + @Override @NotNull public InputStream getInputStream() throws IOException { - return VfsUtilCore.inputStreamSkippingBOM(ourPersistence.getInputStream(this), this); + final byte[] forcedContent = getUserData(ourForcedContentKey); + + return VfsUtilCore.inputStreamSkippingBOM( + forcedContent == null ? + ourPersistence.getInputStream(this): + new DataInputStream(new UnsyncByteArrayInputStream(forcedContent)), + this + ); } @Override @@ -105,6 +122,8 @@ public class VirtualFileImpl extends VirtualFileSystemEntry { @NotNull @Override public byte[] contentsToByteArray(boolean cacheContent) throws IOException { + final byte[] forcedContent = getUserData(ourForcedContentKey); + if (forcedContent != null) return forcedContent; return ourPersistence.contentsToByteArray(this, cacheContent); }