Skip to content

Commit

Permalink
Do not complete paths in attr unless beginning of value looks like a
Browse files Browse the repository at this point in the history
path

Fixes redhat-developer/vscode-xml#668

Signed-off-by: David Thompson <davthomp@redhat.com>
  • Loading branch information
datho7561 committed Sep 15, 2022
1 parent de9c702 commit 367641e
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
import java.nio.file.Path;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.eclipse.lemminx.commons.BadLocationException;
import org.eclipse.lemminx.dom.DOMDocument;
Expand Down Expand Up @@ -132,6 +134,9 @@ private static void addCompletionItems(String value, ICompletionRequest request,
return;
}
}
} else if (!hasPathBeginning(valuePath)) {
// the user probably didn't intend to complete a path
return;
}
// On Linux, Mac OS replace '\\' with '/'
if (!isWindows) {
Expand Down Expand Up @@ -259,4 +264,23 @@ private static void createFilePathCompletionItem(File f, Range replaceRange, ICo
response.addCompletionItem(item);
}

private static boolean hasPathBeginning(String currentText) {
if (currentText.startsWith("/")
|| currentText.startsWith("./")
|| currentText.startsWith("../")
|| currentText.startsWith("..\\")
|| currentText.startsWith(".\\")) {
return true;
}
return isAbsoluteWindowsPath(currentText);
}

private static boolean isAbsoluteWindowsPath(String currentText) {
char driveLetter = currentText.charAt(0);
if (driveLetter < 'A' || (driveLetter > 'Z' && driveLetter < 'a') || (driveLetter) > 'z') {
return false;
}
return currentText.charAt(1) == ':' && currentText.charAt(2) == '\\';
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ public abstract class AbstractCacheBasedTest {

@BeforeEach
public final void setupCache() throws Exception {
System.out.println(this.getClass().getName() + ": " + uuid);
clearCache();
FilesUtils.resetDeployPath();
Assertions.assertNotNull(parentDir);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,15 +66,13 @@ public void testFilePathCompletionFolderABackSlash() throws BadLocationException
@Test
public void testFilePathCompletionFolderB() throws BadLocationException {
String xml = "<a path=\"folderB/|\">";
CompletionItem[] items = getCompletionItemList("/", 0, 16, 17, "xsdB1.xsd", "xmlB1.xml");
testCompletionFor(xml, 2, items);
testCompletionFor(xml, 0);
}

@Test
public void testFilePathCompletionFolderBBackSlash() throws BadLocationException {
String xml = "<a path=\"folderB\\|\">";
CompletionItem[] items = getCompletionItemList("\\", 0, 16, 17, "xsdB1.xsd", "xmlB1.xml");
testCompletionFor(xml, 2, items);
testCompletionFor(xml, 0);
}

@Test
Expand Down Expand Up @@ -113,44 +111,42 @@ public void testFilePathCompletionFolderBAbsolutePathWithFileScheme() throws Bad

@Test
public void testFilePathCompletionNestedA() throws BadLocationException {
String xml = "<a path=\"NestedA/|\">";
CompletionItem[] items = getCompletionItemList("/", 0, 16, 17, "NestedB");
String xml = "<a path=\"./NestedA/|\">";
CompletionItem[] items = getCompletionItemList("/", 0, 18, 19, "NestedB");
testCompletionFor(xml, 1, items);
}

@Test
public void testFilePathCompletionNestedABackSlash() throws BadLocationException {
String xml = "<a path=\"NestedA\\|\">";
CompletionItem[] items = getCompletionItemList("\\", 0, 16, 17, "NestedB");
String xml = "<a path=\"./NestedA\\|\">";
CompletionItem[] items = getCompletionItemList("\\", 0, 18, 19, "NestedB");
testCompletionFor(xml, 1, items);
}

@Test
public void testFilePathCompletionNestedBIncomplete() throws BadLocationException {
String xml = "<a path=\"NestedA/NestedB/ZZZ|\">";
CompletionItem[] items = getCompletionItemList("/", 0, 24, 28, "nestedXSD.xsd");
String xml = "<a path=\"./NestedA/NestedB/ZZZ|\">";
CompletionItem[] items = getCompletionItemList("/", 0, 26, 30, "nestedXSD.xsd");
testCompletionFor(xml, 1, items);
}

@Test
public void testFilePathCompletionNestedBIncompleteBackSlash() throws BadLocationException {
String xml = "<a path=\"NestedA\\NestedB\\ZZZ|\">";
CompletionItem[] items = getCompletionItemList("\\", 0, 24, 28, "nestedXSD.xsd");
String xml = "<a path=\".\\NestedA\\NestedB\\ZZZ|\">";
CompletionItem[] items = getCompletionItemList("\\", 0, 26, 30, "nestedXSD.xsd");
testCompletionFor(xml, 1, items);
}

@Test
public void testFilePathCompletionExtraTextInValue() throws BadLocationException {
String xml = "<a path=\"NAMESPACE_IGNORE_ME NestedA/NestedB/|\">";
CompletionItem[] items = getCompletionItemList("/", 0, 44, 45, "nestedXSD.xsd");
testCompletionFor(xml, 1, items);
testCompletionFor(xml, 0);
}

@Test
public void testFilePathCompletionExtraTextInValueBackSlash() throws BadLocationException {
String xml = "<a path=\"NAMESPACE_IGNORE_ME NestedA\\NestedB\\|\">";
CompletionItem[] items = getCompletionItemList("\\", 0, 44, 45, "nestedXSD.xsd");
testCompletionFor(xml, 1, items);
testCompletionFor(xml, 0);
}

@Test
Expand All @@ -166,11 +162,8 @@ public void testFilePathCompletionExtraTextInValueAbsolute() throws BadLocationE
@Test
public void testFilePathCompletionExtraTextInValueAbsoluteBackSlash() throws BadLocationException {
String filePath = userDirBackSlash + "\\src\\test\\resources\\filePathCompletion\\NestedA\\NestedB\\";
int filePathLength = filePath.length();
String xml = "<a path=\"NAMESPACE_IGNORE_ME " + filePath + "|\">";
CompletionItem[] items = getCompletionItemList("\\", 0, 29 + filePathLength - 1, 29 + filePathLength,
"nestedXSD.xsd");
testCompletionFor(xml, 1, items);
testCompletionFor(xml, 0);
}

@Test
Expand Down Expand Up @@ -262,15 +255,15 @@ public void testFilePathCompletionDTDFolderABackSlash() throws BadLocationExcept

@Test
public void testFilePathCompletionDTDFolderB() throws BadLocationException {
String xml = "<!DOCTYPE foo SYSTEM \"folderB/|\">";
CompletionItem[] items = getCompletionItemList("/", 0, 29, 30, "xsdB1.xsd", "xmlB1.xml");
String xml = "<!DOCTYPE foo SYSTEM \"./folderB/|\">";
CompletionItem[] items = getCompletionItemList("/", 0, 31, 32, "xsdB1.xsd", "xmlB1.xml");
testCompletionFor(xml, 2, items);
}

@Test
public void testFilePathCompletionDTDFolderBBackSlash() throws BadLocationException {
String xml = "<!DOCTYPE foo SYSTEM \"folderB\\|\">";
CompletionItem[] items = getCompletionItemList("\\", 0, 29, 30, "xsdB1.xsd", "xmlB1.xml");
String xml = "<!DOCTYPE foo SYSTEM \"./folderB\\|\">";
CompletionItem[] items = getCompletionItemList("\\", 0, 31, 32, "xsdB1.xsd", "xmlB1.xml");
testCompletionFor(xml, 2, items);
}

Expand All @@ -288,8 +281,8 @@ public void testFilePathNoCompletionMissingSystemId() throws BadLocationExceptio

@Test
public void testFilePathCompletionWithSpacesFolder() throws BadLocationException {
String xml = "<a path=\"folderC/|\">";
CompletionItem[] items = getCompletionItemList("/", 0, 16, 17, "a@b", "with%20spaces");
String xml = "<a path=\"./folderC/|\">";
CompletionItem[] items = getCompletionItemList("/", 0, 18, 19, "a@b", "with%20spaces");
testCompletionFor(xml, 2, items);
}

Expand Down

0 comments on commit 367641e

Please sign in to comment.