[307924]: Fix NPE in Semantic Highlighting and add Unit Test
https://bugs.eclipse.org/bugs/show_bug.cgi?id=307924
diff --git a/bundles/org.eclipse.wst.xsl.ui/src/org/eclipse/wst/xsl/ui/internal/style/AbstractXSLSemanticHighlighting.java b/bundles/org.eclipse.wst.xsl.ui/src/org/eclipse/wst/xsl/ui/internal/style/AbstractXSLSemanticHighlighting.java
index 3b8ec2d..36f5061 100644
--- a/bundles/org.eclipse.wst.xsl.ui/src/org/eclipse/wst/xsl/ui/internal/style/AbstractXSLSemanticHighlighting.java
+++ b/bundles/org.eclipse.wst.xsl.ui/src/org/eclipse/wst/xsl/ui/internal/style/AbstractXSLSemanticHighlighting.java
@@ -11,6 +11,8 @@
 package org.eclipse.wst.xsl.ui.internal.style;
 
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
 
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.jface.text.Position;
@@ -64,16 +66,15 @@
 
 	public abstract Position[] consumes(IStructuredDocumentRegion region);
 
-	protected Position[] createSemanticPositions(IStructuredDocumentRegion region, String regionType) {
+	protected List createSemanticPositions(IStructuredDocumentRegion region, String regionType) {
 		if (region == null) {
-			return null;
+			return Collections.EMPTY_LIST;
 		}
 		
 		if (!region.getType().equals(DOMRegionContext.XML_TAG_NAME)) {
-			return null;
+			return Collections.EMPTY_LIST;
 		}
 	
-		Position p[] = null;
 		ITextRegionList regionList = region.getRegions();
 		
 		ArrayList arrpos = new ArrayList();
@@ -85,9 +86,7 @@
 				arrpos.add(pos);
 			}
 		}
-		p = new Position[arrpos.size()];
-		arrpos.toArray(p);
-		return p;
+		return arrpos;
 	}
 
 	public Position[] consumes(IStructuredDocumentRegion documentRegion, IndexedRegion indexedRegion) {
diff --git a/bundles/org.eclipse.wst.xsl.ui/src/org/eclipse/wst/xsl/ui/internal/style/XSLAttrNameSemanticHighlighting.java b/bundles/org.eclipse.wst.xsl.ui/src/org/eclipse/wst/xsl/ui/internal/style/XSLAttrNameSemanticHighlighting.java
index cc39c52..8b92595 100644
--- a/bundles/org.eclipse.wst.xsl.ui/src/org/eclipse/wst/xsl/ui/internal/style/XSLAttrNameSemanticHighlighting.java
+++ b/bundles/org.eclipse.wst.xsl.ui/src/org/eclipse/wst/xsl/ui/internal/style/XSLAttrNameSemanticHighlighting.java
@@ -11,6 +11,8 @@
 package org.eclipse.wst.xsl.ui.internal.style;
 
 
+import java.util.ArrayList;
+
 import org.eclipse.jface.text.Position;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
 import org.eclipse.wst.sse.ui.ISemanticHighlighting;
@@ -32,8 +34,13 @@
 	}
 
 	public Position[] consumes(IStructuredDocumentRegion region) {
-		return createSemanticPositions(region,
-				DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE);
+		ArrayList array = new ArrayList();
+		array.addAll(createSemanticPositions(region, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME));
+		Position[] allPos = new Position[array.size()];
+		if (!array.isEmpty()) {
+			array.toArray(allPos);
+		}
+		return allPos;
 	}
 
 }
diff --git a/bundles/org.eclipse.wst.xsl.ui/src/org/eclipse/wst/xsl/ui/internal/style/XSLAttrValueSemanticHighlighting.java b/bundles/org.eclipse.wst.xsl.ui/src/org/eclipse/wst/xsl/ui/internal/style/XSLAttrValueSemanticHighlighting.java
index a577a8b..836baf7 100644
--- a/bundles/org.eclipse.wst.xsl.ui/src/org/eclipse/wst/xsl/ui/internal/style/XSLAttrValueSemanticHighlighting.java
+++ b/bundles/org.eclipse.wst.xsl.ui/src/org/eclipse/wst/xsl/ui/internal/style/XSLAttrValueSemanticHighlighting.java
@@ -11,6 +11,8 @@
 package org.eclipse.wst.xsl.ui.internal.style;
 
 
+import java.util.ArrayList;
+
 import org.eclipse.jface.text.Position;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
 import org.eclipse.wst.sse.ui.ISemanticHighlighting;
@@ -32,8 +34,12 @@
 	}
 
 	public Position[] consumes(IStructuredDocumentRegion region) {
-		return createSemanticPositions(region,
-				DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE);
-	}
+		ArrayList array = new ArrayList();
+		array.addAll(createSemanticPositions(region, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE));
+		Position[] allPos = new Position[array.size()];
+		if (!array.isEmpty()) {
+			array.toArray(allPos);
+		}
+		return allPos;	}
 
 }
