mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-10 17:55:39 +02:00
bug 411845: Keywords are not highlighted when indented with spaces in Makefile Editor
This commit is contained in:
parent
c0717fe40d
commit
1f57a45477
1 changed files with 38 additions and 12 deletions
|
@ -14,6 +14,8 @@ import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.eclipse.cdt.make.internal.ui.text.ColorManager;
|
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.IRule;
|
||||||
import org.eclipse.jface.text.rules.IToken;
|
import org.eclipse.jface.text.rules.IToken;
|
||||||
import org.eclipse.jface.text.rules.IWhitespaceDetector;
|
import org.eclipse.jface.text.rules.IWhitespaceDetector;
|
||||||
|
@ -39,6 +41,41 @@ public class MakefileCodeScanner extends AbstractMakefileCodeScanner {
|
||||||
ColorManager.MAKE_DEFAULT_COLOR
|
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
|
* Constructor for MakefileCodeScanner
|
||||||
*/
|
*/
|
||||||
|
@ -68,21 +105,10 @@ public class MakefileCodeScanner extends AbstractMakefileCodeScanner {
|
||||||
rules.add(new MacroDefinitionRule(macroDefToken, Token.UNDEFINED));
|
rules.add(new MacroDefinitionRule(macroDefToken, Token.UNDEFINED));
|
||||||
|
|
||||||
// Add word rule for keywords, types, and constants.
|
// 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 KeywordRule();
|
||||||
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 == '-';
|
|
||||||
}
|
|
||||||
});
|
|
||||||
for (String keyword : keywords) {
|
for (String keyword : keywords) {
|
||||||
keyWordRule.addWord(keyword, keywordToken);
|
keyWordRule.addWord(keyword, keywordToken);
|
||||||
}
|
}
|
||||||
keyWordRule.setColumnConstraint(0);
|
|
||||||
rules.add(keyWordRule);
|
rules.add(keyWordRule);
|
||||||
|
|
||||||
rules.add(new FunctionReferenceRule(functionToken));
|
rules.add(new FunctionReferenceRule(functionToken));
|
||||||
|
|
Loading…
Add table
Reference in a new issue