a bit of performance: reduce allocation

GitOrigin-RevId: e686767e0d5fe6182499491a72e7c241ace23b94
This commit is contained in:
Alexey Kudravtsev
2021-03-06 18:04:13 +00:00
committed by intellij-monorepo-bot
parent 65f1120840
commit 42deff2c7a
3 changed files with 26 additions and 16 deletions
@@ -20,6 +20,7 @@ import com.intellij.util.Processor;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.DistinctRootsCollection;
import com.intellij.util.io.URLUtil;
import com.intellij.util.text.CharArrayUtil;
import org.jetbrains.annotations.*;
import java.io.*;
@@ -731,19 +732,17 @@ public class VfsUtilCore {
path = FileUtil.toCanonicalPath(path);
int li = path.length();
while (file != null && li != -1) {
int i = path.lastIndexOf('/', li - 1);
int sepIndex = path.lastIndexOf('/', li - 1);
CharSequence fileName = file.getNameSequence();
if (i == 6 && StringUtil.startsWith(fileName, "//wsl$")) {
i = -1;
int fileNameEnd = fileName.length() + (StringUtil.endsWithChar(fileName, '/') ? -1 : 0);
if (sepIndex == 6 && StringUtil.startsWith(fileName, "//wsl$")) {
sepIndex = -1;
}
if (StringUtil.endsWithChar(fileName, '/')) {
fileName = fileName.subSequence(0, fileName.length() - 1);
}
if (!StringUtilRt.equal(fileName, path.substring(i + 1, li), file.isCaseSensitive())) {
if (!CharArrayUtil.regionMatches(fileName, 0, fileNameEnd, path, sepIndex + 1, li, file.isCaseSensitive())) {
return false;
}
file = file.getParent();
li = i;
li = sepIndex;
}
return li == -1 && file == null;
}
@@ -58,7 +58,6 @@ import java.util.stream.Stream;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.*;
import static org.junit.Assume.assumeFalse;
import static org.junit.Assume.assumeTrue;
public class VfsUtilTest extends BareTestFixtureTestCase {
@@ -555,12 +554,12 @@ public class VfsUtilTest extends BareTestFixtureTestCase {
assumeTrue("No WSL distributions found", !distributions.isEmpty());
String wslName = distributions.get(0);
VirtualFile file = LocalFileSystem.getInstance().findFileByIoFile(new File("\\\\wsl$\\" + wslName + "\\usr\\bin\\"));
assertTrue(VfsUtilCore.pathEqualsTo(file, "\\\\wsl$\\" + wslName + "\\usr\\bin\\"));
assertTrue(VfsUtilCore.pathEqualsTo(file, "//wsl$/" + wslName + "/usr/bin"));
assertTrue(VfsUtilCore.pathEqualsTo(file, "//wsl$/" + wslName + "/usr/bin/"));
assertFalse(VfsUtilCore.pathEqualsTo(file, "//xxx$/" + wslName + "/usr/bin/"));
assertFalse(VfsUtilCore.pathEqualsTo(file, "//wsl$/xxx/usr/bin/"));
VirtualFile usrBin = LocalFileSystem.getInstance().findFileByIoFile(new File("\\\\wsl$\\" + wslName + "\\usr\\bin\\"));
assertTrue(VfsUtilCore.pathEqualsTo(usrBin, "\\\\wsl$\\" + wslName + "\\usr\\bin\\"));
assertTrue(VfsUtilCore.pathEqualsTo(usrBin, "//wsl$/" + wslName + "/usr/bin"));
assertTrue(VfsUtilCore.pathEqualsTo(usrBin, "//wsl$/" + wslName + "/usr/bin/"));
assertFalse(VfsUtilCore.pathEqualsTo(usrBin, "//xxx$/" + wslName + "/usr/bin/"));
assertFalse(VfsUtilCore.pathEqualsTo(usrBin, "//wsl$/xxx/usr/bin/"));
assertFalse(VfsUtilCore.pathEqualsTo(usrBin.getParent(), "//wsl$/xxx/usr"));
}
}
@@ -2,6 +2,7 @@
package com.intellij.util.text;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.text.StringUtilRt;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -296,6 +297,17 @@ public final class CharArrayUtil {
}
return true;
}
public static boolean regionMatches(@NotNull CharSequence s1, int start1, int end1, @NotNull CharSequence s2, int start2, int end2, boolean caseSensitive) {
if (caseSensitive) {
return regionMatches(s1, start1, end1, s2, start2, end2);
}
if (end1-start1 != end2-start2) return false;
for (int i = start1,j=start2; i < end1; i++,j++) {
if (!StringUtilRt.charsEqualIgnoreCase(s1.charAt(i), s2.charAt(j))) return false;
}
return true;
}
public static boolean regionMatches(@NotNull CharSequence buffer, int offset, @NotNull CharSequence s) {
if (offset + s.length() > buffer.length()) return false;