/*
* Copyright 2016 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.write;
import java.util.List;
import java.util.Optional;
import org.rf.ide.core.testdata.model.AModelElement;
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.RobotLine;
import org.rf.ide.core.testdata.text.read.recognizer.RobotToken;
import org.rf.ide.core.testdata.text.read.recognizer.RobotTokenType;
/**
* @author wypych
*/
public class NotModelRelatedHashCommentedLineDumper {
private final DumperHelper generalHelper;
public NotModelRelatedHashCommentedLineDumper(final DumperHelper generalHelper) {
this.generalHelper = generalHelper;
}
public <T> void dumpHashCommentsIfTheyExists(final AModelElement<T> previousElementDumped,
final AModelElement<?> nextElementToBeDumped, final RobotFile model, final List<RobotLine> lines) {
if (nextElementToBeDumped == null || previousElementDumped.getEndPosition().getLine()
+ 1 != nextElementToBeDumped.getBeginPosition().getLine()) {
if (previousElementDumped.getBeginPosition().isNotSet()) {
return;
}
final Optional<RobotToken> maxPosition = tokenWithMaxLineNumber(previousElementDumped);
if (maxPosition.isPresent()) {
final RobotToken lastTokenInLines;
if (nextElementToBeDumped != null && !nextElementToBeDumped.getElementTokens().isEmpty()) {
lastTokenInLines = nextElementToBeDumped.getElementTokens()
.get(nextElementToBeDumped.getElementTokens().size() - 1);
} else {
lastTokenInLines = maxPosition.get();
}
final int startLine = maxPosition.get().getLineNumber();
final List<RobotLine> oldContent = model.getFileContent();
final int lastLineToDump = findLastHashLine(oldContent, startLine, lastTokenInLines);
if (lastLineToDump > -1) {
dumpCommentHashes(model, lines, startLine, oldContent, lastLineToDump, lastTokenInLines);
}
}
}
}
private void dumpCommentHashes(final RobotFile model, final List<RobotLine> lines, final int startLine,
final List<RobotLine> oldContent, final int lastLineToDump, final RobotToken lastTokenInLines) {
// assumption that empties was dumped
boolean isLastEmpty = (lines.size() > 0) ? isEmpty(lines.get(lines.size() - 1)) : false;
for (int lineIndex = startLine; lineIndex < lastLineToDump; lineIndex++) {
final RobotLine robotLine = oldContent.get(lineIndex);
if (isLastEmpty && isEmpty(robotLine)) {
continue;
}
isLastEmpty = false;
dumpHashLine(model, lines, robotLine);
}
}
private boolean isEmpty(final RobotLine line) {
for (final IRobotLineElement rle : line.getLineElements()) {
if (rle instanceof RobotToken) {
if (rle.getTypes().contains(RobotTokenType.PRETTY_ALIGN_SPACE)) {
continue;
}
return false;
}
}
return true;
}
private void dumpHashLine(final RobotFile model, final List<RobotLine> lines, final RobotLine robotLine) {
for (final IRobotLineElement e : robotLine.getLineElements()) {
generalHelper.getDumpLineUpdater().updateLine(model, lines, e);
}
if (!robotLine.getEndOfLine().getFilePosition().isNotSet()) {
generalHelper.getDumpLineUpdater().updateLine(model, lines, robotLine.getEndOfLine());
}
}
private <T> Optional<RobotToken> tokenWithMaxLineNumber(final AModelElement<T> elem) {
Optional<RobotToken> max = Optional.empty();
for (final RobotToken t : elem.getElementTokens()) {
if (max.isPresent()) {
if (max.get().getFilePosition().getLine() < t.getLineNumber()) {
max = Optional.of(t);
}
} else {
max = Optional.of(t);
}
}
return max;
}
private int findLastHashLine(final List<RobotLine> lines, final int startLine, final RobotToken lastTokenInLines) {
int lastHash = -1;
final int lineSize = lines.size();
for (int lineIndex = startLine; lineIndex < lineSize; lineIndex++) {
final RobotLine line = lines.get(lineIndex);
for (final IRobotLineElement rle : line.getLineElements()) {
if (rle instanceof RobotToken) {
if ((rle.getTypes().contains(RobotTokenType.START_HASH_COMMENT)
|| rle.getTypes().contains(RobotTokenType.COMMENT_CONTINUE)) && rle != lastTokenInLines) {
lastHash = line.getLineNumber();
} else {
return lastHash;
}
}
}
}
return lastHash;
}
}