/*
* 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.model.table.exec.descs.impl;
import java.util.List;
import org.rf.ide.core.testdata.model.AModelElement;
import org.rf.ide.core.testdata.model.RobotFile;
import org.rf.ide.core.testdata.model.RobotFileOutput;
import org.rf.ide.core.testdata.model.table.ARobotSectionTable;
import org.rf.ide.core.testdata.model.table.RobotExecutableRow;
import org.rf.ide.core.testdata.model.table.exec.CommentedVariablesFilter;
import org.rf.ide.core.testdata.model.table.exec.CommentedVariablesFilter.FilteredVariables;
import org.rf.ide.core.testdata.model.table.exec.descs.IExecutableRowDescriptor;
import org.rf.ide.core.testdata.model.table.exec.descs.IRowDescriptorBuilder;
import org.rf.ide.core.testdata.model.table.exec.descs.RobotAction;
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.recognizer.RobotToken;
import org.rf.ide.core.testdata.text.read.recognizer.RobotTokenType;
public class SimpleRowDescriptorBuilder implements IRowDescriptorBuilder {
@Override
public <T> AcceptResult acceptable(final RobotExecutableRow<T> execRowLine) {
return new AcceptResult(true);
}
@Override
public <T> IExecutableRowDescriptor<T> buildDescription(final RobotExecutableRow<T> execRowLine,
final AcceptResult acceptResult) {
final SimpleRowDescriptor<T> simple = new SimpleRowDescriptor<>(execRowLine);
final ARobotSectionTable table;
if (execRowLine.getParent() instanceof AModelElement) {
final AModelElement<?> keywordOrTestcase = (AModelElement<?>) execRowLine.getParent();
table = (ARobotSectionTable) keywordOrTestcase.getParent();
} else {
table = (ARobotSectionTable) execRowLine.getParent();
}
final RobotFile robotFile = table.getParent();
final RobotFileOutput rfo = robotFile.getParent();
final String fileName = rfo.getProcessedFile().getAbsolutePath();
final VariableExtractor varExtractor = new VariableExtractor();
final List<RobotToken> lineElements = execRowLine.getElementTokens();
boolean isAfterFirstAction = false;
final CommentedVariablesFilter filter = new CommentedVariablesFilter();
for (final RobotToken elem : lineElements) {
MappingResult mappingResult = null;
// just to revert issues with assignment for variables in table view
if (!isAfterFirstAction) {
final String text = elem.getText().replaceAll("\\s+", "");
final String raw = elem.getRaw().replaceAll("\\s+", "") + "=";
if (text.equals(raw)) {
final RobotToken varPretend = elem.copy();
varPretend.setText(elem.getRaw());
mappingResult = varExtractor.extract(varPretend, fileName);
}
}
if (mappingResult == null) {
mappingResult = varExtractor.extract(elem, fileName);
}
simple.addMessages(mappingResult.getMessages());
// value is keyword if is on the first place and have in it nested
// variables and when contains text on the beginning or end of field
FilteredVariables filteredVars = filter.filter(rfo, mappingResult.getCorrectVariables());
simple.addCommentedVariables(filteredVars.getCommented());
final List<VariableDeclaration> correctVariables = filteredVars.getUsed();
final List<IElementDeclaration> mappedElements = mappingResult.getMappedElements();
if (isAfterFirstAction) {
simple.addUsedVariables(correctVariables);
simple.addTextParameters(mappingResult.getTextElements());
if (!execRowLine.getComment().contains(elem)) {
simple.addKeywordArgument(elem.copy());
}
} else {
if (correctVariables.size() == 1 && mappedElements.size() == 1) {
// definition variable
simple.addCreatedVariable(correctVariables.get(0));
} else {
if (elem.getTypes().contains(RobotTokenType.START_HASH_COMMENT)) {
simple.addTextParameters(mappingResult.getTextElements());
} else {
simple.setAction(new RobotAction(elem.copy(), mappedElements));
simple.addUsedVariables(correctVariables);
isAfterFirstAction = true;
}
}
}
}
moveCreatedToUsedInCaseNoKeywords(simple);
return simple;
}
private <T> void moveCreatedToUsedInCaseNoKeywords(final SimpleRowDescriptor<T> simple) {
if (simple.getAction().getToken().getFilePosition().isNotSet() && !simple.getAction().getToken().isNotEmpty()
&& simple.getKeywordArguments().isEmpty()) {
simple.moveCreatedVariablesToUsedVariables();
}
}
}