/*******************************************************************************
* Copyright (c) 2009 Red Hat, Inc.
* 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:
* Red Hat - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.valgrind.ui.editor;
import java.util.Arrays;
import org.eclipse.jface.text.rules.ICharacterScanner;
import org.eclipse.jface.text.rules.IRule;
import org.eclipse.jface.text.rules.IToken;
import org.eclipse.jface.text.rules.IWordDetector;
import org.eclipse.jface.text.rules.Token;
import org.eclipse.jface.text.rules.WordRule;
public class SuppressionToolRule implements IRule {
private String[] toolList;
private IToken token;
private WordRule subrule;
private static final IToken DUMMY_TOKEN = new Token(null);
private static final char[] COLON = new char[] { ':' };
public SuppressionToolRule(String[] tools, IToken successToken) {
toolList = tools;
token = successToken;
subrule = new WordRule(new IWordDetector() {
@Override
public boolean isWordStart(char c) {
for (String tool : toolList) {
if (c == tool.charAt(0)) {
return true;
}
}
return false;
}
@Override
public boolean isWordPart(char c) {
return c != ':';
}
});
for (String tool : toolList) {
subrule.addWord(tool, DUMMY_TOKEN);
}
}
@Override
public IToken evaluate(ICharacterScanner scanner) {
IToken result = subrule.evaluate(scanner);
if (!result.isUndefined()) {
boolean match = true;
int tokenLength = ((SuppressionsElementScanner) scanner).getTokenLength();
match = checkColon(scanner);
if (match) {
// move to beginning of token
for (int i = 0; i < tokenLength; i++) {
scanner.unread();
}
// move to beginning of line
int indentLength = 0;
while (scanner.getColumn() > 0) {
scanner.unread();
indentLength++;
}
// ensure any leading characters are whitespace
while (indentLength-- > 0) {
int ch = scanner.read();
if (!Character.isWhitespace(ch)) {
match = false;
}
}
// reset to end of token
for (int i = 0; i < tokenLength; i++) {
scanner.read();
}
}
if (!match) {
unreadBuffer(scanner, tokenLength);
result = Token.UNDEFINED;
} else {
result = token;
}
}
return result;
}
private boolean checkColon(ICharacterScanner scanner) {
int ch = scanner.read();
if (ch == ICharacterScanner.EOF) {
return false;
}
scanner.unread();
return Arrays.equals(Character.toChars(ch), COLON);
}
private void unreadBuffer(ICharacterScanner scanner, int length) {
for (int i = 0; i < length; i++) {
scanner.unread();
}
}
}