View Javadoc

1   package org.codehaus.groovy.antlr;
2   
3   import antlr.collections.AST;
4   import antlr.*;
5   
6   import java.util.List;
7   import java.util.ArrayList;
8   
9   /***
10   * We have an AST subclass so we can track source information.
11   * Very odd that ANTLR doesn't do this by default.
12   *
13   * @author Mike Spille
14   * @author Jeremy Rayner <groovy@ross-rayner.com>
15   */
16  public class GroovySourceAST extends CommonAST implements Comparable {
17      private int line;
18      private int col;
19      private int lineLast;
20      private int colLast;
21      private String snippet;
22  
23      public GroovySourceAST() {
24      }
25  
26      public GroovySourceAST(Token t) {
27          super(t);
28      }
29  
30      public void initialize(AST ast) {
31          super.initialize(ast);
32          line = ast.getLine();
33          col = ast.getColumn();
34      }
35  
36      public void initialize(Token t) {
37          super.initialize(t);
38          line = t.getLine();
39          col = t.getColumn();
40      }
41  
42      public void setLast(Token last) {
43          lineLast = last.getLine();
44          colLast = last.getColumn();
45      }
46  
47      public int getLineLast() {
48          return lineLast;
49      }
50  
51      public void setLineLast(int lineLast) {
52          this.lineLast = lineLast;
53      }
54  
55      public int getColumnLast() {
56          return colLast;
57      }
58  
59      public void setColumnLast(int colLast) {
60          this.colLast = colLast;
61      }
62  
63      public void setLine(int line) {
64          this.line = line;
65      }
66  
67      public int getLine() {
68          return (line);
69      }
70  
71      public void setColumn(int column) {
72          this.col = column;
73      }
74  
75      public int getColumn() {
76          return (col);
77      }
78  
79      public void setSnippet(String snippet) {
80          this.snippet = snippet;
81      }
82  
83      public String getSnippet() {
84          return snippet;
85      }
86  
87      public int compareTo(Object object) {
88          if (object == null) {
89              return 0;
90          }
91          if (!(object instanceof AST)) {
92              return 0;
93          }
94          AST that = (AST) object;
95  
96          // todo - possibly check for line/col with values of 0 or less...
97  
98          if (this.getLine() < that.getLine()) {
99              return -1;
100         }
101         if (this.getLine() > that.getLine()) {
102             return 1;
103         }
104 
105         if (this.getColumn() < that.getColumn()) {
106             return -1;
107         }
108         if (this.getColumn() > that.getColumn()) {
109             return 1;
110         }
111 
112         return 0;
113     }
114 
115     public GroovySourceAST childAt(int position) {
116         List list = new ArrayList();
117         AST child = this.getFirstChild();
118         while (child != null) {
119             list.add(child);
120             child = child.getNextSibling();
121         }
122         try {
123             return (GroovySourceAST)list.get(position);
124         } catch (IndexOutOfBoundsException e) {
125             return null;
126         }
127     }
128 
129     public GroovySourceAST childOfType(int type) {
130         AST child = this.getFirstChild();
131         while (child != null) {
132             if (child.getType() == type) { return (GroovySourceAST)child; }
133             child = child.getNextSibling();
134         }
135         return null;
136     }
137 
138 }