1920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson/* 2920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Copyright (C) 2010 Google Inc. 3920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * 4920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Licensed under the Apache License, Version 2.0 (the "License"); 5920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * you may not use this file except in compliance with the License. 6920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * You may obtain a copy of the License at 7920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * 8920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * http://www.apache.org/licenses/LICENSE-2.0 9920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * 10920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Unless required by applicable law or agreed to in writing, software 11920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * distributed under the License is distributed on an "AS IS" BASIS, 12920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * See the License for the specific language governing permissions and 14920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * limitations under the License. 15920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson */ 16920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 17920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonpackage com.google.doclava; 18920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 19920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonpublic class SourcePositionInfo implements Comparable { 20920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static final SourcePositionInfo UNKNOWN = new SourcePositionInfo("(unknown)", 0, 0); 21920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 22920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public SourcePositionInfo(String file, int line, int column) { 23920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson this.file = file; 24920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson this.line = line; 25920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson this.column = column; 26920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 27920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 28920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public SourcePositionInfo(SourcePositionInfo that) { 29920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson this.file = that.file; 30920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson this.line = that.line; 31920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson this.column = that.column; 32920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 33920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 34920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson /** 35920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Given this position and str which occurs at that position, as well as str an index into str, 36920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * find the SourcePositionInfo. 37920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * 38920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * @throw StringIndexOutOfBoundsException if index > str.length() 39920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson */ 40920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static SourcePositionInfo add(SourcePositionInfo that, String str, int index) { 41920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (that == null) { 42920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return null; 43920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 44920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson int line = that.line; 45920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson char prev = 0; 46920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (int i = 0; i < index; i++) { 47920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson char c = str.charAt(i); 48920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (c == '\r' || (c == '\n' && prev != '\r')) { 49920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson line++; 50920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 51920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson prev = c; 52920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 53920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return new SourcePositionInfo(that.file, line, 0); 54920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 55920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 56920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static SourcePositionInfo findBeginning(SourcePositionInfo that, String str) { 57920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (that == null) { 58920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return null; 59920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 60920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson int line = that.line - 1; // -1 because, well, it seems to work 61920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson int prev = 0; 62920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (int i = str.length() - 1; i >= 0; i--) { 63920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson char c = str.charAt(i); 64920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if ((c == '\r' && prev != '\n') || (c == '\n')) { 65920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson line--; 66920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 67920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson prev = c; 68920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 69920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return new SourcePositionInfo(that.file, line, 0); 70920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 71920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 72920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson @Override 73920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public String toString() { 74920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return file + ':' + line; 75920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 76920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 77920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public int compareTo(Object o) { 78920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson SourcePositionInfo that = (SourcePositionInfo) o; 79920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson int r = this.file.compareTo(that.file); 80920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (r != 0) return r; 81920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return this.line - that.line; 82920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 83920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 84920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson /** 85920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Build a SourcePositionInfo from the XML source= notation 86920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson */ 87920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public static SourcePositionInfo fromXml(String source) { 88920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (source != null) { 89920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson for (int i = 0; i < source.length(); i++) { 90920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (source.charAt(i) == ':') { 91920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return new SourcePositionInfo(source.substring(0, i), Integer.parseInt(source 92920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson .substring(i + 1)), 0); 93920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 94920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 95920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 96920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 97920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return UNKNOWN; 98920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 99920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 100920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public String file; 101920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public int line; 102920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public int column; 103920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson} 104