|  | // 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; | 
|  |  | 
|  | @Keep | 
|  | public class TextRange implements Position { | 
|  | private final TextPosition start; | 
|  | private final TextPosition end; | 
|  |  | 
|  | public TextRange(TextPosition start, TextPosition end) { | 
|  | this.start = start; | 
|  | this.end = end; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Return the start position of this range. | 
|  | */ | 
|  | public TextPosition getStart() { | 
|  | return start; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Return the end position of this range. | 
|  | */ | 
|  | public TextPosition getEnd() { | 
|  | return end; | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public int hashCode() { | 
|  | return start.hashCode() ^ end.hashCode(); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public boolean equals(Object o) { | 
|  | if (o == this) { | 
|  | return true; | 
|  | } | 
|  | if (o != null  && o.getClass().equals(getClass())) { | 
|  | TextRange other = (TextRange) o; | 
|  | return start.equals(other.getStart()) && end.equals(other.getEnd()); | 
|  | } | 
|  | return false; | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public String toString() { | 
|  | return "Text range from: '" + getStart() + "', to: '" + getEnd() + "'"; | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public String getDescription() { | 
|  | return start.getDescription(); | 
|  | } | 
|  | } |