• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 Google Inc.
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 package com.google.doclava;
18 
19 public class SourcePositionInfo implements Comparable {
20   public static final SourcePositionInfo UNKNOWN = new SourcePositionInfo("(unknown)", 0, 0);
21 
SourcePositionInfo(String file, int line, int column)22   public SourcePositionInfo(String file, int line, int column) {
23     this.file = file;
24     this.line = line;
25     this.column = column;
26   }
27 
SourcePositionInfo(SourcePositionInfo that)28   public SourcePositionInfo(SourcePositionInfo that) {
29     this.file = that.file;
30     this.line = that.line;
31     this.column = that.column;
32   }
33 
34   /**
35    * Given this position and str which occurs at that position, as well as str an index into str,
36    * find the SourcePositionInfo.
37    *
38    * @throw StringIndexOutOfBoundsException if index > str.length()
39    */
add(SourcePositionInfo that, String str, int index)40   public static SourcePositionInfo add(SourcePositionInfo that, String str, int index) {
41     if (that == null) {
42       return null;
43     }
44     int line = that.line;
45     char prev = 0;
46     for (int i = 0; i < index; i++) {
47       char c = str.charAt(i);
48       if (c == '\r' || (c == '\n' && prev != '\r')) {
49         line++;
50       }
51       prev = c;
52     }
53     return new SourcePositionInfo(that.file, line, 0);
54   }
55 
findBeginning(SourcePositionInfo that, String str)56   public static SourcePositionInfo findBeginning(SourcePositionInfo that, String str) {
57     if (that == null) {
58       return null;
59     }
60     int line = that.line - 1; // -1 because, well, it seems to work
61     int prev = 0;
62     for (int i = str.length() - 1; i >= 0; i--) {
63       char c = str.charAt(i);
64       if ((c == '\r' && prev != '\n') || (c == '\n')) {
65         line--;
66       }
67       prev = c;
68     }
69     return new SourcePositionInfo(that.file, line, 0);
70   }
71 
72   @Override
toString()73   public String toString() {
74     return file + ':' + line;
75   }
76 
compareTo(Object o)77   public int compareTo(Object o) {
78     SourcePositionInfo that = (SourcePositionInfo) o;
79     int r = this.file.compareTo(that.file);
80     if (r != 0) return r;
81     return this.line - that.line;
82   }
83 
84   /**
85    * Build a SourcePositionInfo from the XML source= notation
86    */
fromXml(String source)87   public static SourcePositionInfo fromXml(String source) {
88     if (source != null) {
89       for (int i = 0; i < source.length(); i++) {
90         if (source.charAt(i) == ':') {
91           return new SourcePositionInfo(source.substring(0, i), Integer.parseInt(source
92               .substring(i + 1)), 0);
93         }
94       }
95     }
96 
97     return UNKNOWN;
98   }
99 
100   public String file;
101   public int line;
102   public int column;
103 }
104