View Javadoc

1   package org.codehaus.groovy.antlr.java;
2   
3   import org.codehaus.groovy.antlr.GroovySourceAST;
4   import org.codehaus.groovy.antlr.parser.GroovyTokenTypes;
5   import org.codehaus.groovy.antlr.treewalker.VisitorAdapter;
6   
7   public class Java2GroovyConverter extends VisitorAdapter{
8       private String[] tokenNames;
9       private int[] typeMapping;
10      
11  	public Java2GroovyConverter(String[] tokenNames) {
12  		this.tokenNames = tokenNames;
13  		typeMapping = new int[400]; // magic number, much greater than current number of java tokens
14  		typeMapping[JavaTokenTypes.ABSTRACT] = GroovyTokenTypes.ABSTRACT;
15  		
16  		typeMapping[JavaTokenTypes.EOF] = GroovyTokenTypes.EOF;
17  		typeMapping[JavaTokenTypes.NULL_TREE_LOOKAHEAD] = GroovyTokenTypes.NULL_TREE_LOOKAHEAD;
18  		typeMapping[JavaTokenTypes.BLOCK] = GroovyTokenTypes.BLOCK;
19  		typeMapping[JavaTokenTypes.MODIFIERS] = GroovyTokenTypes.MODIFIERS;
20  		typeMapping[JavaTokenTypes.OBJBLOCK] = GroovyTokenTypes.OBJBLOCK;
21  		typeMapping[JavaTokenTypes.SLIST] = GroovyTokenTypes.SLIST;
22  		typeMapping[JavaTokenTypes.METHOD_DEF] = GroovyTokenTypes.METHOD_DEF;
23  		typeMapping[JavaTokenTypes.VARIABLE_DEF] = GroovyTokenTypes.VARIABLE_DEF;
24  		typeMapping[JavaTokenTypes.INSTANCE_INIT] = GroovyTokenTypes.INSTANCE_INIT;
25  		typeMapping[JavaTokenTypes.STATIC_INIT] = GroovyTokenTypes.STATIC_INIT;
26  		typeMapping[JavaTokenTypes.TYPE] = GroovyTokenTypes.TYPE;
27  		typeMapping[JavaTokenTypes.CLASS_DEF] = GroovyTokenTypes.CLASS_DEF;
28  		typeMapping[JavaTokenTypes.INTERFACE_DEF] = GroovyTokenTypes.INTERFACE_DEF;
29  		typeMapping[JavaTokenTypes.PACKAGE_DEF] = GroovyTokenTypes.PACKAGE_DEF;
30  		typeMapping[JavaTokenTypes.ARRAY_DECLARATOR] = GroovyTokenTypes.ARRAY_DECLARATOR;
31  		typeMapping[JavaTokenTypes.EXTENDS_CLAUSE] = GroovyTokenTypes.EXTENDS_CLAUSE;
32  		typeMapping[JavaTokenTypes.IMPLEMENTS_CLAUSE] = GroovyTokenTypes.IMPLEMENTS_CLAUSE;
33  		typeMapping[JavaTokenTypes.PARAMETERS] = GroovyTokenTypes.PARAMETERS;
34  		typeMapping[JavaTokenTypes.PARAMETER_DEF] = GroovyTokenTypes.PARAMETER_DEF;
35  		typeMapping[JavaTokenTypes.LABELED_STAT] = GroovyTokenTypes.LABELED_STAT;
36  		typeMapping[JavaTokenTypes.TYPECAST] = GroovyTokenTypes.TYPECAST;
37  		typeMapping[JavaTokenTypes.INDEX_OP] = GroovyTokenTypes.INDEX_OP;
38  		typeMapping[JavaTokenTypes.POST_INC] = GroovyTokenTypes.POST_INC;
39  		typeMapping[JavaTokenTypes.POST_DEC] = GroovyTokenTypes.POST_DEC;
40  		typeMapping[JavaTokenTypes.METHOD_CALL] = GroovyTokenTypes.METHOD_CALL;
41  		typeMapping[JavaTokenTypes.EXPR] = GroovyTokenTypes.EXPR;
42  //		typeMapping[JavaTokenTypes.ARRAY_INIT] = GroovyTokenTypes.ARRAY_INIT;
43  		typeMapping[JavaTokenTypes.IMPORT] = GroovyTokenTypes.IMPORT;
44  		typeMapping[JavaTokenTypes.UNARY_MINUS] = GroovyTokenTypes.UNARY_MINUS;
45  		typeMapping[JavaTokenTypes.UNARY_PLUS] = GroovyTokenTypes.UNARY_PLUS;
46  		typeMapping[JavaTokenTypes.CASE_GROUP] = GroovyTokenTypes.CASE_GROUP;
47  		typeMapping[JavaTokenTypes.ELIST] = GroovyTokenTypes.ELIST;
48  		typeMapping[JavaTokenTypes.FOR_INIT] = GroovyTokenTypes.FOR_INIT;
49  		typeMapping[JavaTokenTypes.FOR_CONDITION] = GroovyTokenTypes.FOR_CONDITION;
50  		typeMapping[JavaTokenTypes.FOR_ITERATOR] = GroovyTokenTypes.FOR_ITERATOR;
51  		typeMapping[JavaTokenTypes.EMPTY_STAT] = GroovyTokenTypes.EMPTY_STAT;
52  		typeMapping[JavaTokenTypes.FINAL] = GroovyTokenTypes.FINAL;
53  		typeMapping[JavaTokenTypes.ABSTRACT] = GroovyTokenTypes.ABSTRACT;
54  		typeMapping[JavaTokenTypes.STRICTFP] = GroovyTokenTypes.STRICTFP;
55  		typeMapping[JavaTokenTypes.SUPER_CTOR_CALL] = GroovyTokenTypes.SUPER_CTOR_CALL;
56  		typeMapping[JavaTokenTypes.CTOR_CALL] = GroovyTokenTypes.CTOR_CALL;
57  		typeMapping[JavaTokenTypes.VARIABLE_PARAMETER_DEF] = GroovyTokenTypes.VARIABLE_PARAMETER_DEF;
58  		typeMapping[JavaTokenTypes.STATIC_IMPORT] = GroovyTokenTypes.STATIC_IMPORT;
59  		typeMapping[JavaTokenTypes.ENUM_DEF] = GroovyTokenTypes.ENUM_DEF;
60  		typeMapping[JavaTokenTypes.ENUM_CONSTANT_DEF] = GroovyTokenTypes.ENUM_CONSTANT_DEF;
61  		typeMapping[JavaTokenTypes.FOR_EACH_CLAUSE] = GroovyTokenTypes.FOR_EACH_CLAUSE;
62  		typeMapping[JavaTokenTypes.ANNOTATION_DEF] = GroovyTokenTypes.ANNOTATION_DEF;
63  		typeMapping[JavaTokenTypes.ANNOTATIONS] = GroovyTokenTypes.ANNOTATIONS;
64  		typeMapping[JavaTokenTypes.ANNOTATION] = GroovyTokenTypes.ANNOTATION;
65  		typeMapping[JavaTokenTypes.ANNOTATION_MEMBER_VALUE_PAIR] = GroovyTokenTypes.ANNOTATION_MEMBER_VALUE_PAIR;
66  		typeMapping[JavaTokenTypes.ANNOTATION_FIELD_DEF] = GroovyTokenTypes.ANNOTATION_FIELD_DEF;
67  		typeMapping[JavaTokenTypes.ANNOTATION_ARRAY_INIT] = GroovyTokenTypes.ANNOTATION_ARRAY_INIT;
68  		typeMapping[JavaTokenTypes.TYPE_ARGUMENTS] = GroovyTokenTypes.TYPE_ARGUMENTS;
69  		typeMapping[JavaTokenTypes.TYPE_ARGUMENT] = GroovyTokenTypes.TYPE_ARGUMENT;
70  		typeMapping[JavaTokenTypes.TYPE_PARAMETERS] = GroovyTokenTypes.TYPE_PARAMETERS;
71  		typeMapping[JavaTokenTypes.TYPE_PARAMETER] = GroovyTokenTypes.TYPE_PARAMETER;
72  		typeMapping[JavaTokenTypes.WILDCARD_TYPE] = GroovyTokenTypes.WILDCARD_TYPE;
73  		typeMapping[JavaTokenTypes.TYPE_UPPER_BOUNDS] = GroovyTokenTypes.TYPE_UPPER_BOUNDS;
74  		typeMapping[JavaTokenTypes.TYPE_LOWER_BOUNDS] = GroovyTokenTypes.TYPE_LOWER_BOUNDS;
75  		typeMapping[JavaTokenTypes.LITERAL_package>] = GroovyTokenTypes.LITERAL_package;
76  		typeMapping[JavaTokenTypes.SEMI] = GroovyTokenTypes.SEMI;
77  		typeMapping[JavaTokenTypes.LITERAL_import] = GroovyTokenTypes.LITERAL_import;
78  		typeMapping[JavaTokenTypes.LITERAL_static] = GroovyTokenTypes.LITERAL_static;
79  		typeMapping[JavaTokenTypes.LBRACK] = GroovyTokenTypes.LBRACK;
80  		typeMapping[JavaTokenTypes.RBRACK] = GroovyTokenTypes.RBRACK;
81  		typeMapping[JavaTokenTypes.IDENT] = GroovyTokenTypes.IDENT;
82  		typeMapping[JavaTokenTypes.DOT] = GroovyTokenTypes.DOT;
83  		typeMapping[JavaTokenTypes.QUESTION] = GroovyTokenTypes.QUESTION;
84  		typeMapping[JavaTokenTypes.LITERAL_extends] = GroovyTokenTypes.LITERAL_extends;
85  		typeMapping[JavaTokenTypes.LITERAL_super] = GroovyTokenTypes.LITERAL_super;
86  		typeMapping[JavaTokenTypes.LT] = GroovyTokenTypes.LT;
87  		typeMapping[JavaTokenTypes.COMMA] = GroovyTokenTypes.COMMA;
88  		typeMapping[JavaTokenTypes.GT] = GroovyTokenTypes.GT;
89  		typeMapping[JavaTokenTypes.SR] = GroovyTokenTypes.SR;
90  		typeMapping[JavaTokenTypes.BSR] = GroovyTokenTypes.BSR;
91  		typeMapping[JavaTokenTypes.LITERAL_void] = GroovyTokenTypes.LITERAL_void;
92  		typeMapping[JavaTokenTypes.LITERAL_boolean] = GroovyTokenTypes.LITERAL_boolean;
93  		typeMapping[JavaTokenTypes.LITERAL_byte] = GroovyTokenTypes.LITERAL_byte;
94  		typeMapping[JavaTokenTypes.LITERAL_char] = GroovyTokenTypes.LITERAL_char;
95  		typeMapping[JavaTokenTypes.LITERAL_short] = GroovyTokenTypes.LITERAL_short;
96  		typeMapping[JavaTokenTypes.LITERAL_int] = GroovyTokenTypes.LITERAL_int;
97  		typeMapping[JavaTokenTypes.LITERAL_float] = GroovyTokenTypes.LITERAL_float;
98  		typeMapping[JavaTokenTypes.LITERAL_long] = GroovyTokenTypes.LITERAL_long;
99  		typeMapping[JavaTokenTypes.LITERAL_double] = GroovyTokenTypes.LITERAL_double;
100 		typeMapping[JavaTokenTypes.STAR] = GroovyTokenTypes.STAR;
101 		typeMapping[JavaTokenTypes.LITERAL_private] = GroovyTokenTypes.LITERAL_private;
102 		typeMapping[JavaTokenTypes.LITERAL_public] = GroovyTokenTypes.LITERAL_public;
103 		typeMapping[JavaTokenTypes.LITERAL_protected] = GroovyTokenTypes.LITERAL_protected;
104 		typeMapping[JavaTokenTypes.LITERAL_transient] = GroovyTokenTypes.LITERAL_transient;
105 		typeMapping[JavaTokenTypes.LITERAL_native] = GroovyTokenTypes.LITERAL_native;
106 		typeMapping[JavaTokenTypes.LITERAL_threadsafe] = GroovyTokenTypes.LITERAL_threadsafe;
107 		typeMapping[JavaTokenTypes.LITERAL_synchronized] = GroovyTokenTypes.LITERAL_synchronized;
108 		typeMapping[JavaTokenTypes.LITERAL_volatile] = GroovyTokenTypes.LITERAL_volatile;
109 		typeMapping[JavaTokenTypes.AT] = GroovyTokenTypes.AT;
110 		typeMapping[JavaTokenTypes.LPAREN] = GroovyTokenTypes.LPAREN;
111 		typeMapping[JavaTokenTypes.RPAREN] = GroovyTokenTypes.RPAREN;
112 		typeMapping[JavaTokenTypes.ASSIGN] = GroovyTokenTypes.ASSIGN;
113 		typeMapping[JavaTokenTypes.LCURLY] = GroovyTokenTypes.LCURLY;
114 		typeMapping[JavaTokenTypes.RCURLY] = GroovyTokenTypes.RCURLY;
115 		typeMapping[JavaTokenTypes.LITERAL_class] = GroovyTokenTypes.LITERAL_class;
116 		typeMapping[JavaTokenTypes.LITERAL_interface] = GroovyTokenTypes.LITERAL_interface;
117 		typeMapping[JavaTokenTypes.LITERAL_enum] = GroovyTokenTypes.LITERAL_enum;
118 		typeMapping[JavaTokenTypes.BAND] = GroovyTokenTypes.BAND;
119 		typeMapping[JavaTokenTypes.LITERAL_default] = GroovyTokenTypes.LITERAL_default;
120 		typeMapping[JavaTokenTypes.LITERAL_implements] = GroovyTokenTypes.LITERAL_implements;
121 		typeMapping[JavaTokenTypes.LITERAL_this] = GroovyTokenTypes.LITERAL_this;
122 		typeMapping[JavaTokenTypes.LITERAL_throws] = GroovyTokenTypes.LITERAL_throws;
123 		typeMapping[JavaTokenTypes.TRIPLE_DOT] = GroovyTokenTypes.TRIPLE_DOT;
124 		typeMapping[JavaTokenTypes.COLON] = GroovyTokenTypes.COLON;
125 		typeMapping[JavaTokenTypes.LITERAL_if] = GroovyTokenTypes.LITERAL_if;
126 		typeMapping[JavaTokenTypes.LITERAL_else] = GroovyTokenTypes.LITERAL_else;
127 		typeMapping[JavaTokenTypes.LITERAL_while] = GroovyTokenTypes.LITERAL_while;
128 		typeMapping[JavaTokenTypes.LITERAL_break] = GroovyTokenTypes.LITERAL_break;
129 		typeMapping[JavaTokenTypes.LITERAL_continue] = GroovyTokenTypes.LITERAL_continue;
130 		typeMapping[JavaTokenTypes.LITERAL_return] = GroovyTokenTypes.LITERAL_return;
131 		typeMapping[JavaTokenTypes.LITERAL_switch] = GroovyTokenTypes.LITERAL_switch;
132 		typeMapping[JavaTokenTypes.LITERAL_throw] = GroovyTokenTypes.LITERAL_throw;
133 		typeMapping[JavaTokenTypes.LITERAL_assert] = GroovyTokenTypes.LITERAL_assert;
134 		typeMapping[JavaTokenTypes.LITERAL_for] = GroovyTokenTypes.LITERAL_for;
135 		typeMapping[JavaTokenTypes.LITERAL_case] = GroovyTokenTypes.LITERAL_case;
136 		typeMapping[JavaTokenTypes.LITERAL_try] = GroovyTokenTypes.LITERAL_try;
137 		typeMapping[JavaTokenTypes.LITERAL_finally] = GroovyTokenTypes.LITERAL_finally;
138 		typeMapping[JavaTokenTypes.LITERAL_catch] = GroovyTokenTypes.LITERAL_catch;
139 		typeMapping[JavaTokenTypes.PLUS_ASSIGN] = GroovyTokenTypes.PLUS_ASSIGN;
140 		typeMapping[JavaTokenTypes.MINUS_ASSIGN] = GroovyTokenTypes.MINUS_ASSIGN;
141 		typeMapping[JavaTokenTypes.STAR_ASSIGN] = GroovyTokenTypes.STAR_ASSIGN;
142 		typeMapping[JavaTokenTypes.DIV_ASSIGN] = GroovyTokenTypes.DIV_ASSIGN;
143 		typeMapping[JavaTokenTypes.MOD_ASSIGN] = GroovyTokenTypes.MOD_ASSIGN;
144 		typeMapping[JavaTokenTypes.SR_ASSIGN] = GroovyTokenTypes.SR_ASSIGN;
145 		typeMapping[JavaTokenTypes.BSR_ASSIGN] = GroovyTokenTypes.BSR_ASSIGN;
146 		typeMapping[JavaTokenTypes.SL_ASSIGN] = GroovyTokenTypes.SL_ASSIGN;
147 		typeMapping[JavaTokenTypes.BAND_ASSIGN] = GroovyTokenTypes.BAND_ASSIGN;
148 		typeMapping[JavaTokenTypes.BXOR_ASSIGN] = GroovyTokenTypes.BXOR_ASSIGN;
149 		typeMapping[JavaTokenTypes.BOR_ASSIGN] = GroovyTokenTypes.BOR_ASSIGN;
150 		typeMapping[JavaTokenTypes.LOR] = GroovyTokenTypes.LOR;
151 		typeMapping[JavaTokenTypes.LAND] = GroovyTokenTypes.LAND;
152 		typeMapping[JavaTokenTypes.BOR] = GroovyTokenTypes.BOR;
153 		typeMapping[JavaTokenTypes.BXOR] = GroovyTokenTypes.BXOR;
154 		typeMapping[JavaTokenTypes.NOT_EQUAL] = GroovyTokenTypes.NOT_EQUAL;
155 		typeMapping[JavaTokenTypes.EQUAL] = GroovyTokenTypes.EQUAL;
156 		typeMapping[JavaTokenTypes.LE] = GroovyTokenTypes.LE;
157 		typeMapping[JavaTokenTypes.GE] = GroovyTokenTypes.GE;
158 		typeMapping[JavaTokenTypes.LITERAL_instanceof] = GroovyTokenTypes.LITERAL_instanceof;
159 		typeMapping[JavaTokenTypes.SL] = GroovyTokenTypes.SL;
160 		typeMapping[JavaTokenTypes.PLUS] = GroovyTokenTypes.PLUS;
161 		typeMapping[JavaTokenTypes.MINUS] = GroovyTokenTypes.MINUS;
162 		typeMapping[JavaTokenTypes.DIV] = GroovyTokenTypes.DIV;
163 		typeMapping[JavaTokenTypes.MOD] = GroovyTokenTypes.MOD;
164 		typeMapping[JavaTokenTypes.INC] = GroovyTokenTypes.INC;
165 		typeMapping[JavaTokenTypes.DEC] = GroovyTokenTypes.DEC;
166 		typeMapping[JavaTokenTypes.BNOT] = GroovyTokenTypes.BNOT;
167 		typeMapping[JavaTokenTypes.LNOT] = GroovyTokenTypes.LNOT;
168 		typeMapping[JavaTokenTypes.LITERAL_true] = GroovyTokenTypes.LITERAL_true;
169 		typeMapping[JavaTokenTypes.LITERAL_false] = GroovyTokenTypes.LITERAL_false;
170 		typeMapping[JavaTokenTypes.LITERAL_null] = GroovyTokenTypes.LITERAL_null;
171 		typeMapping[JavaTokenTypes.LITERAL_new] = GroovyTokenTypes.LITERAL_new;
172 		typeMapping[JavaTokenTypes.NUM_INT] = GroovyTokenTypes.NUM_INT;
173 		typeMapping[JavaTokenTypes.STRING_LITERAL] = GroovyTokenTypes.STRING_LITERAL;
174 		typeMapping[JavaTokenTypes.NUM_FLOAT] = GroovyTokenTypes.NUM_FLOAT;
175 		typeMapping[JavaTokenTypes.NUM_LONG] = GroovyTokenTypes.NUM_LONG;
176 		typeMapping[JavaTokenTypes.NUM_DOUBLE] = GroovyTokenTypes.NUM_DOUBLE;
177 		typeMapping[JavaTokenTypes.WS] = GroovyTokenTypes.WS;
178 		typeMapping[JavaTokenTypes.SL_COMMENT] = GroovyTokenTypes.SL_COMMENT;
179 		typeMapping[JavaTokenTypes.ML_COMMENT] = GroovyTokenTypes.ML_COMMENT;
180 		typeMapping[JavaTokenTypes.ESC] = GroovyTokenTypes.ESC;
181 		typeMapping[JavaTokenTypes.HEX_DIGIT] = GroovyTokenTypes.HEX_DIGIT;
182 		typeMapping[JavaTokenTypes.VOCAB] = GroovyTokenTypes.VOCAB;
183 		typeMapping[JavaTokenTypes.EXPONENT] = GroovyTokenTypes.EXPONENT;
184 		typeMapping[JavaTokenTypes.FLOAT_SUFFIX] = GroovyTokenTypes.FLOAT_SUFFIX;
185 	}
186 	
187     public void visitDefault(GroovySourceAST t,int visit) {
188         if (visit == OPENING_VISIT) {
189             // only want to do this once per node...
190         	t.setType(typeMapping[t.getType()]);
191            	// ----
192 
193         	// need to remove double quotes in string literals
194         	// as groovy AST doesn't expect to have them
195         	if (t.getType() == GroovyTokenTypes.STRING_LITERAL) {
196         		String text = t.getText();
197         		if (isDoubleQuoted(text)) {
198         			t.setText(text.substring(1, text.length() - 1)); // chop off the double quotes at start and end
199         		}
200         	}
201         }
202     }
203 
204 	private boolean isDoubleQuoted(String text) {
205 		return text != null && text.length() > 2 
206 				&& text.charAt(0) == '"' 
207 				&& text.charAt(text.length() - 1) == '"';
208 	}
209 }