/*******************************************************************************
* Copyright (c) 2004 Eric Merritt 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 http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Eric Merritt
* Vlad Dumitrescu
*******************************************************************************/
package org.erlide.ui.editors.erl.scanner;
import java.util.List;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.rules.IToken;
import org.erlide.engine.ErlangEngine;
import org.erlide.engine.services.parsing.ErlToken;
import org.erlide.engine.services.parsing.ScannerException;
import org.erlide.ui.util.IColorManager;
import org.erlide.util.ErlLogger;
public class ErlCodeScanner extends ErlTokenScanner {
protected List<ErlToken> fTokens;
protected int fCrtToken;
private int rangeLength;
private int rangeOffset;
public ErlCodeScanner(final IColorManager colorManager) {
super(colorManager);
}
@Override
public void setRange(final IDocument document, final int offset, final int length) {
if (document == null) {
return;
}
try {
rangeOffset = offset;
rangeLength = length;
// ErlLogger.debug("setRange %s %d:%d (%d:%d)", document,
// rangeOffset, rangeLength, offset, length);
final String str = document.get(rangeOffset, rangeLength);
// ErlLogger.debug("setRange == %s", str);
handleText(str);
} catch (final BadLocationException e) {
ErlLogger.warn(e);
}
}
private void handleText(final String text) {
if (text == null) {
return;
}
try {
fCrtToken = -1;
fTokens = ErlangEngine.getInstance().getSimpleScannerService()
.lightScanString(text, rangeOffset);
} catch (final ScannerException e) {
// ErlLogger.error(e);
}
}
@Override
public IToken nextToken() {
final ErlToken nextErlToken = nextErlToken();
return convert(nextErlToken);
}
@Override
public int getTokenOffset() {
if (fTokens == null) {
return 0;
}
if (fCrtToken >= fTokens.size()) {
return 0;
}
final ErlToken tk = fTokens.get(fCrtToken);
return tk.getOffset();
}
@Override
public int getTokenLength() {
if (fTokens == null) {
return 0;
}
if (fCrtToken >= fTokens.size()) {
return 0;
}
final ErlToken tk = fTokens.get(fCrtToken);
return tk.getLength();
}
public ErlToken nextErlToken() {
if (fTokens == null) {
return ErlToken.EOF;
}
fCrtToken++;
if (fCrtToken >= fTokens.size()) {
return ErlToken.EOF;
}
final ErlToken tk = fTokens.get(fCrtToken);
if (tk.getOffset() >= rangeOffset + rangeLength) {
return ErlToken.EOF;
}
return fTokens.get(fCrtToken);
}
}