/*
* 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.mapping.hash.comment;
import java.util.Collections;
import java.util.List;
import org.rf.ide.core.testdata.mapping.IHashCommentMapper;
import org.rf.ide.core.testdata.mapping.table.ElementPositionResolver;
import org.rf.ide.core.testdata.model.RobotFile;
import org.rf.ide.core.testdata.model.table.RobotTokenPositionComparator;
import org.rf.ide.core.testdata.model.table.VariableTable;
import org.rf.ide.core.testdata.model.table.variables.AVariable;
import org.rf.ide.core.testdata.model.table.variables.AVariable.VariableScope;
import org.rf.ide.core.testdata.model.table.variables.IVariableHolder;
import org.rf.ide.core.testdata.model.table.variables.ListVariable;
import org.rf.ide.core.testdata.text.read.ParsingState;
import org.rf.ide.core.testdata.text.read.ParsingState.TableType;
import org.rf.ide.core.testdata.text.read.RobotLine;
import org.rf.ide.core.testdata.text.read.recognizer.RobotToken;
import org.rf.ide.core.testdata.text.read.recognizer.RobotTokenType;
import com.google.common.annotations.VisibleForTesting;
public class VariablesDeclarationCommentMapper implements IHashCommentMapper {
private final ElementPositionResolver resolver = new ElementPositionResolver();
@Override
public boolean isApplicable(final ParsingState state) {
return (state == ParsingState.VARIABLE_UNKNOWN || state == ParsingState.VARIABLE_UNKNOWN_VALUE
|| state == ParsingState.SCALAR_VARIABLE_DECLARATION || state == ParsingState.SCALAR_VARIABLE_VALUE
|| state == ParsingState.LIST_VARIABLE_DECLARATION || state == ParsingState.LIST_VARIABLE_VALUE
|| state == ParsingState.DICTIONARY_VARIABLE_DECLARATION
|| state == ParsingState.DICTIONARY_VARIABLE_VALUE || state == ParsingState.VARIABLE_TABLE_INSIDE);
}
@Override
public void map(final RobotLine currentLine, final RobotToken rt, final ParsingState currentState,
final RobotFile fileModel) {
final VariableTable variableTable = fileModel.getVariableTable();
if (variableTable.isEmpty()) {
final ListVariable var = new ListVariable(null, createArtifactalListVariable(rt), VariableScope.TEST_SUITE);
var.addCommentPart(rt);
variableTable.addVariable(var);
} else {
final List<AVariable> variables = variableTable.getVariables();
final IVariableHolder var = variables.get(variables.size() - 1);
if (isInTheSameLine(rt, var) || resolver.buildPositionDescription(fileModel, currentLine, rt)
.isContinuePreviousLineTheFirstToken(TableType.VARIABLES)) {
var.addCommentPart(rt);
} else {
final ListVariable newVar = new ListVariable(null, createArtifactalListVariable(rt),
VariableScope.TEST_SUITE);
newVar.addCommentPart(rt);
variableTable.addVariable(newVar);
}
}
}
@VisibleForTesting
protected boolean isInTheSameLine(final RobotToken rt, final IVariableHolder var) {
boolean result = false;
if (var instanceof AVariable) {
final AVariable aVar = (AVariable) var;
final List<RobotToken> tokens = aVar.getElementTokens();
Collections.sort(tokens, new RobotTokenPositionComparator());
final int size = tokens.size();
for (int i = size - 1; i >= 0; i--) {
if (tokens.get(i).getLineNumber() == rt.getLineNumber()) {
result = true;
break;
}
}
}
return result;
}
@VisibleForTesting
protected RobotToken createArtifactalListVariable(final RobotToken rt) {
final RobotToken token = new RobotToken();
token.setLineNumber(rt.getLineNumber());
token.setStartColumn(rt.getStartColumn());
token.setText("");
token.setRaw("");
token.setType(RobotTokenType.VARIABLES_LIST_DECLARATION);
return token;
}
}