project reference should not leak via cached find data

GitOrigin-RevId: 9abd40f5bee366e820e9b309f13022003c93b257
This commit is contained in:
Dmitry Batkovich
2020-06-10 13:46:57 +03:00
committed by intellij-monorepo-bot
parent e8d20daaa2
commit 858c78591d
@@ -6,13 +6,7 @@ import com.intellij.codeInsight.highlighting.HighlightManagerImpl;
import com.intellij.codeInsight.hint.HintManager;
import com.intellij.codeInsight.hint.HintManagerImpl;
import com.intellij.codeInsight.hint.HintUtil;
import com.intellij.find.EditorSearchSession;
import com.intellij.find.FindBundle;
import com.intellij.find.FindInProjectSettings;
import com.intellij.find.FindManager;
import com.intellij.find.FindModel;
import com.intellij.find.FindResult;
import com.intellij.find.FindSettings;
import com.intellij.find.*;
import com.intellij.find.findUsages.FindUsagesManager;
import com.intellij.find.impl.livePreview.SearchResults;
import com.intellij.lang.Language;
@@ -32,11 +26,7 @@ import com.intellij.openapi.actionSystem.IdeActions;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ReadAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.FoldRegion;
import com.intellij.openapi.editor.FoldingModel;
import com.intellij.openapi.editor.ScrollType;
import com.intellij.openapi.editor.*;
import com.intellij.openapi.editor.colors.TextAttributesKey;
import com.intellij.openapi.editor.ex.FoldingModelEx;
import com.intellij.openapi.editor.markup.RangeHighlighter;
@@ -49,21 +39,12 @@ import com.intellij.openapi.fileTypes.SyntaxHighlighterFactory;
import com.intellij.openapi.fileTypes.impl.AbstractFileType;
import com.intellij.openapi.keymap.KeymapUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.KeyWithDefaultValue;
import com.intellij.openapi.util.NlsContexts;
import com.intellij.openapi.util.*;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.patterns.StringPattern;
import com.intellij.psi.CustomHighlighterTokenType;
import com.intellij.psi.FileViewProvider;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.*;
import com.intellij.psi.search.SearchScope;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.TokenSet;
@@ -73,27 +54,21 @@ import com.intellij.usages.ChunkExtractor;
import com.intellij.usages.impl.SyntaxHighlighterOverEditorHighlighter;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.IntObjectMap;
import com.intellij.util.containers.Predicate;
import com.intellij.util.text.CharArrayUtil;
import com.intellij.util.text.ImmutableCharSequence;
import com.intellij.util.text.StringSearcher;
import gnu.trove.THashSet;
import java.awt.Point;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.NavigableMap;
import java.util.Objects;
import java.util.Set;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JComponent;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.util.List;
import java.util.*;
import java.util.function.Predicate;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public final class FindManagerImpl extends FindManager {
private static final Logger LOG = Logger.getInstance(FindManagerImpl.class);
@@ -174,6 +149,7 @@ public final class FindManagerImpl extends FindManager {
else{
myReplaceInFilePromptPos = replacePromptDialog.getLocation();
}
//noinspection MagicConstant
return replacePromptDialog.getExitCode();
}
@@ -299,7 +275,7 @@ public final class FindManagerImpl extends FindManager {
final char[] textArray = CharArrayUtil.fromSequenceWithoutCopying(text);
while(true) {
FindResult result = doFindString(text, textArray, offset, model, file);
if (filter == null || filter.apply(result)) {
if (filter == null || filter.test(result)) {
if (!model.isWholeWordsOnly()) {
return result;
}
@@ -316,42 +292,52 @@ public final class FindManagerImpl extends FindManager {
}
}
private class FindExceptCommentsOrLiteralsData implements Predicate<FindResult> {
private static class FindExceptCommentsOrLiteralsData implements Predicate<FindResult> {
private final VirtualFile myFile;
private final FindModel myFindModel;
private final TreeMap<Integer, Integer> mySkipRangesSet;
private final CharSequence myText;
private FindExceptCommentsOrLiteralsData(VirtualFile file, FindModel model, CharSequence text) {
myFile = file;
myFindModel = model.clone();
myText = ImmutableCharSequence.asImmutable(text);
TreeMap<Integer, Integer> result = new TreeMap<>();
static FindExceptCommentsOrLiteralsData create(@NotNull VirtualFile file,
@NotNull FindModel model,
@NotNull CharSequence text,
@NotNull FindManagerImpl manager) {
TreeMap<Integer, Integer> skipRangesSet = new TreeMap<>();
if (model.isExceptComments() || model.isExceptCommentsAndStringLiterals()) {
addRanges(file, model, text, result, FindModel.SearchContext.IN_COMMENTS);
addRanges(file, model, text, skipRangesSet, FindModel.SearchContext.IN_COMMENTS, manager);
}
if (model.isExceptStringLiterals() || model.isExceptCommentsAndStringLiterals()) {
addRanges(file, model, text, result, FindModel.SearchContext.IN_STRING_LITERALS);
addRanges(file, model, text, skipRangesSet, FindModel.SearchContext.IN_STRING_LITERALS, manager);
}
mySkipRangesSet = result;
return new FindExceptCommentsOrLiteralsData(file, model.clone(), ImmutableCharSequence.asImmutable(text), skipRangesSet);
}
private void addRanges(VirtualFile file,
FindModel model,
CharSequence text,
TreeMap<Integer, Integer> result,
FindModel.SearchContext searchContext) {
FindExceptCommentsOrLiteralsData(@NotNull VirtualFile file,
@NotNull FindModel model,
@NotNull CharSequence text,
@NotNull TreeMap<Integer, Integer> skipRangesSet) {
myFile = file;
myFindModel = model.clone();
myText = ImmutableCharSequence.asImmutable(text);
mySkipRangesSet = skipRangesSet;
}
private static void addRanges(VirtualFile file,
FindModel model,
CharSequence text,
TreeMap<Integer, Integer> result,
FindModel.SearchContext searchContext,
FindManagerImpl manager) {
FindModel clonedModel = model.clone();
clonedModel.setSearchContext(searchContext);
clonedModel.setForward(true);
int offset = 0;
while(true) {
FindResult customResult = findStringLoop(text, offset, clonedModel, file, null);
FindResult customResult = manager.findStringLoop(text, offset, clonedModel, file, null);
if (!customResult.isStringFound()) break;
result.put(customResult.getStartOffset(), customResult.getEndOffset());
offset = Math.max(customResult.getEndOffset(), offset + 1); // avoid loop for zero size reg exps matches
@@ -367,7 +353,7 @@ public final class FindManagerImpl extends FindManager {
}
@Override
public boolean apply(@Nullable FindResult input) {
public boolean test(@Nullable FindResult input) {
if (input == null || !input.isStringFound()) return true;
NavigableMap<Integer, Integer> map = mySkipRangesSet.headMap(input.getStartOffset(), true);
for(Map.Entry<Integer, Integer> e:map.descendingMap().entrySet()) {
@@ -380,7 +366,7 @@ public final class FindManagerImpl extends FindManager {
}
private static final Key<ThreadLocal<FindExceptCommentsOrLiteralsData>> ourExceptCommentsOrLiteralsDataKey = KeyWithDefaultValue.create("except.comments.literals.search.data", () -> new ThreadLocal<>());
private Predicate<FindResult> getFindContextPredicate(@NotNull FindModel model, VirtualFile file, CharSequence text) {
private Predicate<FindResult> getFindContextPredicate(@NotNull FindModel model, @Nullable VirtualFile file, @NotNull CharSequence text) {
if (file == null) return null;
FindModel.SearchContext context = model.getSearchContext();
if( context == FindModel.SearchContext.ANY || context == FindModel.SearchContext.IN_COMMENTS ||
@@ -396,7 +382,7 @@ public final class FindManagerImpl extends FindManager {
FindExceptCommentsOrLiteralsData currentThreadData = data.get();
if (currentThreadData == null || !currentThreadData.isAcceptableFor(model, file, text)) {
data.set(currentThreadData = new FindExceptCommentsOrLiteralsData(file, model, text));
data.set(currentThreadData = FindExceptCommentsOrLiteralsData.create(file, model, text, this));
}
return currentThreadData;
}
@@ -829,6 +815,7 @@ public final class FindManagerImpl extends FindManager {
private static Matcher compileRegexAndFindFirst(FindModel model, CharSequence text, int startOffset) {
model = normalizeIfMultilined(model);
Matcher matcher = compileRegExp(model, text);
assert matcher != null;
if (model.isForward()){
if (!matcher.find(startOffset)) {