1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc.  All rights reserved.
3 // https://developers.google.com/protocol-buffers/
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are
7 // met:
8 //
9 //     * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer.
11 //     * Redistributions in binary form must reproduce the above
12 // copyright notice, this list of conditions and the following disclaimer
13 // in the documentation and/or other materials provided with the
14 // distribution.
15 //     * Neither the name of Google Inc. nor the names of its
16 // contributors may be used to endorse or promote products derived from
17 // this software without specific prior written permission.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 
31 package com.google.protobuf;
32 
33 import java.util.Arrays;
34 
35 /**
36  * A location in the source code.
37  *
38  * <p>A location is the starting line number and starting column number.
39  */
40 public final class TextFormatParseLocation {
41 
42   /**
43    * The empty location.
44    */
45   public static final TextFormatParseLocation EMPTY = new TextFormatParseLocation(-1, -1);
46 
47   /**
48    * Create a location.
49    *
50    * @param line the starting line number
51    * @param column the starting column number
52    * @return a {@code ParseLocation}
53    */
create(int line, int column)54   static TextFormatParseLocation create(int line, int column) {
55     if (line == -1 && column == -1) {
56       return EMPTY;
57     }
58     if (line < 0 || column < 0) {
59       throw new IllegalArgumentException(
60           String.format("line and column values must be >= 0: line %d, column: %d", line, column));
61     }
62     return new TextFormatParseLocation(line, column);
63   }
64 
65   private final int line;
66   private final int column;
67 
TextFormatParseLocation(int line, int column)68   private TextFormatParseLocation(int line, int column) {
69     this.line = line;
70     this.column = column;
71   }
72 
getLine()73   public int getLine() {
74     return line;
75   }
76 
getColumn()77   public int getColumn() {
78     return column;
79   }
80 
81   @Override
toString()82   public String toString() {
83     return String.format("ParseLocation{line=%d, column=%d}", line, column);
84   }
85 
86   @Override
equals(Object o)87   public boolean equals(Object o) {
88     if (o == this) {
89       return true;
90     }
91     if (!(o instanceof TextFormatParseLocation)) {
92       return false;
93     }
94     TextFormatParseLocation that = (TextFormatParseLocation) o;
95     return (this.line == that.getLine())
96          && (this.column == that.getColumn());
97   }
98 
99   @Override
hashCode()100   public int hashCode() {
101     int[] values = {line, column};
102     return Arrays.hashCode(values);
103   }
104 }
105