package adql.query; /* * This file is part of ADQLLibrary. * * ADQLLibrary is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * ADQLLibrary is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with ADQLLibrary. If not, see <http://www.gnu.org/licenses/>. * * Copyright 2012-2015 - UDS/Centre de DonnĂ©es astronomiques de Strasbourg (CDS), * Astronomisches Rechen Institute (ARI) */ import adql.parser.Token; /** * Indicates a simple position or a token/string position in a text. * It is particularly used to localize columns and tables in the original ADQL query. * * @author Grégory Mantelet (CDS;ARI) * @version 1.4 (06/2015) */ public class TextPosition { public final int beginLine; public final int beginColumn; public final int endLine; public final int endColumn; /** * Build an unknown position (all fields = -1). */ public TextPosition(){ beginLine = beginColumn = endLine = endColumn = -1; } /** * Builds a position whose the end line and column are unknown => a simple position. * * @param line Begin line. * @param column Begin column. */ public TextPosition(final int line, final int column){ beginLine = (line < 0) ? -1 : line; beginColumn = (column < 0) ? -1 : column; endLine = endColumn = -1; } /** * Builds a position => a full position (a region in the text). * * @param beginLine Begin line. * @param beginColumn Begin column. * @param endLine End line. * @param endColumn End column. */ public TextPosition(final int beginLine, final int beginColumn, final int endLine, final int endColumn){ this.beginLine = (beginLine < 0) ? -1 : beginLine; this.beginColumn = (beginColumn < 0) ? -1 : beginColumn; this.endLine = (endLine < 0) ? -1 : endLine; this.endColumn = (endColumn < 0) ? -1 : endColumn; } /** * Builds a position defining the region delimited by the given token. * * @param token The position will be the one of this token. */ public TextPosition(final Token token){ this(token.beginLine, token.beginColumn, token.endLine, (token.endColumn < 0) ? -1 : (token.endColumn + 1)); } /** * Builds a position => a full position (a region in the text). * * @param beginToken Begin position. * @param endToken End position. */ public TextPosition(final Token beginToken, final Token endToken){ this(beginToken.beginLine, beginToken.beginColumn, endToken.endLine, (endToken.endColumn < 0) ? -1 : (endToken.endColumn + 1)); } /** * Builds a copy of the given position. * * @param positionToCopy Position to copy. * @since 1.4 */ public TextPosition(final TextPosition positionToCopy){ this(positionToCopy.beginLine, positionToCopy.beginColumn, positionToCopy.endLine, positionToCopy.endColumn); } /** * Builds a position whose the start is the start position of the first parameter and the end is the end position of the second parameter. * * @param startPos Start position (only beginLine and beginColumn will be used). * @param endPos End position (only endLine and endColumn will be used). * @since 1.4 */ public TextPosition(final TextPosition startPos, final TextPosition endPos){ this(startPos.beginLine, startPos.beginColumn, endPos.endLine, endPos.endColumn); } @Override public String toString(){ if (beginLine == -1 && beginColumn == -1) return "[l.? c.?]"; else if (endLine == -1 && endColumn == -1) return "[l." + beginLine + " c." + beginColumn + "]"; else return "[l." + beginLine + " c." + beginColumn + " - l." + endLine + " c." + endColumn + "]"; } }