[331718] CSS ReParser pairing for single characters
diff --git a/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/text/CSSStructuredDocumentReParser.java b/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/text/CSSStructuredDocumentReParser.java
index d4a4237..260374f 100644
--- a/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/text/CSSStructuredDocumentReParser.java
+++ b/bundles/org.eclipse.wst.css.core/src/org/eclipse/wst/css/core/internal/text/CSSStructuredDocumentReParser.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -176,8 +176,8 @@
 	private ReparseRange getUpdateRangeForQuotes(int start, int end) {
 		ReparseRange range = new ReparseRange();
 
-		range.expand(getUpdateRangeForPair(start, end, "\"", "\"")); //$NON-NLS-2$//$NON-NLS-1$
-		range.expand(getUpdateRangeForPair(start, end, "\'", "\'")); //$NON-NLS-2$//$NON-NLS-1$
+		range.expand(getUpdateRangeForPair(start, end, '\"', '\"'));
+		range.expand(getUpdateRangeForPair(start, end, '\'', '\''));
 
 		return (range.isValid()) ? range : null;
 	}
@@ -194,9 +194,9 @@
 	private ReparseRange getUpdateRangeForBraces(int start, int end) {
 		ReparseRange range = new ReparseRange();
 
-		range.expand(getUpdateRangeForPair(start, end, "[", "]")); //$NON-NLS-2$//$NON-NLS-1$
-		range.expand(getUpdateRangeForPair(start, end, "(", ")")); //$NON-NLS-2$//$NON-NLS-1$
-		range.expand(getUpdateRangeForPair(start, end, "{", "}")); //$NON-NLS-2$//$NON-NLS-1$
+		range.expand(getUpdateRangeForPair(start, end, '[', ']'));
+		range.expand(getUpdateRangeForPair(start, end, '(', ')'));
+		range.expand(getUpdateRangeForPair(start, end, '{', '}'));
 
 		return (range.isValid()) ? range : null;
 	}
@@ -354,6 +354,64 @@
 		}
 	}
 
+	private int findChar(char c, int start, boolean forward) throws BadLocationException {
+		int stop = forward ? fStructuredDocument.getLength() : 0;
+		if (forward) {
+			for (; start < stop; start++) {
+				if (fStructuredDocument.getChar(start) == c)
+					return start;
+			}
+		}
+		else {
+			for (; start >= stop; start--) {
+				if (fStructuredDocument.getChar(start) == c)
+					return start;
+			}
+		}
+		return -1;
+	}
+
+	ReparseRange getUpdateRangeForPair(int start, int end, char opener, char closer) {
+		StringBuffer deletionBuf = new StringBuffer();
+		StringBuffer insertionBuf = new StringBuffer();
+		deletionBuf.append(fDeletedText);
+		insertionBuf.append(fChanges);
+		String deletion = deletionBuf.toString();
+		String insertion = insertionBuf.toString();
+
+		int rangeStart = start;
+		int rangeEnd = end;
+
+		if (0 <= deletion.indexOf(opener) || 0 <= deletion.indexOf(closer) || 0 <= insertion.indexOf(opener) || 0 <= insertion.indexOf(closer)) {
+			int s = -1, e = -1;
+			try {
+				if (start <= fStructuredDocument.getLength()) {
+					s = findChar(opener, start - 1, false);
+				}
+				if (end < fStructuredDocument.getLength() - 1) {
+					e = findChar(closer, end + 1, true);
+				}
+			}
+			catch (BadLocationException ex) {
+				Logger.logException(ex);
+				return null;
+			}
+			if (0 <= s) {
+				rangeStart = Math.min(rangeStart, s);
+			}
+			if (0 <= e) {
+				rangeEnd = Math.max(rangeEnd, e);
+			}
+		}
+
+		if (rangeStart < start || end < rangeEnd) {
+			return new ReparseRange(rangeStart, rangeEnd);
+		}
+		else {
+			return null;
+		}
+	}
+
 	public IStructuredTextReParser newInstance() {
 		return new CSSStructuredDocumentReParser();
 	}