package org.python.pydev.editor; import org.eclipse.core.runtime.Assert; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.rules.ITokenScanner; import org.python.pydev.ui.ColorAndStyleCache; public abstract class AbstractTokenScanner implements ITokenScanner { protected final ColorAndStyleCache colorCache; protected char[] fChars; protected int fInitialOffset; protected int fCurrentTokenIndexStartRelativeToInitialOffset; protected int fCurrentIndexRelativeToInitialOffset; public AbstractTokenScanner(ColorAndStyleCache colorCache) { super(); this.colorCache = colorCache; updateColorAndStyle(); } protected abstract void updateColorAndStyle(); /* * @see ITokenScanner#setRange(IDocument, int, int) */ @Override public void setRange(final IDocument document, int offset, int length) { Assert.isLegal(document != null); final int documentLength = document.getLength(); checkRange(offset, length, documentLength); fInitialOffset = offset; fCurrentTokenIndexStartRelativeToInitialOffset = 0; fCurrentIndexRelativeToInitialOffset = 0; try { fChars = document.get(offset, length).toCharArray(); } catch (BadLocationException e) { throw new RuntimeException(e); } } /** * Checks that the given range is valid. * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=69292 * * @param offset the offset of the document range to scan * @param length the length of the document range to scan * @param documentLength the document's length * @since 3.3 */ private void checkRange(int offset, int length, int documentLength) { Assert.isLegal(offset > -1); Assert.isLegal(length > -1); Assert.isLegal(offset + length <= documentLength); } /* * @see ITokenScanner#getTokenOffset() */ @Override public int getTokenOffset() { return fInitialOffset + fCurrentTokenIndexStartRelativeToInitialOffset; } /* * @see ITokenScanner#getTokenLength() */ @Override public int getTokenLength() { return fCurrentIndexRelativeToInitialOffset - fCurrentTokenIndexStartRelativeToInitialOffset; } protected int read() { if (fCurrentIndexRelativeToInitialOffset >= fChars.length) { fCurrentIndexRelativeToInitialOffset++; return -1; } char c = fChars[fCurrentIndexRelativeToInitialOffset]; fCurrentIndexRelativeToInitialOffset++; return c; } protected void unread() { fCurrentIndexRelativeToInitialOffset--; } }