Bug 99325 [syntax highlighting] semantic highlighting broken when using "convert to new for loop"
I20050610-0010 (no regression, though - just exposed by the quick fix) - In the code below, execute the "convert to new for loop" quick fix - undo -> note that the 'for' keyword is wrongly colored. -> subsequent reconciles do not correct the failure -> only doing a major change (cutting and pasting entire method, closing editor..) corrects the problem class Test{ void m() { LinkedList<Number> list = null; for (Iterator it = list.iterator(); it.hasNext();) { Number num = (Number) it.next(); System.out.println(num.intValue()); } } } Code inspection revealed that SemanticHighlightingPresenter.contain() relies on positions being disjoint, which is not true in this case: the quick fix modifies the document in a way that produces many positions at the same offset/length. A fix would change indexOf() to check all positions at a certain offset instead of the index returned. Need to talk to Christof about whether the position updater might be doing the wrong thing...
org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/SemanticHighlightingPresenter.java
/*
	 * @see org.eclipse.jface.text.ITextPresentationListener#applyTextPresentation(org.eclipse.jface.text.TextPresentation)
	 */
	public void applyTextPresentation(TextPresentation textPresentation) {
		IRegion region= textPresentation.getExtent();
		int i= computeIndexAtOffset(fPositions, region.getOffset()), n= computeIndexAtOffset(fPositions, region.getOffset() + region.getLength());
		if (n - i > 2) {
			List ranges= new ArrayList(n - i);
			for (; i < n; i++) {
				HighlightedPosition position= (HighlightedPosition) fPositions.get(i);
				if (!position.isDeleted())
					ranges.add(position.createStyleRange());
			}
			StyleRange[] array= new StyleRange[ranges.size()];
			array= (StyleRange[]) ranges.toArray(array);
			textPresentation.replaceStyleRanges(array);
		} else {
			for (; i < n; i++) {
				HighlightedPosition position= (HighlightedPosition) fPositions.get(i);
				if (!position.isDeleted())
					textPresentation.replaceStyleRange(position.createStyleRange());
			}
		}
	}
	/*
	 * @see org.eclipse.jface.text.ITextInputListener#inputDocumentAboutToBeChanged(org.eclipse.jface.text.IDocument, org.eclipse.jface.text.IDocument)
	 */
	public void inputDocumentAboutToBeChanged(IDocument oldInput, IDocument newInput) {
		setCanceled(true);
		releaseDocument(oldInput);