/*
* 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.execution.context;
import java.util.List;
import org.rf.ide.core.testdata.model.RobotFile;
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.RobotLine;
import org.rf.ide.core.testdata.text.read.recognizer.RobotTokenType;
import org.rf.ide.core.testdata.text.read.separators.Separator.SeparatorType;
/**
* @author mmarzec
*/
public class RobotDebugExecutableLineChecker {
private static RobotTokenType[] executableTypes = new RobotTokenType[] {
RobotTokenType.KEYWORD_ACTION_NAME,
RobotTokenType.TEST_CASE_ACTION_NAME,
RobotTokenType.SETTING_SUITE_SETUP_KEYWORD_NAME,
RobotTokenType.SETTING_SUITE_TEARDOWN_KEYWORD_NAME,
RobotTokenType.SETTING_TEST_SETUP_KEYWORD_NAME,
RobotTokenType.SETTING_TEST_TEARDOWN_KEYWORD_NAME,
RobotTokenType.TEST_CASE_SETTING_SETUP_KEYWORD_NAME,
RobotTokenType.TEST_CASE_SETTING_TEARDOWN_KEYWORD_NAME
};
private RobotDebugExecutableLineChecker() {
}
public static boolean isExecutableLine(final RobotFile file, final int lineNumber) {
if (file != null && (lineNumber - 1) >= 0 && (lineNumber-1) < file.getFileContent().size()) {
final RobotLine robotLine = file.getFileContent().get(lineNumber - 1);
final List<IRobotLineElement> lineElements = robotLine.getLineElements();
if(hasComment(lineElements)) {
return false;
}
for (IRobotLineElement robotLineElement : lineElements) {
if (hasExecutableRobotLineType(robotLineElement.getTypes())) {
return true;
}
}
}
return false;
}
private static boolean hasExecutableRobotLineType(final List<IRobotTokenType> types) {
return !hasSeparator(types) && hasExecutableType(types);
}
private static boolean hasExecutableType(final List<IRobotTokenType> types) {
for (int i = 0; i < executableTypes.length; i++) {
if (types.contains(executableTypes[i])) {
return true;
}
}
return false;
}
private static boolean hasSeparator(final List<IRobotTokenType> types) {
return types.contains(SeparatorType.TABULATOR_OR_DOUBLE_SPACE) || types.contains(SeparatorType.PIPE);
}
private static boolean hasComment(final List<IRobotLineElement> lineElements) {
if (!lineElements.isEmpty()) {
final List<IRobotTokenType> types = lineElements.get(0).getTypes();
if(hasSeparator(types) && lineElements.size() > 1) {
return hasCommentTypes(lineElements.get(1).getTypes());
} else {
return hasCommentTypes(types);
}
}
return false;
}
private static boolean hasCommentTypes(final List<IRobotTokenType> types) {
return types.contains(RobotTokenType.START_HASH_COMMENT) || types.contains(RobotTokenType.COMMENT_CONTINUE);
}
}