From b2f851e2c5bd52d873c4634a967885e8c0cee0dd Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Mon, 27 Apr 2026 15:52:18 +0200 Subject: [PATCH 1/2] fix: Avoid Windows path parsing issue - Add test case for reproducing a windows path parsing issue - Move helper method to utility class - Fix path parsing: Path.of(uri.getPath()) => Path.of(uri) - Bump test plug-in version --- org.eclipse.lsp4e.test/META-INF/MANIFEST.MF | 2 +- org.eclipse.lsp4e.test/pom.xml | 2 +- .../lsp4e/test/edit/LSPEclipseUtilsTest.java | 15 +++++++++++++++ .../src/org/eclipse/lsp4e/LSPEclipseUtils.java | 9 +++++++++ .../internal/SymbolIconProviderRegistry.java | 13 +++++-------- 5 files changed, 31 insertions(+), 10 deletions(-) diff --git a/org.eclipse.lsp4e.test/META-INF/MANIFEST.MF b/org.eclipse.lsp4e.test/META-INF/MANIFEST.MF index d9ad4b604..e74e67ce7 100644 --- a/org.eclipse.lsp4e.test/META-INF/MANIFEST.MF +++ b/org.eclipse.lsp4e.test/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Tests for language server bundle (Incubation) Bundle-SymbolicName: org.eclipse.lsp4e.test;singleton:=true -Bundle-Version: 0.16.10.qualifier +Bundle-Version: 0.16.11.qualifier Fragment-Host: org.eclipse.lsp4e Bundle-Vendor: Eclipse LSP4E Bundle-RequiredExecutionEnvironment: JavaSE-21 diff --git a/org.eclipse.lsp4e.test/pom.xml b/org.eclipse.lsp4e.test/pom.xml index 9347b66c7..46b3c2210 100644 --- a/org.eclipse.lsp4e.test/pom.xml +++ b/org.eclipse.lsp4e.test/pom.xml @@ -8,7 +8,7 @@ org.eclipse.lsp4e.test eclipse-test-plugin - 0.16.10-SNAPSHOT + 0.16.11-SNAPSHOT diff --git a/org.eclipse.lsp4e.test/src/org/eclipse/lsp4e/test/edit/LSPEclipseUtilsTest.java b/org.eclipse.lsp4e.test/src/org/eclipse/lsp4e/test/edit/LSPEclipseUtilsTest.java index 767a4c3bd..99d238416 100644 --- a/org.eclipse.lsp4e.test/src/org/eclipse/lsp4e/test/edit/LSPEclipseUtilsTest.java +++ b/org.eclipse.lsp4e.test/src/org/eclipse/lsp4e/test/edit/LSPEclipseUtilsTest.java @@ -13,6 +13,7 @@ *******************************************************************************/ package org.eclipse.lsp4e.test.edit; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotEquals; @@ -81,6 +82,7 @@ import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.MethodSource; public class LSPEclipseUtilsTest extends AbstractTestWithProject { @@ -637,5 +639,18 @@ public static Stream getHtmlDocString() { void getHtmlDocString(Either<@Nullable String, MarkupContent> arg, String expected) throws Exception { assertEquals(expected, LSPEclipseUtils.getHtmlDocString(arg)); } + + @ParameterizedTest + @CsvSource({ + "file:///C:/Users/username/path/to/SomeDir/SomeType.hpp, SomeType.hpp", + "file:///home/username/path/to/SomeDir/SomeType.hpp, SomeType.hpp", + "file:///," + }) + void testReadingFileNameFromUri(String uriText, String expectedFileName) { + URI uri = URI.create(uriText); + + String actualFileName = assertDoesNotThrow(() -> LSPEclipseUtils.getFileName(uri)); + assertEquals(expectedFileName, actualFileName); + } } diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/LSPEclipseUtils.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/LSPEclipseUtils.java index 9a1a06113..fdd665579 100644 --- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/LSPEclipseUtils.java +++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/LSPEclipseUtils.java @@ -431,6 +431,15 @@ public static CallHierarchyPrepareParams toCallHierarchyPrepareParams(int offset return toPath(toBuffer(document)); } + public static @Nullable String getFileName(URI uri) { + try { + return java.nio.file.Path.of(uri).getFileName().toString(); + } catch (Exception e) { + LanguageServerPlugin.logWarning("Failed to parse file name from URI " + uri, e); //$NON-NLS-1$ + } + return null; + } + public static int toEclipseMarkerSeverity(@Nullable DiagnosticSeverity lspSeverity) { if (lspSeverity == null) { // if severity is empty it is up to the client to interpret diagnostics diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/symbols/internal/SymbolIconProviderRegistry.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/symbols/internal/SymbolIconProviderRegistry.java index 05349e4c4..1ae1ccb37 100644 --- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/symbols/internal/SymbolIconProviderRegistry.java +++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/symbols/internal/SymbolIconProviderRegistry.java @@ -12,7 +12,6 @@ package org.eclipse.lsp4e.operations.symbols.internal; import java.net.URI; -import java.nio.file.Path; import java.util.HashMap; import java.util.Map; @@ -22,6 +21,7 @@ import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.content.IContentType; import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.lsp4e.LSPEclipseUtils; import org.eclipse.lsp4e.LanguageServerPlugin; import org.eclipse.lsp4e.outline.SymbolsModel.DocumentSymbolWithURI; import org.eclipse.lsp4e.ui.SymbolIconProvider; @@ -106,11 +106,8 @@ private SymbolIconProvider getIconProvider(Object symbol) { return defaultIconProvider; } - String fileName = null; - try { - fileName = Path.of(uri.getPath()).getFileName().toString(); - } catch (Exception e) { - LanguageServerPlugin.logWarning("Failed to parse file name from URI " + uri, e); //$NON-NLS-1$ + String fileName = LSPEclipseUtils.getFileName(uri); + if (fileName == null) { return defaultIconProvider; } @@ -146,8 +143,8 @@ private SymbolIconProvider getIconProvider(Object symbol) { } try { - return URI.create(uri); - } catch (IllegalArgumentException e) { + return LSPEclipseUtils.toUri(uri); + } catch (Exception e) { LanguageServerPlugin.logWarning("Failed to parse URI " + uri, e); //$NON-NLS-1$ return null; } From 6a27c5df62489a6631152a6af797ba3bcc9796c7 Mon Sep 17 00:00:00 2001 From: Dietrich Travkin Date: Tue, 5 May 2026 17:17:34 +0200 Subject: [PATCH 2/2] Add javadoc comment and change catched exception type --- .../src/org/eclipse/lsp4e/LSPEclipseUtils.java | 10 ++++++++++ .../symbols/internal/SymbolIconProviderRegistry.java | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/LSPEclipseUtils.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/LSPEclipseUtils.java index fdd665579..4a8360400 100644 --- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/LSPEclipseUtils.java +++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/LSPEclipseUtils.java @@ -1602,6 +1602,16 @@ public static Set findOpenEditorsFor(@Nullable URI uri) { return null; } + /** + * Converts the given string to a {@link URI} if possible. + * Ensures correct encoding in case of file URIs. + * + * @param uri a URI string + * @return a URI instance for the given string + * @throws IllegalArgumentException if the given string is not a valid URI (if it violates RFC 2396) + * @throws NullPointerException if the given string is null + * @see URI#create(String) + */ public static URI toUri(String uri) { URI initialUri = URI.create(uri); return FILE_SCHEME.equals(initialUri.getScheme()) ? toUri(Path.fromPortableString(initialUri.getPath())) : initialUri; diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/symbols/internal/SymbolIconProviderRegistry.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/symbols/internal/SymbolIconProviderRegistry.java index 1ae1ccb37..61de05b88 100644 --- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/symbols/internal/SymbolIconProviderRegistry.java +++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/symbols/internal/SymbolIconProviderRegistry.java @@ -144,7 +144,7 @@ private SymbolIconProvider getIconProvider(Object symbol) { try { return LSPEclipseUtils.toUri(uri); - } catch (Exception e) { + } catch (IllegalArgumentException e) { LanguageServerPlugin.logWarning("Failed to parse URI " + uri, e); //$NON-NLS-1$ return null; }