blob: bbc343d23fdfb6841360716900350c34d53b7204 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.uima.ruta.ide.ui.text;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.text.rules.ICharacterScanner;
import org.eclipse.jface.text.rules.IPredicateRule;
import org.eclipse.jface.text.rules.IToken;
import org.eclipse.jface.text.rules.IWordDetector;
import org.eclipse.jface.text.rules.Token;
public class RutaWordRule implements IPredicateRule {
/** Internal setting for the un-initialized column constraint */
protected static final int UNDEFINED = -1;
/** The word detector used by this rule */
protected IWordDetector fDetector;
/**
* The default token to be returned on success and if nothing else has been specified.
*/
protected IToken fDefaultToken;
/** The column constraint */
protected int fColumn = UNDEFINED;
/** The table of predefined words and token for this rule */
protected Map fWords = new HashMap();
/** Buffer used for pattern detection */
private StringBuffer fBuffer = new StringBuffer();
// private IToken classNameToken;
// private IToken funcNameToken;
/**
* Creates a rule which, with the help of a word detector, will return the token associated with
* the detected word. If no token has been associated, the specified default token will be
* returned.
*
* @param detector
* the word detector to be used by this rule, may not be <code>null</code>
* @param defaultToken
* the default token to be returned on success if nothing else is specified, may not be
* <code>null</code>
* @param classNameToken
*
* @see #addWord(String, IToken)
*/
public RutaWordRule(IWordDetector detector, IToken defaultToken, IToken classNameToken) {
Assert.isNotNull(detector);
Assert.isNotNull(defaultToken);
fDetector = detector;
fDefaultToken = defaultToken;
// this.classNameToken = classNameToken;
// this.funcNameToken = funcNameToken;
}
/**
* Adds a word and the token to be returned if it is detected.
*
* @param word
* the word this rule will search for, may not be <code>null</code>
* @param token
* the token to be returned if the word has been found, may not be <code>null</code>
*/
public void addWord(String word, IToken token) {
Assert.isNotNull(word);
Assert.isNotNull(token);
fWords.put(word, token);
}
/**
* Sets a column constraint for this rule. If set, the rule's token will only be returned if the
* pattern is detected starting at the specified column. If the column is smaller then 0, the
* column constraint is considered removed.
*
* @param column
* the column in which the pattern starts
*/
public void setColumnConstraint(int column) {
if (column < 0)
column = UNDEFINED;
fColumn = column;
}
private String lastFound = "";
public IToken evaluate(ICharacterScanner scanner) {
int c = scanner.read();
fBuffer.setLength(0);
// special for '->'
if (c == '-') {
fBuffer.append((char) c);
c = scanner.read();
if (c == '>') {
fBuffer.append((char) c);
String str = fBuffer.toString();
IToken token = (IToken) fWords.get(str);
if (token != null) {
lastFound = str;
return token;
}
} else {
// scanner.unread();
fBuffer.setLength(0);
}
}
// the rest
if (fDetector.isWordStart((char) c)) {
if (fColumn == UNDEFINED || (fColumn == scanner.getColumn() - 1)) {
fBuffer.setLength(0);
do {
fBuffer.append((char) c);
c = scanner.read();
} while (c != ICharacterScanner.EOF && fDetector.isWordPart((char) c));
scanner.unread();
String str = fBuffer.toString();
IToken token = (IToken) fWords.get(str);
if (token != null) {
lastFound = str;
return token;
}
if (fDefaultToken.isUndefined())
unreadBuffer(scanner);
return fDefaultToken;
}
}
scanner.unread();
return Token.UNDEFINED;
}
protected void unreadBuffer(ICharacterScanner scanner) {
for (int i = fBuffer.length() - 1; i >= 0; i--)
scanner.unread();
}
public IToken evaluate(ICharacterScanner scanner, boolean resume) {
return evaluate(scanner);
}
public IToken getSuccessToken() {
return this.fDefaultToken;
}
}