Bug 546081 - IllegalArgumentException in SymbolsLabelProvider

- improve robustness of SymbolsLabelProvider
- catch IllegalArgumentException if language server provides invalid
 location URI

Change-Id: I0486fe932835c26308f6e7a43c4bc350b9ddbda4
Signed-off-by: Markus Ofterdinger <markus.ofterdinger@sap.com>
diff --git a/org.eclipse.lsp4e.test/src/org/eclipse/lsp4e/test/outline/SymbolsLabelProviderTest.java b/org.eclipse.lsp4e.test/src/org/eclipse/lsp4e/test/outline/SymbolsLabelProviderTest.java
index 2869770..2aa20e1 100644
--- a/org.eclipse.lsp4e.test/src/org/eclipse/lsp4e/test/outline/SymbolsLabelProviderTest.java
+++ b/org.eclipse.lsp4e.test/src/org/eclipse/lsp4e/test/outline/SymbolsLabelProviderTest.java
@@ -27,7 +27,8 @@
 
 	@Rule public AllCleanRule clear = new AllCleanRule();
 	private static final Location LOCATION = new Location("path/to/foo", new Range(new Position(0,0), new Position(1,1)));
-	
+	private static final Location INVALID_LOCATION = new Location("file:://///invalid_location_uri", new Range(new Position(0,0), new Position(1,1)));
+
 	@Test
 	public void testShowKind() {
 		SymbolsLabelProvider labelProvider = new SymbolsLabelProvider(false, true);
@@ -48,11 +49,18 @@
 		SymbolInformation info = new SymbolInformation("Foo", SymbolKind.Class, LOCATION);
 		assertEquals("Foo path/to/foo", labelProvider.getText(info));
 	}
-	
+
 	@Test
 	public void testShowNeither() {
 		SymbolsLabelProvider labelProvider = new SymbolsLabelProvider(false, false);
 		SymbolInformation info = new SymbolInformation("Foo", SymbolKind.Class, LOCATION);
 		assertEquals("Foo", labelProvider.getText(info));
 	}
+
+	@Test
+	public void testGetStyledTextInalidLocationURI() {
+		SymbolsLabelProvider labelProvider = new SymbolsLabelProvider(false, false);
+		SymbolInformation info = new SymbolInformation("Foo", SymbolKind.Class, INVALID_LOCATION);
+		assertEquals("Foo", labelProvider.getStyledText(info).getString());
+	}
 }
diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/outline/SymbolsLabelProvider.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/outline/SymbolsLabelProvider.java
index ab95f88..282ae39 100644
--- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/outline/SymbolsLabelProvider.java
+++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/outline/SymbolsLabelProvider.java
@@ -199,7 +199,11 @@
 		if (element instanceof SymbolInformation) {
 			name = ((SymbolInformation) element).getName();
 			kind = ((SymbolInformation) element).getKind();
-			location = URI.create(((SymbolInformation) element).getLocation().getUri());
+			try {
+				location = URI.create(((SymbolInformation) element).getLocation().getUri());
+			} catch (IllegalArgumentException e) {
+				LanguageServerPlugin.logError("Invalid URI: " + ((SymbolInformation) element).getLocation().getUri(), e); //$NON-NLS-1$
+			}
 		} else if (element instanceof DocumentSymbol) {
 			name = ((DocumentSymbol) element).getName();
 			kind = ((DocumentSymbol) element).getKind();