1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-30 21:55:31 +02:00

bug 411845: Keywords are not highlighted when indented with spaces in Makefile Editor

This commit is contained in:
Andrew Gvozdev 2013-05-07 09:37:13 -04:00
parent c0717fe40d
commit 1f57a45477

View file

@ -14,6 +14,8 @@ import java.util.ArrayList;
import java.util.List;
import org.eclipse.cdt.make.internal.ui.text.ColorManager;
import org.eclipse.jface.text.BadLocationException;
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.IWhitespaceDetector;
@ -39,6 +41,41 @@ public class MakefileCodeScanner extends AbstractMakefileCodeScanner {
ColorManager.MAKE_DEFAULT_COLOR
};
private final class KeywordDetector implements IWordDetector {
@Override
public boolean isWordPart(char c) {
return Character.isLetterOrDigit(c);
}
@Override
public boolean isWordStart(char c) {
return Character.isLetterOrDigit(c) || c == '-';
}
}
private class KeywordRule extends WordRule {
private KeywordRule() {
super(new KeywordDetector());
}
@Override
public IToken evaluate(ICharacterScanner scanner) {
int offset = fOffset;
IToken token = super.evaluate(scanner);
if (token != fDefaultToken) {
// check if the keyword starts from beginning of line possibly indented
try {
int line= fDocument.getLineOfOffset(offset);
int start= fDocument.getLineOffset(line);
String ident = fDocument.get(start, offset - start);
if (ident.trim().length() > 0) {
token = fDefaultToken;
}
} catch (BadLocationException ex) {
}
}
return token;
}
}
/**
* Constructor for MakefileCodeScanner
*/
@ -68,21 +105,10 @@ public class MakefileCodeScanner extends AbstractMakefileCodeScanner {
rules.add(new MacroDefinitionRule(macroDefToken, Token.UNDEFINED));
// Add word rule for keywords, types, and constants.
// We restrict the detection of the keywords to be the first column to be valid.
WordRule keyWordRule = new WordRule(new IWordDetector() {
@Override
public boolean isWordPart(char c) {
return Character.isLetterOrDigit(c) || c == '_';
}
@Override
public boolean isWordStart(char c) {
return Character.isLetterOrDigit(c) || c == '_' || c == '-';
}
});
WordRule keyWordRule = new KeywordRule();
for (String keyword : keywords) {
keyWordRule.addWord(keyword, keywordToken);
}
keyWordRule.setColumnConstraint(0);
rules.add(keyWordRule);
rules.add(new FunctionReferenceRule(functionToken));