/*******************************************************************************
* Copyright (c) 2005, 2009 IBM Corporation 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:
* IBM Corporation - initial API and implementation
* QNX Software System
* Anton Leherbauer (Wind River Systems)
* Andrew Ferguson (Symbian)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.editor.asm;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.text.rules.EndOfLineRule;
import org.eclipse.jface.text.rules.IRule;
import org.eclipse.jface.text.rules.IToken;
import org.eclipse.jface.text.rules.WordPatternRule;
import org.eclipse.jface.text.rules.WordRule;
import org.eclipse.cdt.core.model.IAsmLanguage;
import org.eclipse.cdt.ui.text.AbstractCScanner;
import org.eclipse.cdt.ui.text.ICColorConstants;
import org.eclipse.cdt.ui.text.ITokenStoreFactory;
import org.eclipse.cdt.internal.ui.text.CWhitespaceRule;
/*
* An assembly code scanner.
*/
public final class AsmCodeScanner extends AbstractCScanner {
private static String[] fgTokenProperties= {
ICColorConstants.ASM_DIRECTIVE,
ICColorConstants.ASM_LABEL,
ICColorConstants.C_KEYWORD,
ICColorConstants.C_SINGLE_LINE_COMMENT,
ICColorConstants.C_DEFAULT
};
private IAsmLanguage fAsmLanguage;
/**
* Creates an assembly code scanner.
*/
public AsmCodeScanner(ITokenStoreFactory factory, IAsmLanguage asmLanguage) {
super(factory.createTokenStore(fgTokenProperties));
fAsmLanguage= asmLanguage;
setRules(createRules());
}
protected List<IRule> createRules() {
IToken token;
List<IRule> rules= new ArrayList<IRule>();
// Add rule(s) for single line comments
token= getToken(ICColorConstants.C_SINGLE_LINE_COMMENT);
char[] lineCommentChars= fAsmLanguage.getLineCommentCharacters();
for (int i= 0; i < lineCommentChars.length; i++) {
rules.add(new EndOfLineRule(new String(new char [] {lineCommentChars[i]}), token));
}
final IToken other= getToken(ICColorConstants.C_DEFAULT);
// Add generic whitespace rule.
rules.add(new CWhitespaceRule(other));
// Add rule for labels
token= getToken(ICColorConstants.ASM_LABEL);
IRule labelRule= new AsmLabelRule(new AsmWordDetector(false), token, other);
rules.add(labelRule);
// Add word rule for keywords
token= getToken(ICColorConstants.ASM_DIRECTIVE);
String[] keywords= fAsmLanguage.getDirectiveKeywords();
WordRule wordRule= new WordRule(new AsmWordDetector('.'), other);
for (int i=0; i<keywords.length; i++)
wordRule.addWord(keywords[i], token);
rules.add(wordRule);
// TODO use extra color?
token= getToken(ICColorConstants.C_KEYWORD);
WordPatternRule regPattern= new WordPatternRule(new AsmWordDetector('%', (char)0), "%", null, token); //$NON-NLS-1$
rules.add(regPattern);
setDefaultReturnToken(other);
return rules;
}
}