diff --git a/bundles/org.eclipse.wst.xsl.ui/src/org/eclipse/wst/xsl/ui/internal/style/XSLTagDelimsSemanticHighlighting.java b/bundles/org.eclipse.wst.xsl.ui/src/org/eclipse/wst/xsl/ui/internal/style/XSLTagDelimsSemanticHighlighting.java
index bbdc681..5812907 100644
--- a/bundles/org.eclipse.wst.xsl.ui/src/org/eclipse/wst/xsl/ui/internal/style/XSLTagDelimsSemanticHighlighting.java
+++ b/bundles/org.eclipse.wst.xsl.ui/src/org/eclipse/wst/xsl/ui/internal/style/XSLTagDelimsSemanticHighlighting.java
@@ -7,12 +7,15 @@
  *
  * Contributors:
  *     David Carver (Intalio) - bug 256339 - initial API and implementation
+ *                            - bug 307924 - Fix NPE when textRegion is null.
  *******************************************************************************/
 package org.eclipse.wst.xsl.ui.internal.style;
 
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
 
 import org.eclipse.jface.text.Position;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
@@ -38,36 +41,34 @@
 
 	public Position[] consumes(IStructuredDocumentRegion region) {
 		
-		Position[] openPos = createSemanticPositions(region.getFirstRegion(), region, DOMRegionContext.XML_TAG_OPEN);
-		Position[] endOpenPos = createSemanticPositions(region.getFirstRegion(), region, DOMRegionContext.XML_END_TAG_OPEN);
-		Position[] emptyTagClose = createSemanticPositions(region, DOMRegionContext.XML_EMPTY_TAG_CLOSE);
-		Position[] closePos = createSemanticPositions(region,	DOMRegionContext.XML_TAG_CLOSE);
+		List openPos = createSemanticPositions(region.getFirstRegion(), region, DOMRegionContext.XML_TAG_OPEN);
+		List endOpenPos = createSemanticPositions(region.getFirstRegion(), region, DOMRegionContext.XML_END_TAG_OPEN);
+		List emptyTagClose = createSemanticPositions(region, DOMRegionContext.XML_EMPTY_TAG_CLOSE);
+		List closePos = createSemanticPositions(region,	DOMRegionContext.XML_TAG_CLOSE);
 		ArrayList arrpos = new ArrayList();
-		arrpos.addAll(Arrays.asList(openPos));
-		arrpos.addAll(Arrays.asList(closePos));
-		arrpos.addAll(Arrays.asList(endOpenPos));
-		arrpos.addAll(Arrays.asList(emptyTagClose));
+		arrpos.addAll(openPos);
+		arrpos.addAll(closePos);
+		arrpos.addAll(endOpenPos);
+		arrpos.addAll(emptyTagClose);
 		Position[] allPos = new Position[arrpos.size()];
-		arrpos.toArray(allPos);
+		if (!arrpos.isEmpty()) {
+			arrpos.toArray(allPos);
+		}
 		return allPos;
 	}
 	
-	protected Position[] createSemanticPositions(ITextRegion textRegion, IStructuredDocumentRegion region, String regionType) {
-		if (textRegion == null) {
-			return null;
-		}
-		
-		Position p[] = null;
-	
+	protected List createSemanticPositions(ITextRegion textRegion, IStructuredDocumentRegion region, String regionType) {
 		ArrayList arrpos = new ArrayList();
-		if (textRegion.getType().equals(regionType)) {
+		if (textRegion == null) {
+			return Collections.EMPTY_LIST;
+		}
+	
+		if (regionType.equals(textRegion.getType())) {
 			Position pos = new Position(region
 					.getStartOffset(textRegion), textRegion.getLength());
 			arrpos.add(pos);
 		}
-		p = new Position[arrpos.size()];
-		arrpos.toArray(p);
-		return p;
+		return arrpos;
 	}
 
 }
diff --git a/bundles/org.eclipse.wst.xsl.ui/src/org/eclipse/wst/xsl/ui/internal/style/XSLTagNameSemanticHighlighting.java b/bundles/org.eclipse.wst.xsl.ui/src/org/eclipse/wst/xsl/ui/internal/style/XSLTagNameSemanticHighlighting.java
index fc029b5..fc450be 100644
--- a/bundles/org.eclipse.wst.xsl.ui/src/org/eclipse/wst/xsl/ui/internal/style/XSLTagNameSemanticHighlighting.java
+++ b/bundles/org.eclipse.wst.xsl.ui/src/org/eclipse/wst/xsl/ui/internal/style/XSLTagNameSemanticHighlighting.java
@@ -10,6 +10,8 @@
  *******************************************************************************/
 package org.eclipse.wst.xsl.ui.internal.style;
 
+import java.util.ArrayList;
+
 import org.eclipse.jface.text.Position;
 import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
 import org.eclipse.wst.sse.ui.ISemanticHighlighting;
@@ -30,6 +32,12 @@
 	}
 
 	public Position[] consumes(IStructuredDocumentRegion region) {
-		return createSemanticPositions(region, DOMRegionContext.XML_TAG_NAME);
+		ArrayList array = new ArrayList();
+		array.addAll(createSemanticPositions(region, DOMRegionContext.XML_TAG_NAME));
+		Position[] allPos = new Position[array.size()];
+		if (!array.isEmpty()) {
+			array.toArray(allPos);
+		}
+		return allPos;
 	}
 }