// 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.position;

import com.android.tools.r8.Keep;

/**
 * A {@link Position} in a text file determined by line and column.
 * Line and column numbers start at 1.
 */
@Keep
public class TextPosition implements Position {

  /**
   * Column is unknown.
   */
  public static final int UNKNOWN_COLUMN = -1;

  /**
   * Char offset from the start of the text resource.
   */
  private final long offset;
  private final int line;
  private final int column;

  public TextPosition(long offset, int line, int column) {
    assert (offset >= 0)
        && (line >= 1)
        && (column >= 1 || column == UNKNOWN_COLUMN);
    this.offset = offset;
    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;
  }

  public long getOffset() {
    return offset;
  }

  @Override
  public String toString() {
    return "Offset: " + offset + ", Line: " + line + ", column: " + column;
  }

  @Override
  public String getDescription() {
    return "Line: " + line + (column != UNKNOWN_COLUMN ? ", column: " + column: "");
  }

  @Override
  public int hashCode() {
    return Long.hashCode(offset) ^ line ^ (column << 16);
  }

  @Override
  public boolean equals(Object o) {
    if (o == this) {
      return true;
    }
    if (o != null  && o.getClass().equals(TextPosition.class)) {
      TextPosition other = (TextPosition) o;
      return offset == other.offset && line == other.line && column == other.column;
    }
    return false;
  }
}
