mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
refactor interners: extract common super class, generalize usages
GitOrigin-RevId: 7958f52e8fb1c6a1b95b9f9c88e6cc3e0e5b5d90
This commit is contained in:
committed by
intellij-monorepo-bot
parent
30b6d83993
commit
ac3221470f
@@ -2,7 +2,7 @@
|
||||
package com.intellij.compiler.impl;
|
||||
|
||||
import com.intellij.util.containers.EmptyIterator;
|
||||
import com.intellij.util.containers.StringInterner;
|
||||
import com.intellij.util.containers.Interner;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
@@ -15,11 +15,11 @@ import java.util.Stack;
|
||||
*/
|
||||
public class TreeBasedMap<T> {
|
||||
private Node<T> myRoot = new Node<>();
|
||||
private final StringInterner myInterner;
|
||||
private final Interner<String> myInterner;
|
||||
private final char mySeparator;
|
||||
private int mySize = 0;
|
||||
|
||||
public TreeBasedMap(StringInterner table, final char separator) {
|
||||
public TreeBasedMap(Interner<String> table, final char separator) {
|
||||
myInterner = table;
|
||||
mySeparator = separator;
|
||||
}
|
||||
@@ -48,12 +48,12 @@ public class TreeBasedMap<T> {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Node<T> findRelative(String text, boolean create, final StringInterner table) {
|
||||
public Node<T> findRelative(String text, boolean create, final Interner<String> table) {
|
||||
return findRelative(text, 0, create, table);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private Node<T> findRelative(final String text, final int nameStartIndex, final boolean create, final StringInterner table) {
|
||||
private Node<T> findRelative(final String text, final int nameStartIndex, final boolean create, final Interner<String> table) {
|
||||
if (myChildren == null && !create) {
|
||||
return null;
|
||||
}
|
||||
@@ -80,7 +80,7 @@ public class TreeBasedMap<T> {
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private Node<T> addChild(final StringInterner table, final String text, final int nameStartIndex, final int nameEndIndex) {
|
||||
private Node<T> addChild(final Interner<String> table, final String text, final int nameStartIndex, final int nameEndIndex) {
|
||||
if (myChildren == null) {
|
||||
myChildren = new HashMap<>(3, 0.95f);
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
*/
|
||||
package com.intellij.compiler.impl;
|
||||
|
||||
import com.intellij.util.containers.StringInterner;
|
||||
import com.intellij.util.containers.Interner;
|
||||
|
||||
/**
|
||||
* @author Eugene Zhuravlev
|
||||
@@ -23,7 +23,7 @@ import com.intellij.util.containers.StringInterner;
|
||||
public class TreeBasedPathsSet {
|
||||
private final TreeBasedMap<Object> myMap;
|
||||
|
||||
public TreeBasedPathsSet(StringInterner interner, char separator) {
|
||||
public TreeBasedPathsSet(Interner<String> interner, char separator) {
|
||||
myMap = new TreeBasedMap<>(interner, separator);
|
||||
}
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@ import com.intellij.openapi.progress.ProgressIndicator;
|
||||
import com.intellij.openapi.util.io.FileUtil;
|
||||
import com.intellij.util.Consumer;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.containers.Interner;
|
||||
import com.intellij.util.containers.StringInterner;
|
||||
import com.intellij.util.text.StringFactory;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -47,7 +48,7 @@ public abstract class ModuleInsight {
|
||||
private final Map<File, Set<String>> mySourceRootToReferencedPackagesMap = new HashMap<>();
|
||||
private final Map<File, Set<String>> mySourceRootToPackagesMap = new HashMap<>();
|
||||
private final Map<File, Set<String>> myJarToPackagesMap = new HashMap<>();
|
||||
private final StringInterner myInterner = new StringInterner();
|
||||
private final Interner<String> myInterner = new StringInterner();
|
||||
|
||||
private List<ModuleDescriptor> myModules;
|
||||
private List<LibraryDescriptor> myLibraries;
|
||||
|
||||
@@ -21,6 +21,7 @@ import com.intellij.psi.tree.IElementType;
|
||||
import com.intellij.psi.util.ClassUtil;
|
||||
import com.intellij.psi.util.ConstantEvaluationOverflowException;
|
||||
import com.intellij.psi.util.ConstantExpressionUtil;
|
||||
import com.intellij.util.containers.Interner;
|
||||
import com.intellij.util.containers.StringInterner;
|
||||
import gnu.trove.THashSet;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -34,7 +35,7 @@ import java.util.concurrent.ConcurrentMap;
|
||||
@SuppressWarnings("UnnecessaryBoxing")
|
||||
class ConstantExpressionVisitor extends JavaElementVisitor implements PsiConstantEvaluationHelper.AuxEvaluator {
|
||||
|
||||
private final StringInterner myInterner = new StringInterner();
|
||||
private final Interner<String> myInterner = new StringInterner();
|
||||
|
||||
private Set<PsiVariable> myVisitedVars;
|
||||
private final Map<PsiElement, Object> myCachedValues = new HashMap<>();
|
||||
|
||||
@@ -19,6 +19,7 @@ import com.intellij.util.ArrayUtil;
|
||||
import com.intellij.util.BitUtil;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.containers.Interner;
|
||||
import com.intellij.util.containers.WeakInterner;
|
||||
import gnu.trove.THashMap;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
@@ -303,7 +304,7 @@ public class PsiModifierListImpl extends JavaStubPsiElement<PsiModifierListStub>
|
||||
}
|
||||
|
||||
private static class ModifierCache {
|
||||
static final WeakInterner<List<String>> ourInterner = new WeakInterner<>();
|
||||
static final Interner<List<String>> ourInterner = new WeakInterner<>();
|
||||
final PsiFile file;
|
||||
final List<String> modifiers;
|
||||
final long modCount;
|
||||
|
||||
+2
-1
@@ -41,6 +41,7 @@ import com.intellij.psi.util.PsiUtilCore;
|
||||
import com.intellij.util.ConcurrencyUtil;
|
||||
import com.intellij.util.Consumer;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.containers.Interner;
|
||||
import com.intellij.util.containers.StringInterner;
|
||||
import gnu.trove.THashMap;
|
||||
import org.jdom.Element;
|
||||
@@ -82,7 +83,7 @@ public class RefManagerImpl extends RefManager {
|
||||
|
||||
private final Map<Key, RefManagerExtension> myExtensions = new THashMap<>();
|
||||
private final Map<Language, RefManagerExtension> myLanguageExtensions = new HashMap<>();
|
||||
private final StringInterner myNameInterner = new StringInterner();
|
||||
private final Interner<String> myNameInterner = new StringInterner();
|
||||
|
||||
public RefManagerImpl(@NotNull Project project, @Nullable AnalysisScope scope, @NotNull GlobalInspectionContext context) {
|
||||
myProject = project;
|
||||
|
||||
@@ -22,6 +22,7 @@ import com.intellij.openapi.util.text.StringUtilRt;
|
||||
import com.intellij.util.ObjectUtils;
|
||||
import com.intellij.util.SmartList;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.containers.HashSetInterner;
|
||||
import com.intellij.util.containers.Interner;
|
||||
import com.intellij.util.containers.MultiMap;
|
||||
import com.intellij.util.xmlb.BeanBinding;
|
||||
@@ -241,7 +242,7 @@ public class IdeaPluginDescriptorImpl implements IdeaPluginDescriptor {
|
||||
|
||||
// only for CoreApplicationEnvironment
|
||||
if (stringInterner == null) {
|
||||
stringInterner = new Interner<>(SERVICE_QUALIFIED_ELEMENT_NAMES);
|
||||
stringInterner = new HashSetInterner<>(SERVICE_QUALIFIED_ELEMENT_NAMES);
|
||||
}
|
||||
|
||||
MultiMap<String, Element> extensions = myExtensions;
|
||||
|
||||
@@ -6,6 +6,7 @@ import com.intellij.openapi.util.SafeJdomFactory;
|
||||
import com.intellij.util.SmartList;
|
||||
import com.intellij.util.concurrency.AppExecutorUtil;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.containers.HashSetInterner;
|
||||
import com.intellij.util.containers.Interner;
|
||||
import org.jdom.*;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -89,7 +90,8 @@ final class LoadDescriptorsContext implements AutoCloseable {
|
||||
|
||||
private static final Set<String> CLASS_NAMES = ContainerUtil.newIdentityTroveSet(CLASS_NAME_LIST);
|
||||
|
||||
private final Interner<String> stringInterner = new Interner<String>(ContainerUtil.concat(CLASS_NAME_LIST, IdeaPluginDescriptorImpl.SERVICE_QUALIFIED_ELEMENT_NAMES)) {
|
||||
private final Interner<String>
|
||||
stringInterner = new HashSetInterner<String>(ContainerUtil.concat(CLASS_NAME_LIST, IdeaPluginDescriptorImpl.SERVICE_QUALIFIED_ELEMENT_NAMES)) {
|
||||
@NotNull
|
||||
@Override
|
||||
public String intern(@NotNull String name) {
|
||||
|
||||
@@ -20,11 +20,15 @@ import com.intellij.lang.Language;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.util.Pair;
|
||||
import com.intellij.openapi.util.TextRange;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.AbstractFileViewProvider;
|
||||
import com.intellij.psi.PsiDirectory;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.psi.tree.IElementType;
|
||||
import com.intellij.psi.tree.IFileElementType;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.psi.util.PsiUtilCore;
|
||||
import com.intellij.util.containers.Interner;
|
||||
import com.intellij.util.containers.WeakInterner;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -34,8 +38,8 @@ import org.jetbrains.annotations.Nullable;
|
||||
*/
|
||||
public abstract class Identikit {
|
||||
private static final Logger LOG = Logger.getInstance(Identikit.class);
|
||||
private static final WeakInterner<ByType> ourPlainInterner = new WeakInterner<>();
|
||||
private static final WeakInterner<ByAnchor> ourAnchorInterner = new WeakInterner<>();
|
||||
private static final Interner<ByType> ourPlainInterner = new WeakInterner<>();
|
||||
private static final Interner<ByAnchor> ourAnchorInterner = new WeakInterner<>();
|
||||
|
||||
@Nullable
|
||||
public abstract PsiElement findPsiElement(@NotNull PsiFile file, int startOffset, int endOffset);
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
package com.intellij.diff.util
|
||||
|
||||
import com.intellij.testFramework.PlatformTestUtil
|
||||
import com.intellij.util.containers.Interner
|
||||
import com.intellij.util.containers.StringInterner
|
||||
import com.intellij.util.diff.Diff
|
||||
import com.intellij.util.diff.FilesTooBigForDiffException
|
||||
@@ -28,7 +29,7 @@ class DiffPerformanceTest : TestCase() {
|
||||
private var needWarmUp = true
|
||||
}
|
||||
|
||||
private val interner: StringInterner = StringInterner()
|
||||
private val interner: Interner<String> = StringInterner()
|
||||
|
||||
val data = generateData(2000000)
|
||||
private val arr_200000 = data.take(200000).toTypedArray()
|
||||
|
||||
+3
-2
@@ -7,13 +7,14 @@ import com.intellij.openapi.externalSystem.model.project.LibraryData
|
||||
import com.intellij.openapi.externalSystem.model.project.LibraryDependencyData
|
||||
import com.intellij.openapi.externalSystem.model.project.ModuleData
|
||||
import com.intellij.openapi.externalSystem.model.project.ModuleDependencyData
|
||||
import com.intellij.util.containers.HashSetInterner
|
||||
import com.intellij.util.containers.Interner
|
||||
import java.util.function.Function
|
||||
|
||||
class DeduplicateVisitorsSupplier {
|
||||
|
||||
private val myModuleData: Interner<ModuleData> = Interner()
|
||||
private val myLibraryData: Interner<LibraryData> = Interner()
|
||||
private val myModuleData: Interner<ModuleData> = HashSetInterner()
|
||||
private val myLibraryData: Interner<LibraryData> = HashSetInterner()
|
||||
|
||||
fun getVisitor(key: Key<*>): Function<*,*>? = when (key) {
|
||||
ProjectKeys.LIBRARY_DEPENDENCY -> Function { dep: LibraryDependencyData? -> visit(dep) }
|
||||
|
||||
+2
-1
@@ -40,6 +40,7 @@ import com.intellij.profile.codeInspection.ProjectInspectionProfileManager;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.util.*;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.containers.Interner;
|
||||
import com.intellij.util.containers.SmartHashSet;
|
||||
import com.intellij.util.containers.WeakInterner;
|
||||
import com.intellij.util.ui.UIUtil;
|
||||
@@ -592,7 +593,7 @@ public class LocalInspectionsPass extends ProgressableTextEditorHighlightingPass
|
||||
}
|
||||
|
||||
|
||||
private static final WeakInterner<String> tooltips = new WeakInterner<>();
|
||||
private static final Interner<String> tooltips = new WeakInterner<>();
|
||||
|
||||
private static boolean showToolDescription(@NotNull LocalInspectionToolWrapper tool) {
|
||||
return tool.getStaticDescription() == null || !tool.getStaticDescription().isEmpty();
|
||||
|
||||
+2
-2
@@ -16,7 +16,7 @@ import com.intellij.openapi.extensions.ExtensionNotApplicableException;
|
||||
import com.intellij.openapi.util.Pair;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.util.concurrency.SequentialTaskExecutor;
|
||||
import com.intellij.util.containers.StringInterner;
|
||||
import com.intellij.util.containers.Interner;
|
||||
import com.intellij.util.containers.WeakStringInterner;
|
||||
import org.jdom.Element;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
@@ -32,7 +32,7 @@ public final class IntentionManagerSettings implements PersistentStateComponent<
|
||||
private static final Logger LOG = Logger.getInstance(IntentionManagerSettings.class);
|
||||
|
||||
private static final class MetaDataKey extends Pair<String, String> {
|
||||
private static final StringInterner ourInterner = new WeakStringInterner();
|
||||
private static final Interner<String> ourInterner = new WeakStringInterner();
|
||||
private MetaDataKey(@NotNull String[] categoryNames, @NotNull final String familyName) {
|
||||
super(StringUtil.join(categoryNames, ":"), ourInterner.intern(familyName));
|
||||
}
|
||||
|
||||
+2
-1
@@ -5,6 +5,7 @@ package com.intellij.codeInspection.offlineViewer;
|
||||
import com.intellij.codeInspection.InspectionApplication;
|
||||
import com.intellij.codeInspection.offline.OfflineProblemDescriptor;
|
||||
import com.intellij.codeInspection.reference.SmartRefElementPointerImpl;
|
||||
import com.intellij.util.containers.Interner;
|
||||
import com.intellij.util.containers.StringInterner;
|
||||
import com.thoughtworks.xstream.io.xml.XppReader;
|
||||
import gnu.trove.THashSet;
|
||||
@@ -37,7 +38,7 @@ public class OfflineViewParseUtil {
|
||||
|
||||
public static Map<String, Set<OfflineProblemDescriptor>> parse(Reader problemReader) {
|
||||
TObjectIntHashMap<String> fqName2IdxMap = new TObjectIntHashMap<>();
|
||||
StringInterner stringInterner = new StringInterner();
|
||||
Interner<String> stringInterner = new StringInterner();
|
||||
Map<String, Set<OfflineProblemDescriptor>> package2Result = new HashMap<>();
|
||||
XppReader reader = new XppReader(problemReader, new MXParser());
|
||||
try {
|
||||
|
||||
@@ -5,10 +5,9 @@ package com.intellij.codeInspection.ui;
|
||||
import com.intellij.codeHighlighting.HighlightDisplayLevel;
|
||||
import com.intellij.codeInspection.reference.RefEntity;
|
||||
import com.intellij.lang.annotation.HighlightSeverity;
|
||||
import com.intellij.openapi.util.AtomicClearableLazyValue;
|
||||
import com.intellij.openapi.util.RecursionGuard;
|
||||
import com.intellij.util.containers.BidirectionalMap;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.containers.Interner;
|
||||
import com.intellij.util.containers.WeakInterner;
|
||||
import gnu.trove.TObjectHashingStrategy;
|
||||
import gnu.trove.TObjectIntHashMap;
|
||||
@@ -23,7 +22,7 @@ import java.util.*;
|
||||
* @author max
|
||||
*/
|
||||
public abstract class InspectionTreeNode implements TreeNode {
|
||||
private static final WeakInterner<LevelAndCount[]> LEVEL_AND_COUNT_INTERNER = new WeakInterner<>(new TObjectHashingStrategy<LevelAndCount[]>() {
|
||||
private static final Interner<LevelAndCount[]> LEVEL_AND_COUNT_INTERNER = new WeakInterner<>(new TObjectHashingStrategy<LevelAndCount[]>() {
|
||||
@Override
|
||||
public int computeHashCode(LevelAndCount[] object) {
|
||||
return Arrays.hashCode(object);
|
||||
|
||||
+2
-1
@@ -27,6 +27,7 @@ import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.psi.PsiLanguageInjectionHost;
|
||||
import com.intellij.util.containers.FactoryMap;
|
||||
import com.intellij.util.containers.HashSetInterner;
|
||||
import com.intellij.util.containers.Interner;
|
||||
import gnu.trove.THashMap;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -42,7 +43,7 @@ import java.util.stream.Stream;
|
||||
public class InspectionViewSuppressActionHolder {
|
||||
private final Map<String, Map<ContextDescriptor, SuppressIntentionAction[]>> mySuppressActions =
|
||||
FactoryMap.create(__ -> new THashMap<>());
|
||||
private final Interner<Set<SuppressIntentionAction>> myActionSetInterner = new Interner<>();
|
||||
private final Interner<Set<SuppressIntentionAction>> myActionSetInterner = new HashSetInterner<>();
|
||||
|
||||
@NotNull
|
||||
public synchronized SuppressIntentionAction[] getSuppressActions(@NotNull InspectionToolWrapper wrapper, @NotNull PsiElement context) {
|
||||
|
||||
@@ -18,6 +18,7 @@ import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.profile.codeInspection.InspectionProfileManager;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.util.ObjectUtils;
|
||||
import com.intellij.util.containers.Interner;
|
||||
import com.intellij.util.containers.WeakStringInterner;
|
||||
import gnu.trove.TObjectIntHashMap;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -159,7 +160,7 @@ public class ProblemDescriptionNode extends SuppressableInspectionTreeNode {
|
||||
return descriptor != null && getPresentation().isExcluded(descriptor);
|
||||
}
|
||||
|
||||
private static final WeakStringInterner NAME_INTERNER = new WeakStringInterner();
|
||||
private static final Interner<String> NAME_INTERNER = new WeakStringInterner();
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
|
||||
+2
-3
@@ -5,15 +5,14 @@ package com.intellij.codeInspection.ui;
|
||||
|
||||
import com.intellij.codeInspection.CommonProblemDescriptor;
|
||||
import com.intellij.codeInspection.SuppressIntentionAction;
|
||||
import com.intellij.codeInspection.offlineViewer.OfflineProblemDescriptorNode;
|
||||
import com.intellij.codeInspection.reference.RefEntity;
|
||||
import com.intellij.concurrency.ConcurrentCollectionFactory;
|
||||
import com.intellij.openapi.application.ReadAction;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Pair;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiManager;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.containers.HashSetInterner;
|
||||
import com.intellij.util.containers.Interner;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -181,7 +180,7 @@ public abstract class SuppressableInspectionTreeNode extends InspectionTreeNode
|
||||
}
|
||||
|
||||
private static class NodeState {
|
||||
private static final Interner<NodeState> INTERNER = new Interner<>();
|
||||
private static final Interner<NodeState> INTERNER = new HashSetInterner<>();
|
||||
private final boolean isValid;
|
||||
private final boolean isSuppressed;
|
||||
private final boolean isFixApplied;
|
||||
|
||||
@@ -30,6 +30,7 @@ import com.intellij.util.Function;
|
||||
import com.intellij.util.ProcessingContext;
|
||||
import com.intellij.util.ReflectionUtil;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.containers.Interner;
|
||||
import com.intellij.util.containers.Stack;
|
||||
import com.intellij.util.containers.StringInterner;
|
||||
import gnu.trove.THashMap;
|
||||
@@ -48,7 +49,7 @@ public class PatternCompilerImpl<T> implements PatternCompiler<T> {
|
||||
private static final Logger LOG = Logger.getInstance(PatternCompilerImpl.class.getName());
|
||||
|
||||
private final Set<Method> myStaticMethods;
|
||||
private final StringInterner myStringInterner = new StringInterner();
|
||||
private final Interner<String> myStringInterner = new StringInterner();
|
||||
|
||||
public PatternCompilerImpl(final List<Class> patternClasses) {
|
||||
myStaticMethods = getStaticMethods(patternClasses);
|
||||
|
||||
+2
-1
@@ -36,6 +36,7 @@ import com.intellij.util.ObjectUtils;
|
||||
import com.intellij.util.SmartList;
|
||||
import com.intellij.util.concurrency.AppExecutorUtil;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.containers.Interner;
|
||||
import com.intellij.util.containers.StringInterner;
|
||||
import com.intellij.util.graph.*;
|
||||
import com.intellij.util.messages.MessageBus;
|
||||
@@ -128,7 +129,7 @@ public abstract class ModuleManagerImpl extends ModuleManager implements Disposa
|
||||
}
|
||||
|
||||
private static class ModuleGroupInterner {
|
||||
private final StringInterner groups = new StringInterner();
|
||||
private final Interner<String> groups = new StringInterner();
|
||||
private final Map<String[], String[]> paths = new THashMap<>(new TObjectHashingStrategy<String[]>() {
|
||||
@Override
|
||||
public int computeHashCode(String[] object) {
|
||||
|
||||
@@ -7,6 +7,7 @@ import com.intellij.util.ReflectionUtil;
|
||||
import com.intellij.util.concurrency.AtomicFieldUpdater;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.containers.FilteringIterator;
|
||||
import com.intellij.util.containers.Interner;
|
||||
import com.intellij.util.containers.WeakInterner;
|
||||
import gnu.trove.TObjectHashingStrategy;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -26,7 +27,7 @@ import java.util.Arrays;
|
||||
* 1) too slow and 2) explodes Throwable retained size by polluting Throwable.stackTrace fields.
|
||||
*/
|
||||
public class ThrowableInterner {
|
||||
private static final WeakInterner<Throwable> myTraceInterner = new WeakInterner<>(new TObjectHashingStrategy<Throwable>() {
|
||||
private static final Interner<Throwable> myTraceInterner = new WeakInterner<>(new TObjectHashingStrategy<Throwable>() {
|
||||
@Override
|
||||
public int computeHashCode(Throwable throwable) {
|
||||
String message = throwable.getMessage();
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
// Copyright 2000-2019 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.util.containers;
|
||||
|
||||
import gnu.trove.TObjectHashingStrategy;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Allow to reuse structurally equal objects to avoid memory being wasted on them. Note: objects are cached inside
|
||||
* and on hard references, so even the ones that are not used anymore will be still present in the memory.
|
||||
*
|
||||
* @see WeakInterner
|
||||
* @author peter
|
||||
*/
|
||||
|
||||
public class HashSetInterner<T> extends Interner<T> {
|
||||
private final OpenTHashSet<T> mySet;
|
||||
|
||||
public HashSetInterner() {
|
||||
mySet = new OpenTHashSet<>();
|
||||
}
|
||||
|
||||
public HashSetInterner(@NotNull Collection<? extends T> initialItems) {
|
||||
mySet = new OpenTHashSet<>(initialItems);
|
||||
}
|
||||
|
||||
public HashSetInterner(@NotNull TObjectHashingStrategy<T> strategy) {
|
||||
mySet = new OpenTHashSet<>(strategy);
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public T intern(@NotNull T name) {
|
||||
T interned = mySet.get(name);
|
||||
if (interned != null) {
|
||||
return interned;
|
||||
}
|
||||
|
||||
boolean added = mySet.add(name);
|
||||
assert added;
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clear() {
|
||||
mySet.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public Set<T> getValues() {
|
||||
return mySet;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,55 +1,20 @@
|
||||
// Copyright 2000-2019 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.util.containers;
|
||||
|
||||
import gnu.trove.TObjectHashingStrategy;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Allow to reuse structurally equal objects to avoid memory being wasted on them. Note: objects are cached inside
|
||||
* and on hard references, so even the ones that are not used anymore will be still present in the memory.
|
||||
*
|
||||
* @see WeakInterner
|
||||
* @author peter
|
||||
*/
|
||||
|
||||
public class Interner<T> {
|
||||
private final OpenTHashSet<T> mySet;
|
||||
|
||||
public Interner() {
|
||||
mySet = new OpenTHashSet<>();
|
||||
}
|
||||
|
||||
public Interner(@NotNull Collection<? extends T> initialItems) {
|
||||
mySet = new OpenTHashSet<>(initialItems);
|
||||
}
|
||||
|
||||
public Interner(@NotNull TObjectHashingStrategy<T> strategy) {
|
||||
mySet = new OpenTHashSet<>(strategy);
|
||||
}
|
||||
|
||||
public abstract class Interner<T> {
|
||||
@NotNull
|
||||
public T intern(@NotNull T name) {
|
||||
T interned = mySet.get(name);
|
||||
if (interned != null) {
|
||||
return interned;
|
||||
}
|
||||
|
||||
boolean added = mySet.add(name);
|
||||
assert added;
|
||||
|
||||
return name;
|
||||
public T intern(@NotNull T name){
|
||||
throw new AbstractMethodError();
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
mySet.clear();
|
||||
}
|
||||
public abstract void clear();
|
||||
|
||||
@NotNull
|
||||
public Set<T> getValues() {
|
||||
return mySet;
|
||||
throw new AbstractMethodError();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -18,6 +18,6 @@ package com.intellij.util.containers;
|
||||
/**
|
||||
* @author max
|
||||
*/
|
||||
public class StringInterner extends Interner<String> {
|
||||
public class StringInterner extends HashSetInterner<String> {
|
||||
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ import java.util.concurrent.ConcurrentMap;
|
||||
*
|
||||
* @author peter
|
||||
*/
|
||||
public class WeakInterner<T> {
|
||||
public class WeakInterner<T> extends Interner<T> {
|
||||
private final ConcurrentMap<T, T> myMap;
|
||||
|
||||
public WeakInterner() {
|
||||
@@ -25,15 +25,18 @@ public class WeakInterner<T> {
|
||||
myMap = ContainerUtil.createConcurrentWeakKeyWeakValueMap(strategy);
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public T intern(@NotNull T name) {
|
||||
return ConcurrencyUtil.cacheOrGet(myMap, name, name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clear() {
|
||||
myMap.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public Set<T> getValues() {
|
||||
return new THashSet<>(myMap.values());
|
||||
|
||||
@@ -5,6 +5,7 @@ import com.intellij.openapi.util.Comparing;
|
||||
import com.intellij.openapi.util.Condition;
|
||||
import com.intellij.openapi.util.Conditions;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.containers.Interner;
|
||||
import com.intellij.util.containers.OpenTHashSet;
|
||||
import com.intellij.util.containers.StringInterner;
|
||||
import gnu.trove.TObjectHashingStrategy;
|
||||
@@ -16,7 +17,7 @@ import static com.intellij.openapi.util.JDOMUtil.getAttributes;
|
||||
|
||||
public class JDOMInterner {
|
||||
private static final Condition<Object> IS_ELEMENT = Conditions.instanceOf(Element.class);
|
||||
private final StringInterner myStrings = new StringInterner();
|
||||
private final Interner<String> myStrings = new StringInterner();
|
||||
private final OpenTHashSet<Element> myElements = new OpenTHashSet<>(new TObjectHashingStrategy<Element>() {
|
||||
@Override
|
||||
public int computeHashCode(Element e) {
|
||||
|
||||
@@ -7,6 +7,7 @@ import com.intellij.openapi.application.PathManager
|
||||
import com.intellij.openapi.diagnostic.Logger
|
||||
import com.intellij.openapi.progress.ProcessCanceledException
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.util.containers.HashSetInterner
|
||||
import com.intellij.util.containers.Interner
|
||||
import com.intellij.util.io.*
|
||||
import com.intellij.vcs.log.VcsUser
|
||||
@@ -30,7 +31,7 @@ class VcsUserRegistryImpl internal constructor(project: Project) : Disposable, V
|
||||
|
||||
init {
|
||||
initEnumerator()
|
||||
interner = Interner()
|
||||
interner = HashSetInterner()
|
||||
}
|
||||
|
||||
private fun initEnumerator(): Boolean {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.intellij.vcs.log.impl;
|
||||
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.util.containers.Interner;
|
||||
import com.intellij.util.containers.WeakStringInterner;
|
||||
import com.intellij.vcs.log.Hash;
|
||||
import com.intellij.vcs.log.VcsRef;
|
||||
@@ -11,7 +12,7 @@ import org.jetbrains.annotations.NotNull;
|
||||
* @author erokhins
|
||||
*/
|
||||
public final class VcsRefImpl implements VcsRef {
|
||||
private static final WeakStringInterner ourNames = new WeakStringInterner();
|
||||
private static final Interner<String> ourNames = new WeakStringInterner();
|
||||
@NotNull private final Hash myCommitHash;
|
||||
@NotNull private final String myName;
|
||||
@NotNull private final VcsRefType myType;
|
||||
|
||||
@@ -20,6 +20,7 @@ import com.intellij.openapi.vcs.vfs.VcsFileSystem;
|
||||
import com.intellij.openapi.vcs.vfs.VcsVirtualFile;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.containers.HashSetInterner;
|
||||
import com.intellij.util.containers.Interner;
|
||||
import com.intellij.vcs.AnnotationProviderEx;
|
||||
import com.intellij.vcs.log.VcsUser;
|
||||
@@ -261,7 +262,7 @@ public class GitAnnotationProvider implements AnnotationProviderEx {
|
||||
@NotNull VirtualFile file,
|
||||
@NotNull VirtualFile root,
|
||||
@NotNull String output) throws VcsException {
|
||||
Interner<FilePath> pathInterner = new Interner<>();
|
||||
Interner<FilePath> pathInterner = new HashSetInterner<>();
|
||||
|
||||
try {
|
||||
List<LineInfo> lines = new ArrayList<>();
|
||||
|
||||
+5
-4
@@ -23,6 +23,7 @@ import com.intellij.openapi.project.Project;
|
||||
import com.intellij.pom.Navigatable;
|
||||
import com.intellij.reference.SoftReference;
|
||||
import com.intellij.util.SmartList;
|
||||
import com.intellij.util.containers.Interner;
|
||||
import com.intellij.util.containers.StringInterner;
|
||||
import org.intellij.plugins.xsltDebugger.XsltDebuggerSession;
|
||||
import org.intellij.plugins.xsltDebugger.rt.engine.OutputEventQueue;
|
||||
@@ -43,18 +44,18 @@ public class GeneratedStructureModel extends DefaultTreeModel {
|
||||
@NonNls
|
||||
private static final String PENDING = "...";
|
||||
|
||||
private static WeakReference<StringInterner> ourSharedInterner;
|
||||
private static WeakReference<Interner<String>> ourSharedInterner;
|
||||
|
||||
private final LinkedList<DefaultMutableTreeNode> myCurrentPath = new LinkedList<>();
|
||||
private final List<DefaultMutableTreeNode> myLastNodes = new LinkedList<>();
|
||||
|
||||
private final StringInterner myInterner = getInterner();
|
||||
private final Interner<String> myInterner = getInterner();
|
||||
|
||||
// we keep a shared string interner across all currently running xslt debugger instances. it should go away once
|
||||
// all instances (and their toolwindow contents) are gone. This should minimize the memory usage of the generated
|
||||
// structure tree.
|
||||
private static StringInterner getInterner() {
|
||||
StringInterner interner = SoftReference.dereference(ourSharedInterner);
|
||||
private static Interner<String> getInterner() {
|
||||
Interner<String> interner = SoftReference.dereference(ourSharedInterner);
|
||||
if (interner == null) {
|
||||
interner = new StringInterner();
|
||||
ourSharedInterner = new WeakReference<>(interner);
|
||||
|
||||
@@ -9,6 +9,7 @@ import com.intellij.reference.SoftReference;
|
||||
import com.intellij.util.ArrayUtil;
|
||||
import com.intellij.util.Processor;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.containers.Interner;
|
||||
import com.intellij.util.containers.WeakInterner;
|
||||
import com.intellij.util.xml.DomElement;
|
||||
import com.intellij.util.xml.GenericDomValue;
|
||||
@@ -27,7 +28,7 @@ import java.util.Set;
|
||||
* @author peter
|
||||
*/
|
||||
public class DynamicGenericInfo extends DomGenericInfoEx {
|
||||
private static final Key<SoftReference<WeakInterner<ChildrenDescriptionsHolder>>> HOLDERS_CACHE = Key.create("DOM_CHILDREN_HOLDERS_CACHE");
|
||||
private static final Key<SoftReference<Interner<ChildrenDescriptionsHolder>>> HOLDERS_CACHE = Key.create("DOM_CHILDREN_HOLDERS_CACHE");
|
||||
private final StaticGenericInfo myStaticGenericInfo;
|
||||
@NotNull private final DomInvocationHandler myInvocationHandler;
|
||||
private volatile boolean myInitialized;
|
||||
@@ -106,8 +107,8 @@ public class DynamicGenericInfo extends DomGenericInfoEx {
|
||||
}
|
||||
|
||||
private static <T extends DomChildDescriptionImpl> ChildrenDescriptionsHolder<T> internChildrenHolder(XmlFile file, ChildrenDescriptionsHolder<T> holder) {
|
||||
SoftReference<WeakInterner<ChildrenDescriptionsHolder>> ref = file.getUserData(HOLDERS_CACHE);
|
||||
WeakInterner<ChildrenDescriptionsHolder> cache = SoftReference.dereference(ref);
|
||||
SoftReference<Interner<ChildrenDescriptionsHolder>> ref = file.getUserData(HOLDERS_CACHE);
|
||||
Interner<ChildrenDescriptionsHolder> cache = SoftReference.dereference(ref);
|
||||
if (cache == null) {
|
||||
cache = new WeakInterner<>();
|
||||
file.putUserData(HOLDERS_CACHE, new SoftReference<>(cache));
|
||||
|
||||
Reference in New Issue
Block a user