package org.robotframework.ide.eclipse.main.plugin.tableeditor.source.colouring;
import java.util.List;
import java.util.Optional;
import org.eclipse.jface.text.rules.IToken;
import org.rf.ide.core.testdata.model.table.exec.descs.VariableExtractor;
import org.rf.ide.core.testdata.model.table.exec.descs.ast.mapping.IElementDeclaration;
import org.rf.ide.core.testdata.model.table.exec.descs.ast.mapping.MappingResult;
import org.rf.ide.core.testdata.model.table.exec.descs.ast.mapping.VariableDeclaration;
import org.rf.ide.core.testdata.text.read.IRobotLineElement;
import org.rf.ide.core.testdata.text.read.IRobotTokenType;
import org.rf.ide.core.testdata.text.read.recognizer.RobotToken;
import org.rf.ide.core.testdata.text.read.recognizer.RobotTokenType;
public class VariableUsageRule implements ISyntaxColouringRule {
private final IToken textToken;
public VariableUsageRule(final IToken textToken) {
this.textToken = textToken;
}
@Override
public boolean isApplicable(final IRobotLineElement token) {
return token instanceof RobotToken;
}
@Override
public Optional<PositionedTextToken> evaluate(final IRobotLineElement token, final int offsetInToken,
final List<IRobotLineElement> analyzedTokens) {
final List<IRobotTokenType> tokenTypes = token.getTypes();
if (tokenTypes.contains(RobotTokenType.VARIABLE_USAGE)) {
final VariableExtractor extractor = new VariableExtractor();
final MappingResult extract = extractor.extract((RobotToken) token, null);
final List<IElementDeclaration> elements = extract.getMappedElements();
for (final IElementDeclaration declaration : elements) {
final int declarationOffset = declaration.getStartFromFile().getOffset();
if (declarationOffset >= token.getStartOffset() + offsetInToken
|| (declarationOffset < token.getStartOffset() + offsetInToken && token.getStartOffset()
+ offsetInToken <= declaration.getEndFromFile().getOffset())) {
final IToken tokenToUse = declaration instanceof VariableDeclaration ? textToken
: getTokenForNonVariablePart();
return Optional.of(new PositionedTextToken(tokenToUse, declarationOffset,
declaration.getEndFromFile().getOffset() - declarationOffset + 1));
}
}
}
return Optional.empty();
}
protected IToken getTokenForNonVariablePart() {
return ISyntaxColouringRule.DEFAULT_TOKEN;
}
}