package org.python.pydev.editor;
import org.eclipse.jface.text.rules.IToken;
import org.eclipse.jface.text.rules.Token;
import org.python.pydev.ui.ColorAndStyleCache;
public abstract class AbstractStringScanner extends AbstractTokenScanner {
protected Token fDocStringMarkupTextReturnToken;
protected IToken fStringReturnToken;
public AbstractStringScanner(ColorAndStyleCache colorCache) {
super(colorCache);
}
/*
* @see ITokenScanner#nextToken()
*/
@Override
public IToken nextToken() {
fCurrentTokenIndexStartRelativeToInitialOffset = fCurrentIndexRelativeToInitialOffset;
int c = read();
if (c == -1) {
//This isn't really in the contract, but it should work anyways: users do a setRange, then:
//consume tokens until EOF (at which point we can clear our buffer).
fChars = null;
return Token.EOF;
}
if (Character.isWhitespace(c)) {
while (Character.isWhitespace(c) && c != -1) {
c = read();
}
unread();
return fStringReturnToken;
}
if (c == '@' || c == ':') {
//Looking for @ or : in the start of the line
c = read();
if (c == -1) {
unread();
return fDocStringMarkupTextReturnToken;
}
while (Character.isJavaIdentifierPart(c)) {
c = read();
}
unread();
return fDocStringMarkupTextReturnToken;
} else {
// read to the end of the line
while (c != -1 && c != '\r' && c != '\n') {
c = read();
}
if (c == -1) {
unread();
return fStringReturnToken;
}
while (c == '\r' && c == '\n') {
c = read();
}
unread();
}
return fStringReturnToken;
}
}