diff --git a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/services/XMLRename.java b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/services/XMLRename.java index 18970ae84..fa16c396b 100644 --- a/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/services/XMLRename.java +++ b/org.eclipse.lemminx/src/main/java/org/eclipse/lemminx/services/XMLRename.java @@ -182,31 +182,38 @@ private List getTagNameRenameTextEdits(DOMDocument xmlDocument, DOMEle if (indexOfColon > 0) { // Take the prefix and local name of the namespace tag String prefix = element.getPrefix(); - - Position startTagStartPosition = startTagRange.getStart(); - Position startTagPrefixPosition = new Position(startTagStartPosition.getLine(), - startTagStartPosition.getCharacter() + indexOfColon); - - Position endTagStartPosition = endTagRange.getStart(); - Position endTagPrefixPosition = new Position(endTagStartPosition.getLine(), - endTagStartPosition.getCharacter() + indexOfColon); - - Range startTagPrefixRange = new Range(startTagStartPosition, startTagPrefixPosition); - Range endTagPrefixRange = new Range(endTagStartPosition, endTagPrefixPosition); - String suffixName = element.getLocalName(); int suffixLength = suffixName.length(); - Position startTagEndPosition = startTagRange.getEnd(); - Position suffixStartPositionStart = new Position(startTagEndPosition.getLine(), - startTagEndPosition.getCharacter() - suffixLength); - Position endTagEndPosition = endTagRange.getEnd(); - Position suffixEndPositionStart = new Position(endTagEndPosition.getLine(), - endTagEndPosition.getCharacter() - suffixLength); + // Start tag + Range startTagPrefixRange = null; + Range suffixRangeStart = null; + if (startTagRange != null) { + Position startTagStartPosition = startTagRange.getStart(); + Position startTagPrefixPosition = new Position(startTagStartPosition.getLine(), + startTagStartPosition.getCharacter() + indexOfColon); + Position startTagEndPosition = startTagRange.getEnd(); + Position suffixStartPositionStart = new Position(startTagEndPosition.getLine(), + startTagEndPosition.getCharacter() - suffixLength); + startTagPrefixRange = new Range(startTagStartPosition, startTagPrefixPosition); + suffixRangeStart = new Range(suffixStartPositionStart, startTagEndPosition); + } - Range suffixRangeStart = new Range(suffixStartPositionStart, startTagEndPosition); - Range suffixRangeEnd = new Range(suffixEndPositionStart, endTagEndPosition); + // End tag + Range suffixRangeEnd = null; + Range endTagPrefixRange = null; + if (endTagRange != null) { + Position endTagStartPosition = endTagRange.getStart(); + Position endTagPrefixPosition = new Position(endTagStartPosition.getLine(), + endTagStartPosition.getCharacter() + indexOfColon); + Position endTagEndPosition = endTagRange.getEnd(); + Position suffixEndPositionStart = new Position(endTagEndPosition.getLine(), + endTagEndPosition.getCharacter() - suffixLength); + endTagPrefixRange = new Range(endTagStartPosition, endTagPrefixPosition); + suffixRangeEnd = new Range(suffixEndPositionStart, endTagEndPosition); + } + // Add text edits if (newText.contains(":")) { String[] tagParts = newText.split(":", 2); List tagTextEdits = new ArrayList(); diff --git a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/services/XMLRenameTest.java b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/services/XMLRenameTest.java index 17a6fa44c..8ceb628db 100644 --- a/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/services/XMLRenameTest.java +++ b/org.eclipse.lemminx/src/test/java/org/eclipse/lemminx/services/XMLRenameTest.java @@ -189,7 +189,26 @@ public void testTryToRenameXMLNS() throws BadLocationException { assertRename(xml, "BBBB"); } + @Test + public void testNamespaceRenameSingleTag() throws BadLocationException { + String xml =""; + + List expectedFullEdits = edits("ns", r(0, 1, 3)); + expectedFullEdits.addAll(edits("tag", r(0, 4, 5))); + assertRename(xml, "ns:tag", expectedFullEdits); + + List expectedNsEdits = edits("ns", r(0, 1, 3)); + assertRename(xml, "ns:b", expectedNsEdits); + xml =""; + List expectedLocalNameEdits = edits("tag", r(0, 4, 5)); + assertRename(xml, "aa:tag", expectedLocalNameEdits); + + xml =""; + List expectedEndTagEdits = edits("ns", r(0, 2, 4)); + assertRename(xml, "ns:b", expectedEndTagEdits); + + } private static Range r(int line, int startCharacter, int endCharacter) { return new Range(new Position(line, startCharacter), new Position(line, endCharacter));