/*
* Copyright 2015 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.rf.ide.core.testdata.text.read.recognizer.executables;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import org.rf.ide.core.testdata.model.FilePosition;
import org.rf.ide.core.testdata.text.read.recognizer.ATokenRecognizer;
import org.rf.ide.core.testdata.text.read.recognizer.RobotToken;
import org.rf.ide.core.testdata.text.read.recognizer.RobotTokenType;
public class RobotSpecialTokens {
private static final List<ATokenRecognizer> SPECIAL_RECOGNIZERS = new ArrayList<>();
static {
SPECIAL_RECOGNIZERS.add(new ForActionLiteral());
SPECIAL_RECOGNIZERS.add(new ForInActionLiteral());
SPECIAL_RECOGNIZERS.add(new ForContinueToken());
}
private static class ForContinueToken extends ATokenRecognizer {
protected ForContinueToken() {
super(Pattern.compile("^(\\s)*" + "[\\\\]" + "(\\s)*"), RobotTokenType.FOR_CONTINUE_TOKEN);
}
@Override
public ATokenRecognizer newInstance() {
return new ForContinueToken();
}
}
private static class ForInActionLiteral extends ATokenRecognizer {
protected ForInActionLiteral() {
super(Pattern.compile("^(\\s)*" + "("
+ RobotTokenType.IN_TOKEN.getRepresentation()
.stream()
.map(ATokenRecognizer::createUpperLowerCaseWordWithOptionalSpaceInside)
.collect(Collectors.joining("|"))
+ ")" + "(\\s)*$"), RobotTokenType.IN_TOKEN);
}
@Override
public ATokenRecognizer newInstance() {
return new ForInActionLiteral();
}
}
private static class ForActionLiteral extends ATokenRecognizer {
protected ForActionLiteral() {
super(Pattern.compile("^(\\s)*[:](\\s)*" + "[f|F](\\s)*[o|O](\\s)*[r|R]" + "(\\s)*$"),
RobotTokenType.FOR_TOKEN);
}
@Override
public ATokenRecognizer newInstance() {
return new ForActionLiteral();
}
}
public List<RobotToken> recognize(final FilePosition fp, final String text) {
final List<RobotToken> possibleRobotTokens = new ArrayList<>();
final StringBuilder sb = new StringBuilder(text);
for (final ATokenRecognizer rec : SPECIAL_RECOGNIZERS) {
final ATokenRecognizer newInstance = rec.newInstance();
if (newInstance.hasNext(sb, fp.getLine(), fp.getColumn())) {
final RobotToken t = newInstance.next();
t.setStartColumn(t.getStartColumn() + fp.getColumn());
possibleRobotTokens.add(t);
}
}
return possibleRobotTokens;
}
}