mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
ConstantExpressionVisitor: decrease memory pressure
1. Use weak-referenced keys as it's unnecessary for cached constant values to live longer than any other reference (if PsiElement disappeared everywhere except constant expression cache, no reason to keep it in constant expression cache either) 2. Replace PsiClassReferenceType (as class literal value) as it keeps the strong reference to the surrounding PsiFile, so until the whole constant expression cache is invalidated (e.g. on PSI change) we don't free any file containing xyz.class expression.
This commit is contained in:
@@ -16,16 +16,17 @@
|
||||
package com.intellij.psi.impl;
|
||||
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.impl.source.PsiClassReferenceType;
|
||||
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 java.util.HashMap;
|
||||
import com.intellij.util.containers.StringInterner;
|
||||
import gnu.trove.THashSet;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
@@ -507,7 +508,14 @@ class ConstantExpressionVisitor extends JavaElementVisitor implements PsiConstan
|
||||
|
||||
@Override
|
||||
public void visitClassObjectAccessExpression(PsiClassObjectAccessExpression expression) {
|
||||
myResult = expression.getOperand().getType();
|
||||
PsiType type = expression.getOperand().getType();
|
||||
if (type instanceof PsiClassReferenceType) {
|
||||
PsiClass aClass = ((PsiClassReferenceType)type).resolve();
|
||||
if (aClass != null) {
|
||||
type = JavaPsiFacade.getElementFactory(expression.getProject()).createType(aClass, ((PsiClassReferenceType)type).getParameters());
|
||||
}
|
||||
}
|
||||
myResult = type;
|
||||
}
|
||||
|
||||
@Override public void visitReferenceExpression(PsiReferenceExpression expression) {
|
||||
|
||||
@@ -89,7 +89,7 @@ public class JavaConstantExpressionEvaluator extends JavaRecursiveElementWalking
|
||||
}
|
||||
|
||||
private static final CachedValueProvider<ConcurrentMap<PsiElement,Object>> PROVIDER = () -> {
|
||||
ConcurrentMap<PsiElement, Object> value = ContainerUtil.createConcurrentSoftMap();
|
||||
ConcurrentMap<PsiElement, Object> value = ContainerUtil.createConcurrentWeakMap();
|
||||
return CachedValueProvider.Result.create(value, PsiModificationTracker.MODIFICATION_COUNT);
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user