Skip to content

Commit

Permalink
#527 Fix for Performance warning: LineMarker is supposed to be regist…
Browse files Browse the repository at this point in the history
…ered for leaf elements only
  • Loading branch information
hsz committed Apr 13, 2018
1 parent e3a4e28 commit 7e80170
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 18 deletions.
Expand Up @@ -32,6 +32,7 @@
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.util.PlatformIcons;
import com.intellij.util.containers.ContainerUtil;
import mobi.hsz.idea.gitignore.IgnoreManager;
import mobi.hsz.idea.gitignore.psi.IgnoreEntryDirectory;
import mobi.hsz.idea.gitignore.psi.IgnoreEntryFile;
Expand All @@ -42,6 +43,7 @@
import org.jetbrains.annotations.Nullable;

import java.util.Collection;
import java.util.HashMap;
import java.util.List;

/**
Expand All @@ -52,6 +54,9 @@
* @since 0.5
*/
public class IgnoreDirectoryMarkerProvider implements LineMarkerProvider {
/** Cache map. */
private HashMap<String, Boolean> cache = ContainerUtil.newHashMap();

/**
* Returns {@link LineMarkerInfo} with set {@link PlatformIcons#FOLDER_ICON} if entry points to the directory.
*
Expand All @@ -61,28 +66,33 @@ public class IgnoreDirectoryMarkerProvider implements LineMarkerProvider {
@Nullable
@Override
public LineMarkerInfo getLineMarkerInfo(@NotNull PsiElement element) {
if (!(element instanceof IgnoreEntryFile)) {
return null;
}

boolean isDirectory = element instanceof IgnoreEntryDirectory;
if (!isDirectory && element instanceof IgnoreEntryFile) {
IgnoreEntryFile entry = (IgnoreEntryFile) element;
VirtualFile parent = element.getContainingFile().getVirtualFile().getParent();
Project project = element.getProject();
VirtualFile projectDir = project.getBaseDir();
if (parent == null || projectDir == null || !Utils.isUnder(parent, projectDir)) {
return null;
}
final MatcherUtil matcher = IgnoreManager.getInstance(project).getMatcher();
final List<VirtualFile> files = Glob.findOne(parent, entry, matcher);
for (VirtualFile file : files) {
if (!file.isDirectory()) {

if (!isDirectory) {
final String key = element.getText();
if (cache.containsKey(key)) {
isDirectory = cache.get(key);
} else {
final IgnoreEntryFile entry = (IgnoreEntryFile) element;
final VirtualFile parent = element.getContainingFile().getVirtualFile().getParent();
final Project project = element.getProject();
final VirtualFile projectDir = project.getBaseDir();
if (parent == null || projectDir == null || !Utils.isUnder(parent, projectDir)) {
return null;
}
final MatcherUtil matcher = IgnoreManager.getInstance(project).getMatcher();
final VirtualFile file = Glob.findOne(parent, entry, matcher);
cache.put(key, isDirectory = file != null && file.isDirectory());
}
isDirectory = files.size() > 0;
}

if (isDirectory) {
return new LineMarkerInfo<PsiElement>(element, element.getTextRange(), PlatformIcons.FOLDER_ICON,
Pass.UPDATE_ALL, null, null, GutterIconRenderer.Alignment.CENTER);
return new LineMarkerInfo<PsiElement>(element.getFirstChild(), element.getTextRange(),
PlatformIcons.FOLDER_ICON, Pass.UPDATE_ALL, null, null, GutterIconRenderer.Alignment.CENTER);
}
return null;
}
Expand Down
6 changes: 3 additions & 3 deletions src/mobi/hsz/idea/gitignore/util/Glob.java
Expand Up @@ -66,10 +66,10 @@ private Glob() {
* @param entry ignore entry
* @return search result
*/
@NotNull
public static List<VirtualFile> findOne(@NotNull final VirtualFile root, @NotNull IgnoreEntry entry,
@Nullable
public static VirtualFile findOne(@NotNull final VirtualFile root, @NotNull IgnoreEntry entry,
@NotNull MatcherUtil matcher) {
return find(root, ContainerUtil.newArrayList(entry), matcher, false).get(entry);
return find(root, ContainerUtil.newArrayList(entry), matcher, false).get(entry).get(0);
}

/**
Expand Down

0 comments on commit 7e80170

Please sign in to comment.