| // Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| package com.android.tools.r8; |
| |
| import com.android.tools.r8.origin.Origin; |
| |
| /** |
| * A location with a position in a text file. |
| */ |
| public class TextRangeLocation extends Location { |
| |
| /** |
| * A position in a text file determined by line and column. |
| * Line and column numbers start at 1. |
| */ |
| public static class TextPosition { |
| private final int line; |
| private final int column; |
| |
| private TextPosition(int line, int column) { |
| this.line = line; |
| this.column = column; |
| } |
| |
| /** |
| * Return the line of this position. |
| */ |
| public int getLine() { |
| return line; |
| } |
| |
| /** |
| * Return the column of this position. |
| * @return May return {@link #UNKNOWN_COLUMN} if column information is not available. |
| */ |
| public int getColumn() { |
| return column; |
| } |
| } |
| |
| /** |
| * Line or column is unknown. |
| */ |
| public static final int UNKNOWN_COLUMN = -1; |
| |
| private final TextPosition start; |
| private final TextPosition end; |
| |
| public static Location get(Origin origin, int startLine, int startColumn) { |
| return get(origin, startLine, startColumn, startLine, startColumn); |
| } |
| |
| public static Location get(Origin origin, int startLine, int startColumn, int endLine, |
| int endColumn) { |
| if (origin == Origin.unknown()) { |
| return Location.UNKNOWN; |
| } else { |
| assert startLine > 0 |
| && endLine >= startLine |
| && ((startColumn == UNKNOWN_COLUMN && endColumn == UNKNOWN_COLUMN) |
| || (startColumn > 0 && endColumn > 0)); |
| TextPosition start = new TextPosition(startLine, startColumn); |
| TextPosition end; |
| if (startLine == endLine && startColumn == endColumn) { |
| end = start; |
| } else { |
| end = new TextPosition(endLine, endColumn); |
| } |
| return new TextRangeLocation(origin, start, end); |
| } |
| } |
| |
| private TextRangeLocation(Origin origin, TextPosition start, TextPosition end) { |
| super(origin); |
| this.start = start; |
| this.end = end; |
| } |
| |
| /** |
| * Return the start position of this text range. |
| */ |
| public TextPosition getStart() { |
| return start; |
| } |
| |
| /** |
| * Return the end position of this text range. |
| */ |
| public TextPosition getEnd() { |
| return end; |
| } |
| |
| @Override |
| public String getDescription() { |
| return super.getDescription() + " line " + getStart().getLine(); |
| } |
| } |