refactor interners: extract common super class, generalize usages

GitOrigin-RevId: 7958f52e8fb1c6a1b95b9f9c88e6cc3e0e5b5d90
This commit is contained in:
Alexey Kudravtsev
2019-05-22 17:08:10 +03:00
committed by intellij-monorepo-bot
parent 30b6d83993
commit ac3221470f
31 changed files with 138 additions and 88 deletions
@@ -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;
@@ -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()
@@ -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) }
@@ -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();
@@ -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));
}
@@ -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);
@@ -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
@@ -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);
@@ -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());
+2 -1
View File
@@ -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<>();
@@ -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));