001 package org.codehaus.groovy.antlr; 002 003 import antlr.collections.AST; 004 import antlr.*; 005 006 import java.util.List; 007 import java.util.ArrayList; 008 009 /** 010 * We have an AST subclass so we can track source information. 011 * Very odd that ANTLR doesn't do this by default. 012 * 013 * @author Mike Spille 014 * @author Jeremy Rayner <groovy@ross-rayner.com> 015 */ 016 public class GroovySourceAST extends CommonAST implements Comparable { 017 private int line; 018 private int col; 019 private int lineLast; 020 private int colLast; 021 private String snippet; 022 023 public GroovySourceAST() { 024 } 025 026 public GroovySourceAST(Token t) { 027 super(t); 028 } 029 030 public void initialize(AST ast) { 031 super.initialize(ast); 032 line = ast.getLine(); 033 col = ast.getColumn(); 034 } 035 036 public void initialize(Token t) { 037 super.initialize(t); 038 line = t.getLine(); 039 col = t.getColumn(); 040 } 041 042 public void setLast(Token last) { 043 lineLast = last.getLine(); 044 colLast = last.getColumn(); 045 } 046 047 public int getLineLast() { 048 return lineLast; 049 } 050 051 public void setLineLast(int lineLast) { 052 this.lineLast = lineLast; 053 } 054 055 public int getColumnLast() { 056 return colLast; 057 } 058 059 public void setColumnLast(int colLast) { 060 this.colLast = colLast; 061 } 062 063 public void setLine(int line) { 064 this.line = line; 065 } 066 067 public int getLine() { 068 return (line); 069 } 070 071 public void setColumn(int column) { 072 this.col = column; 073 } 074 075 public int getColumn() { 076 return (col); 077 } 078 079 public void setSnippet(String snippet) { 080 this.snippet = snippet; 081 } 082 083 public String getSnippet() { 084 return snippet; 085 } 086 087 public int compareTo(Object object) { 088 if (object == null) { 089 return 0; 090 } 091 if (!(object instanceof AST)) { 092 return 0; 093 } 094 AST that = (AST) object; 095 096 // todo - possibly check for line/col with values of 0 or less... 097 098 if (this.getLine() < that.getLine()) { 099 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 }