1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 public class SourcePositionInfo implements Comparable 18 { SourcePositionInfo()19 public SourcePositionInfo() { 20 this.file = "<unknown>"; 21 this.line = 0; 22 this.column = 0; 23 } 24 SourcePositionInfo(String file, int line, int column)25 public SourcePositionInfo(String file, int line, int column) 26 { 27 this.file = file; 28 this.line = line; 29 this.column = column; 30 } 31 SourcePositionInfo(SourcePositionInfo that)32 public SourcePositionInfo(SourcePositionInfo that) 33 { 34 this.file = that.file; 35 this.line = that.line; 36 this.column = that.column; 37 } 38 39 /** 40 * Given this position and str which occurs at that position, as well as str an index into str, 41 * find the SourcePositionInfo. 42 * 43 * @throw StringIndexOutOfBoundsException if index > str.length() 44 */ add(SourcePositionInfo that, String str, int index)45 public static SourcePositionInfo add(SourcePositionInfo that, String str, int index) 46 { 47 if (that == null) { 48 return null; 49 } 50 int line = that.line; 51 char prev = 0; 52 for (int i=0; i<index; i++) { 53 char c = str.charAt(i); 54 if (c == '\r' || (c == '\n' && prev != '\r')) { 55 line++; 56 } 57 prev = c; 58 } 59 return new SourcePositionInfo(that.file, line, 0); 60 } 61 findBeginning(SourcePositionInfo that, String str)62 public static SourcePositionInfo findBeginning(SourcePositionInfo that, String str) 63 { 64 if (that == null) { 65 return null; 66 } 67 int line = that.line-1; // -1 because, well, it seems to work 68 int prev = 0; 69 for (int i=str.length()-1; i>=0; i--) { 70 char c = str.charAt(i); 71 if ((c == '\r' && prev != '\n') || (c == '\n')) { 72 line--; 73 } 74 prev = c; 75 } 76 return new SourcePositionInfo(that.file, line, 0); 77 } 78 79 @Override toString()80 public String toString() 81 { 82 return file + ':' + line; 83 } 84 compareTo(Object o)85 public int compareTo(Object o) { 86 SourcePositionInfo that = (SourcePositionInfo)o; 87 int r = this.file.compareTo(that.file); 88 if (r != 0) return r; 89 return this.line - that.line; 90 } 91 92 public String file; 93 public int line; 94 public int column; 95 } 96