Skip to content

Commit ba1c63a

Browse files
FlorianKroissrubenporras
authored andcommitted
feat: Compare existing text case-insensitive when inserting completion without textedit
1 parent dab1719 commit ba1c63a

3 files changed

Lines changed: 45 additions & 5 deletions

File tree

org.eclipse.lsp4e.test/src/org/eclipse/lsp4e/test/completion/AbstractCompletionTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,13 @@ protected CompletionItem createCompletionItem(String label, CompletionItemKind k
4646
return createCompletionItem(label, kind, new Range(new Position(0, 0), new Position(0, label.length())));
4747
}
4848

49+
protected CompletionItem createCompletionItemWithoutTextEdit(String label, CompletionItemKind kind) {
50+
final var item = new CompletionItem();
51+
item.setLabel(label);
52+
item.setKind(kind);
53+
return item;
54+
}
55+
4956
protected CompletionItem createCompletionItem(String label, CompletionItemKind kind, Range range) {
5057
final var item = new CompletionItem();
5158
item.setLabel(label);

org.eclipse.lsp4e.test/src/org/eclipse/lsp4e/test/completion/CompleteCompletionTest.java

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ public void testCommandExecution() throws CoreException, InterruptedException, E
150150
final var lsCompletionProposal = (LSCompletionProposal) proposals[0];
151151
lsCompletionProposal.apply(viewer, '\n', 0, 0);
152152

153-
// Assert command was invoked on langauge server
153+
// Assert command was invoked on language server
154154
ExecuteCommandParams executedCommand = MockLanguageServer.INSTANCE.getWorkspaceService().getExecutedCommand().get(2, TimeUnit.SECONDS);
155155

156156
assertEquals(MockLanguageServer.SUPPORTED_COMMAND_ID, executedCommand.getCommand());
@@ -174,6 +174,40 @@ public void testPrefixCaseSensitivity() throws CoreException {
174174
lsCompletionProposal.apply(viewer, '\n', 0, 0);
175175
assertEquals(new Point("FirstClass".length(), 0), lsCompletionProposal.getSelection(viewer.getDocument()));
176176
}
177+
178+
@Test
179+
public void testPrefixCaseSensitivityWithoutTextEdit() throws CoreException {
180+
final var items = new ArrayList<CompletionItem>();
181+
items.add(createCompletionItemWithoutTextEdit("FirstClass", CompletionItemKind.Class));
182+
MockLanguageServer.INSTANCE.setCompletionList(new CompletionList(false, items));
183+
184+
final var content = "FIRST";
185+
ITextViewer viewer = TestUtils.openTextViewer(TestUtils.createUniqueTestFile(project, content));
186+
187+
ICompletionProposal[] proposals = contentAssistProcessor.computeCompletionProposals(viewer, content.length());
188+
assertEquals(1, proposals.length);
189+
final var lsCompletionProposal = (LSCompletionProposal) proposals[0];
190+
lsCompletionProposal.apply(viewer, '\n', 0, 0);
191+
assertEquals(new Point("FirstClass".length(), 0), lsCompletionProposal.getSelection(viewer.getDocument()));
192+
assertEquals("FirstClass", viewer.getDocument().get());
193+
}
194+
195+
@Test
196+
public void testPrefixCaseSensitivityWithoutTextEditAtOffset() throws CoreException {
197+
final var items = new ArrayList<CompletionItem>();
198+
items.add(createCompletionItemWithoutTextEdit("FirstClass", CompletionItemKind.Class));
199+
MockLanguageServer.INSTANCE.setCompletionList(new CompletionList(false, items));
200+
201+
final var content = "FIRST";
202+
ITextViewer viewer = TestUtils.openTextViewer(TestUtils.createUniqueTestFile(project, content));
203+
204+
ICompletionProposal[] proposals = contentAssistProcessor.computeCompletionProposals(viewer, content.length());
205+
assertEquals(1, proposals.length);
206+
final var lsCompletionProposal = (LSCompletionProposal) proposals[0];
207+
lsCompletionProposal.apply(viewer, '\n', 0, 4);
208+
assertEquals(new Point("FirstClass".length(), 0), lsCompletionProposal.getSelection(viewer.getDocument()));
209+
assertEquals("FirstClass", viewer.getDocument().get());
210+
}
177211

178212
@Test
179213
public void testCompleteOnFileEnd() throws CoreException { // bug 508842

org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/completion/LSCompletionProposal.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -457,9 +457,8 @@ public int getPrefixCompletionStart(IDocument document, int completionOffset) {
457457
Math.max(0, completionOffset - insertTextLength),
458458
Math.min(insertTextLength, completionOffset));
459459
for (int i = 0; i < insertTextLength && i < completionOffset; i++) {
460-
String tentativeCommonString = subDoc.substring(i);
461-
if (insertText.startsWith(tentativeCommonString)) {
462-
return completionOffset - tentativeCommonString.length();
460+
if (insertText.regionMatches(true, 0, subDoc, i, subDoc.length() - i)) {
461+
return completionOffset - subDoc.substring(i).length();
463462
}
464463
}
465464
} catch (BadLocationException e) {
@@ -514,7 +513,7 @@ protected void apply(IDocument document, char trigger, int stateMask, int offset
514513
final int insertTextLength = insertText.length();
515514
while (commonSize < insertTextLength - shift
516515
&& document.getLength() > offset + commonSize
517-
&& document.getChar(bestOffset + shift + commonSize) == insertText.charAt(commonSize + shift)) {
516+
&& Character.toLowerCase(document.getChar(bestOffset + shift + commonSize)) == Character.toLowerCase(insertText.charAt(commonSize + shift))) {
518517
commonSize++;
519518
}
520519
textEdit.getRange().getEnd().setCharacter(textEdit.getRange().getEnd().getCharacter() + commonSize);

0 commit comments

Comments
 (0)