/* * 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; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.rf.ide.core.testdata.model.table.RobotTokenPositionComparator; import org.rf.ide.core.testdata.text.read.recognizer.RobotToken; import com.google.common.collect.Range; public class FileRegion { private FilePosition start; private FilePosition end; public FileRegion(FilePosition start, FilePosition end) { this.start = start; this.end = end; } public FilePosition getStart() { return start; } public void setStart(FilePosition start) { this.start = start; } public FilePosition getEnd() { return end; } public void setEnd(FilePosition end) { this.end = end; } public boolean isInside(final int offset) { return Range.closed(start.getOffset(), end.getOffset()).contains(offset); } public boolean containsLine(final int line) { if (line > FilePosition.NOT_SET) { return Range.closed(start.getLine(), end.getLine()).contains(line); } return false; } @Override public String toString() { return String.format("FileRegion [start=%s, end=%s]", start, end); } public static class FileRegionSplitter { public List<FileRegion> splitContinuousRegions(final List<RobotToken> tokens) { Collections.sort(tokens, new RobotTokenPositionComparator()); List<FileRegion> regions = new ArrayList<>(0); RobotToken lastTokenWithPosition = null; int lastLine = -1; for (final RobotToken token : tokens) { if (token.getFilePosition().getOffset() == FilePosition.NOT_SET) { break; } else { if (lastLine == -1) { regions.add(new FileRegion(token.getFilePosition(), null)); } else if (lastLine == token.getLineNumber() || lastLine + 1 == token.getLineNumber()) { regions.get(regions.size() - 1).setEnd( new FilePosition(token.getLineNumber(), token.getEndColumn(), token.getEndOffset())); } else { regions.get(regions.size() - 1).setEnd(new FilePosition(lastTokenWithPosition.getLineNumber(), lastTokenWithPosition.getEndColumn(), lastTokenWithPosition.getEndOffset())); regions.add(new FileRegion(token.getFilePosition(), null)); } lastTokenWithPosition = token; lastLine = token.getLineNumber(); } } if (regions.isEmpty()) { regions.add(new FileRegion(FilePosition.createNotSet(), FilePosition.createNotSet())); } else { FileRegion lastRegion = regions.get(regions.size() - 1); if (lastRegion.getEnd() == null) { lastRegion.setEnd(new FilePosition(lastTokenWithPosition.getLineNumber(), lastTokenWithPosition.getEndColumn(), lastTokenWithPosition.getEndOffset())); } } return regions; } } }