54 return instance; |
57 return instance; |
55 } |
58 } |
56 |
59 |
57 /** The names of all operators. |
60 /** The names of all operators. |
58 */ |
61 */ |
59 private Name[] opname = new Name[JCTree.MOD - JCTree.POS + 1]; |
62 private Name[] opname = new Name[Tag.getNumberOfOperators()]; |
|
63 |
|
64 private void setOpname(Tag tag, String name, Names names) { |
|
65 setOpname(tag, names.fromString(name)); |
|
66 } |
|
67 private void setOpname(Tag tag, Name name) { |
|
68 opname[tag.operatorIndex()] = name; |
|
69 } |
60 |
70 |
61 private TreeInfo(Context context) { |
71 private TreeInfo(Context context) { |
62 context.put(treeInfoKey, this); |
72 context.put(treeInfoKey, this); |
63 |
73 |
64 Names names = Names.instance(context); |
74 Names names = Names.instance(context); |
65 opname[JCTree.POS - JCTree.POS] = names.fromString("+"); |
75 setOpname(POS, "+", names); |
66 opname[JCTree.NEG - JCTree.POS] = names.hyphen; |
76 setOpname(NEG, names.hyphen); |
67 opname[JCTree.NOT - JCTree.POS] = names.fromString("!"); |
77 setOpname(NOT, "!", names); |
68 opname[JCTree.COMPL - JCTree.POS] = names.fromString("~"); |
78 setOpname(COMPL, "~", names); |
69 opname[JCTree.PREINC - JCTree.POS] = names.fromString("++"); |
79 setOpname(PREINC, "++", names); |
70 opname[JCTree.PREDEC - JCTree.POS] = names.fromString("--"); |
80 setOpname(PREDEC, "--", names); |
71 opname[JCTree.POSTINC - JCTree.POS] = names.fromString("++"); |
81 setOpname(POSTINC, "++", names); |
72 opname[JCTree.POSTDEC - JCTree.POS] = names.fromString("--"); |
82 setOpname(POSTDEC, "--", names); |
73 opname[JCTree.NULLCHK - JCTree.POS] = names.fromString("<*nullchk*>"); |
83 setOpname(NULLCHK, "<*nullchk*>", names); |
74 opname[JCTree.OR - JCTree.POS] = names.fromString("||"); |
84 setOpname(OR, "||", names); |
75 opname[JCTree.AND - JCTree.POS] = names.fromString("&&"); |
85 setOpname(AND, "&&", names); |
76 opname[JCTree.EQ - JCTree.POS] = names.fromString("=="); |
86 setOpname(EQ, "==", names); |
77 opname[JCTree.NE - JCTree.POS] = names.fromString("!="); |
87 setOpname(NE, "!=", names); |
78 opname[JCTree.LT - JCTree.POS] = names.fromString("<"); |
88 setOpname(LT, "<", names); |
79 opname[JCTree.GT - JCTree.POS] = names.fromString(">"); |
89 setOpname(GT, ">", names); |
80 opname[JCTree.LE - JCTree.POS] = names.fromString("<="); |
90 setOpname(LE, "<=", names); |
81 opname[JCTree.GE - JCTree.POS] = names.fromString(">="); |
91 setOpname(GE, ">=", names); |
82 opname[JCTree.BITOR - JCTree.POS] = names.fromString("|"); |
92 setOpname(BITOR, "|", names); |
83 opname[JCTree.BITXOR - JCTree.POS] = names.fromString("^"); |
93 setOpname(BITXOR, "^", names); |
84 opname[JCTree.BITAND - JCTree.POS] = names.fromString("&"); |
94 setOpname(BITAND, "&", names); |
85 opname[JCTree.SL - JCTree.POS] = names.fromString("<<"); |
95 setOpname(SL, "<<", names); |
86 opname[JCTree.SR - JCTree.POS] = names.fromString(">>"); |
96 setOpname(SR, ">>", names); |
87 opname[JCTree.USR - JCTree.POS] = names.fromString(">>>"); |
97 setOpname(USR, ">>>", names); |
88 opname[JCTree.PLUS - JCTree.POS] = names.fromString("+"); |
98 setOpname(PLUS, "+", names); |
89 opname[JCTree.MINUS - JCTree.POS] = names.hyphen; |
99 setOpname(MINUS, names.hyphen); |
90 opname[JCTree.MUL - JCTree.POS] = names.asterisk; |
100 setOpname(MUL, names.asterisk); |
91 opname[JCTree.DIV - JCTree.POS] = names.slash; |
101 setOpname(DIV, names.slash); |
92 opname[JCTree.MOD - JCTree.POS] = names.fromString("%"); |
102 setOpname(MOD, "%", names); |
93 } |
103 } |
94 |
104 |
95 |
105 |
96 /** Return name of operator with given tree tag. |
106 /** Return name of operator with given tree tag. |
97 */ |
107 */ |
98 public Name operatorName(int tag) { |
108 public Name operatorName(JCTree.Tag tag) { |
99 return opname[tag - JCTree.POS]; |
109 return opname[tag.operatorIndex()]; |
100 } |
110 } |
101 |
111 |
102 /** Is tree a constructor declaration? |
112 /** Is tree a constructor declaration? |
103 */ |
113 */ |
104 public static boolean isConstructor(JCTree tree) { |
114 public static boolean isConstructor(JCTree tree) { |
105 if (tree.getTag() == JCTree.METHODDEF) { |
115 if (tree.hasTag(METHODDEF)) { |
106 Name name = ((JCMethodDecl) tree).name; |
116 Name name = ((JCMethodDecl) tree).name; |
107 return name == name.table.names.init; |
117 return name == name.table.names.init; |
108 } else { |
118 } else { |
109 return false; |
119 return false; |
110 } |
120 } |
190 return meth == null || meth != meth.table.names._this; |
200 return meth == null || meth != meth.table.names._this; |
191 } |
201 } |
192 |
202 |
193 /** Return the first call in a constructor definition. */ |
203 /** Return the first call in a constructor definition. */ |
194 public static JCMethodInvocation firstConstructorCall(JCTree tree) { |
204 public static JCMethodInvocation firstConstructorCall(JCTree tree) { |
195 if (tree.getTag() != JCTree.METHODDEF) return null; |
205 if (!tree.hasTag(METHODDEF)) return null; |
196 JCMethodDecl md = (JCMethodDecl) tree; |
206 JCMethodDecl md = (JCMethodDecl) tree; |
197 Names names = md.name.table.names; |
207 Names names = md.name.table.names; |
198 if (md.name != names.init) return null; |
208 if (md.name != names.init) return null; |
199 if (md.body == null) return null; |
209 if (md.body == null) return null; |
200 List<JCStatement> stats = md.body.stats; |
210 List<JCStatement> stats = md.body.stats; |
201 // Synthetic initializations can appear before the super call. |
211 // Synthetic initializations can appear before the super call. |
202 while (stats.nonEmpty() && isSyntheticInit(stats.head)) |
212 while (stats.nonEmpty() && isSyntheticInit(stats.head)) |
203 stats = stats.tail; |
213 stats = stats.tail; |
204 if (stats.isEmpty()) return null; |
214 if (stats.isEmpty()) return null; |
205 if (stats.head.getTag() != JCTree.EXEC) return null; |
215 if (!stats.head.hasTag(EXEC)) return null; |
206 JCExpressionStatement exec = (JCExpressionStatement) stats.head; |
216 JCExpressionStatement exec = (JCExpressionStatement) stats.head; |
207 if (exec.expr.getTag() != JCTree.APPLY) return null; |
217 if (!exec.expr.hasTag(APPLY)) return null; |
208 return (JCMethodInvocation)exec.expr; |
218 return (JCMethodInvocation)exec.expr; |
209 } |
219 } |
210 |
220 |
211 /** Return true if a tree represents a diamond new expr. */ |
221 /** Return true if a tree represents a diamond new expr. */ |
212 public static boolean isDiamond(JCTree tree) { |
222 public static boolean isDiamond(JCTree tree) { |
213 switch(tree.getTag()) { |
223 switch(tree.getTag()) { |
214 case JCTree.TYPEAPPLY: return ((JCTypeApply)tree).getTypeArguments().isEmpty(); |
224 case TYPEAPPLY: return ((JCTypeApply)tree).getTypeArguments().isEmpty(); |
215 case JCTree.NEWCLASS: return isDiamond(((JCNewClass)tree).clazz); |
225 case NEWCLASS: return isDiamond(((JCNewClass)tree).clazz); |
216 default: return false; |
226 default: return false; |
217 } |
227 } |
218 } |
228 } |
219 |
229 |
220 /** Return true if a tree represents the null literal. */ |
230 /** Return true if a tree represents the null literal. */ |
221 public static boolean isNull(JCTree tree) { |
231 public static boolean isNull(JCTree tree) { |
222 if (tree.getTag() != JCTree.LITERAL) |
232 if (!tree.hasTag(LITERAL)) |
223 return false; |
233 return false; |
224 JCLiteral lit = (JCLiteral) tree; |
234 JCLiteral lit = (JCLiteral) tree; |
225 return (lit.typetag == TypeTags.BOT); |
235 return (lit.typetag == TypeTags.BOT); |
226 } |
236 } |
227 |
237 |
228 /** The position of the first statement in a block, or the position of |
238 /** The position of the first statement in a block, or the position of |
229 * the block itself if it is empty. |
239 * the block itself if it is empty. |
230 */ |
240 */ |
231 public static int firstStatPos(JCTree tree) { |
241 public static int firstStatPos(JCTree tree) { |
232 if (tree.getTag() == JCTree.BLOCK && ((JCBlock) tree).stats.nonEmpty()) |
242 if (tree.hasTag(BLOCK) && ((JCBlock) tree).stats.nonEmpty()) |
233 return ((JCBlock) tree).stats.head.pos; |
243 return ((JCBlock) tree).stats.head.pos; |
234 else |
244 else |
235 return tree.pos; |
245 return tree.pos; |
236 } |
246 } |
237 |
247 |
238 /** The end position of given tree, if it is a block with |
248 /** The end position of given tree, if it is a block with |
239 * defined endpos. |
249 * defined endpos. |
240 */ |
250 */ |
241 public static int endPos(JCTree tree) { |
251 public static int endPos(JCTree tree) { |
242 if (tree.getTag() == JCTree.BLOCK && ((JCBlock) tree).endpos != Position.NOPOS) |
252 if (tree.hasTag(BLOCK) && ((JCBlock) tree).endpos != Position.NOPOS) |
243 return ((JCBlock) tree).endpos; |
253 return ((JCBlock) tree).endpos; |
244 else if (tree.getTag() == JCTree.SYNCHRONIZED) |
254 else if (tree.hasTag(SYNCHRONIZED)) |
245 return endPos(((JCSynchronized) tree).body); |
255 return endPos(((JCSynchronized) tree).body); |
246 else if (tree.getTag() == JCTree.TRY) { |
256 else if (tree.hasTag(TRY)) { |
247 JCTry t = (JCTry) tree; |
257 JCTry t = (JCTry) tree; |
248 return endPos((t.finalizer != null) |
258 return endPos((t.finalizer != null) |
249 ? t.finalizer |
259 ? t.finalizer |
250 : t.catchers.last().body); |
260 : t.catchers.last().body); |
251 } else |
261 } else |
261 public static int getStartPos(JCTree tree) { |
271 public static int getStartPos(JCTree tree) { |
262 if (tree == null) |
272 if (tree == null) |
263 return Position.NOPOS; |
273 return Position.NOPOS; |
264 |
274 |
265 switch(tree.getTag()) { |
275 switch(tree.getTag()) { |
266 case(JCTree.APPLY): |
276 case APPLY: |
267 return getStartPos(((JCMethodInvocation) tree).meth); |
277 return getStartPos(((JCMethodInvocation) tree).meth); |
268 case(JCTree.ASSIGN): |
278 case ASSIGN: |
269 return getStartPos(((JCAssign) tree).lhs); |
279 return getStartPos(((JCAssign) tree).lhs); |
270 case(JCTree.BITOR_ASG): case(JCTree.BITXOR_ASG): case(JCTree.BITAND_ASG): |
280 case BITOR_ASG: case BITXOR_ASG: case BITAND_ASG: |
271 case(JCTree.SL_ASG): case(JCTree.SR_ASG): case(JCTree.USR_ASG): |
281 case SL_ASG: case SR_ASG: case USR_ASG: |
272 case(JCTree.PLUS_ASG): case(JCTree.MINUS_ASG): case(JCTree.MUL_ASG): |
282 case PLUS_ASG: case MINUS_ASG: case MUL_ASG: |
273 case(JCTree.DIV_ASG): case(JCTree.MOD_ASG): |
283 case DIV_ASG: case MOD_ASG: |
274 return getStartPos(((JCAssignOp) tree).lhs); |
284 return getStartPos(((JCAssignOp) tree).lhs); |
275 case(JCTree.OR): case(JCTree.AND): case(JCTree.BITOR): |
285 case OR: case AND: case BITOR: |
276 case(JCTree.BITXOR): case(JCTree.BITAND): case(JCTree.EQ): |
286 case BITXOR: case BITAND: case EQ: |
277 case(JCTree.NE): case(JCTree.LT): case(JCTree.GT): |
287 case NE: case LT: case GT: |
278 case(JCTree.LE): case(JCTree.GE): case(JCTree.SL): |
288 case LE: case GE: case SL: |
279 case(JCTree.SR): case(JCTree.USR): case(JCTree.PLUS): |
289 case SR: case USR: case PLUS: |
280 case(JCTree.MINUS): case(JCTree.MUL): case(JCTree.DIV): |
290 case MINUS: case MUL: case DIV: |
281 case(JCTree.MOD): |
291 case MOD: |
282 return getStartPos(((JCBinary) tree).lhs); |
292 return getStartPos(((JCBinary) tree).lhs); |
283 case(JCTree.CLASSDEF): { |
293 case CLASSDEF: { |
284 JCClassDecl node = (JCClassDecl)tree; |
294 JCClassDecl node = (JCClassDecl)tree; |
285 if (node.mods.pos != Position.NOPOS) |
295 if (node.mods.pos != Position.NOPOS) |
286 return node.mods.pos; |
296 return node.mods.pos; |
287 break; |
297 break; |
288 } |
298 } |
289 case(JCTree.CONDEXPR): |
299 case CONDEXPR: |
290 return getStartPos(((JCConditional) tree).cond); |
300 return getStartPos(((JCConditional) tree).cond); |
291 case(JCTree.EXEC): |
301 case EXEC: |
292 return getStartPos(((JCExpressionStatement) tree).expr); |
302 return getStartPos(((JCExpressionStatement) tree).expr); |
293 case(JCTree.INDEXED): |
303 case INDEXED: |
294 return getStartPos(((JCArrayAccess) tree).indexed); |
304 return getStartPos(((JCArrayAccess) tree).indexed); |
295 case(JCTree.METHODDEF): { |
305 case METHODDEF: { |
296 JCMethodDecl node = (JCMethodDecl)tree; |
306 JCMethodDecl node = (JCMethodDecl)tree; |
297 if (node.mods.pos != Position.NOPOS) |
307 if (node.mods.pos != Position.NOPOS) |
298 return node.mods.pos; |
308 return node.mods.pos; |
299 if (node.typarams.nonEmpty()) // List.nil() used for no typarams |
309 if (node.typarams.nonEmpty()) // List.nil() used for no typarams |
300 return getStartPos(node.typarams.head); |
310 return getStartPos(node.typarams.head); |
301 return node.restype == null ? node.pos : getStartPos(node.restype); |
311 return node.restype == null ? node.pos : getStartPos(node.restype); |
302 } |
312 } |
303 case(JCTree.SELECT): |
313 case SELECT: |
304 return getStartPos(((JCFieldAccess) tree).selected); |
314 return getStartPos(((JCFieldAccess) tree).selected); |
305 case(JCTree.TYPEAPPLY): |
315 case TYPEAPPLY: |
306 return getStartPos(((JCTypeApply) tree).clazz); |
316 return getStartPos(((JCTypeApply) tree).clazz); |
307 case(JCTree.TYPEARRAY): |
317 case TYPEARRAY: |
308 return getStartPos(((JCArrayTypeTree) tree).elemtype); |
318 return getStartPos(((JCArrayTypeTree) tree).elemtype); |
309 case(JCTree.TYPETEST): |
319 case TYPETEST: |
310 return getStartPos(((JCInstanceOf) tree).expr); |
320 return getStartPos(((JCInstanceOf) tree).expr); |
311 case(JCTree.POSTINC): |
321 case POSTINC: |
312 case(JCTree.POSTDEC): |
322 case POSTDEC: |
313 return getStartPos(((JCUnary) tree).arg); |
323 return getStartPos(((JCUnary) tree).arg); |
314 case(JCTree.NEWCLASS): { |
324 case NEWCLASS: { |
315 JCNewClass node = (JCNewClass)tree; |
325 JCNewClass node = (JCNewClass)tree; |
316 if (node.encl != null) |
326 if (node.encl != null) |
317 return getStartPos(node.encl); |
327 return getStartPos(node.encl); |
318 break; |
328 break; |
319 } |
329 } |
320 case(JCTree.VARDEF): { |
330 case VARDEF: { |
321 JCVariableDecl node = (JCVariableDecl)tree; |
331 JCVariableDecl node = (JCVariableDecl)tree; |
322 if (node.mods.pos != Position.NOPOS) { |
332 if (node.mods.pos != Position.NOPOS) { |
323 return node.mods.pos; |
333 return node.mods.pos; |
324 } else { |
334 } else { |
325 return getStartPos(node.vartype); |
335 return getStartPos(node.vartype); |
326 } |
336 } |
327 } |
337 } |
328 case(JCTree.ERRONEOUS): { |
338 case ERRONEOUS: { |
329 JCErroneous node = (JCErroneous)tree; |
339 JCErroneous node = (JCErroneous)tree; |
330 if (node.errs != null && node.errs.nonEmpty()) |
340 if (node.errs != null && node.errs.nonEmpty()) |
331 return getStartPos(node.errs.head); |
341 return getStartPos(node.errs.head); |
332 } |
342 } |
333 } |
343 } |
334 return tree.pos; |
344 return tree.pos; |
335 } |
345 } |
336 |
346 |
337 /** The end position of given tree, given a table of end positions generated by the parser |
347 /** The end position of given tree, given a table of end positions generated by the parser |
348 Integer mapPos = endPositions.get(tree); |
358 Integer mapPos = endPositions.get(tree); |
349 if (mapPos != null) |
359 if (mapPos != null) |
350 return mapPos; |
360 return mapPos; |
351 |
361 |
352 switch(tree.getTag()) { |
362 switch(tree.getTag()) { |
353 case(JCTree.BITOR_ASG): case(JCTree.BITXOR_ASG): case(JCTree.BITAND_ASG): |
363 case BITOR_ASG: case BITXOR_ASG: case BITAND_ASG: |
354 case(JCTree.SL_ASG): case(JCTree.SR_ASG): case(JCTree.USR_ASG): |
364 case SL_ASG: case SR_ASG: case USR_ASG: |
355 case(JCTree.PLUS_ASG): case(JCTree.MINUS_ASG): case(JCTree.MUL_ASG): |
365 case PLUS_ASG: case MINUS_ASG: case MUL_ASG: |
356 case(JCTree.DIV_ASG): case(JCTree.MOD_ASG): |
366 case DIV_ASG: case MOD_ASG: |
357 return getEndPos(((JCAssignOp) tree).rhs, endPositions); |
367 return getEndPos(((JCAssignOp) tree).rhs, endPositions); |
358 case(JCTree.OR): case(JCTree.AND): case(JCTree.BITOR): |
368 case OR: case AND: case BITOR: |
359 case(JCTree.BITXOR): case(JCTree.BITAND): case(JCTree.EQ): |
369 case BITXOR: case BITAND: case EQ: |
360 case(JCTree.NE): case(JCTree.LT): case(JCTree.GT): |
370 case NE: case LT: case GT: |
361 case(JCTree.LE): case(JCTree.GE): case(JCTree.SL): |
371 case LE: case GE: case SL: |
362 case(JCTree.SR): case(JCTree.USR): case(JCTree.PLUS): |
372 case SR: case USR: case PLUS: |
363 case(JCTree.MINUS): case(JCTree.MUL): case(JCTree.DIV): |
373 case MINUS: case MUL: case DIV: |
364 case(JCTree.MOD): |
374 case MOD: |
365 return getEndPos(((JCBinary) tree).rhs, endPositions); |
375 return getEndPos(((JCBinary) tree).rhs, endPositions); |
366 case(JCTree.CASE): |
376 case CASE: |
367 return getEndPos(((JCCase) tree).stats.last(), endPositions); |
377 return getEndPos(((JCCase) tree).stats.last(), endPositions); |
368 case(JCTree.CATCH): |
378 case CATCH: |
369 return getEndPos(((JCCatch) tree).body, endPositions); |
379 return getEndPos(((JCCatch) tree).body, endPositions); |
370 case(JCTree.CONDEXPR): |
380 case CONDEXPR: |
371 return getEndPos(((JCConditional) tree).falsepart, endPositions); |
381 return getEndPos(((JCConditional) tree).falsepart, endPositions); |
372 case(JCTree.FORLOOP): |
382 case FORLOOP: |
373 return getEndPos(((JCForLoop) tree).body, endPositions); |
383 return getEndPos(((JCForLoop) tree).body, endPositions); |
374 case(JCTree.FOREACHLOOP): |
384 case FOREACHLOOP: |
375 return getEndPos(((JCEnhancedForLoop) tree).body, endPositions); |
385 return getEndPos(((JCEnhancedForLoop) tree).body, endPositions); |
376 case(JCTree.IF): { |
386 case IF: { |
377 JCIf node = (JCIf)tree; |
387 JCIf node = (JCIf)tree; |
378 if (node.elsepart == null) { |
388 if (node.elsepart == null) { |
379 return getEndPos(node.thenpart, endPositions); |
389 return getEndPos(node.thenpart, endPositions); |
380 } else { |
390 } else { |
381 return getEndPos(node.elsepart, endPositions); |
391 return getEndPos(node.elsepart, endPositions); |
382 } |
392 } |
383 } |
393 } |
384 case(JCTree.LABELLED): |
394 case LABELLED: |
385 return getEndPos(((JCLabeledStatement) tree).body, endPositions); |
395 return getEndPos(((JCLabeledStatement) tree).body, endPositions); |
386 case(JCTree.MODIFIERS): |
396 case MODIFIERS: |
387 return getEndPos(((JCModifiers) tree).annotations.last(), endPositions); |
397 return getEndPos(((JCModifiers) tree).annotations.last(), endPositions); |
388 case(JCTree.SYNCHRONIZED): |
398 case SYNCHRONIZED: |
389 return getEndPos(((JCSynchronized) tree).body, endPositions); |
399 return getEndPos(((JCSynchronized) tree).body, endPositions); |
390 case(JCTree.TOPLEVEL): |
400 case TOPLEVEL: |
391 return getEndPos(((JCCompilationUnit) tree).defs.last(), endPositions); |
401 return getEndPos(((JCCompilationUnit) tree).defs.last(), endPositions); |
392 case(JCTree.TRY): { |
402 case TRY: { |
393 JCTry node = (JCTry)tree; |
403 JCTry node = (JCTry)tree; |
394 if (node.finalizer != null) { |
404 if (node.finalizer != null) { |
395 return getEndPos(node.finalizer, endPositions); |
405 return getEndPos(node.finalizer, endPositions); |
396 } else if (!node.catchers.isEmpty()) { |
406 } else if (!node.catchers.isEmpty()) { |
397 return getEndPos(node.catchers.last(), endPositions); |
407 return getEndPos(node.catchers.last(), endPositions); |
398 } else { |
408 } else { |
399 return getEndPos(node.body, endPositions); |
409 return getEndPos(node.body, endPositions); |
400 } |
410 } |
401 } |
411 } |
402 case(JCTree.WILDCARD): |
412 case WILDCARD: |
403 return getEndPos(((JCWildcard) tree).inner, endPositions); |
413 return getEndPos(((JCWildcard) tree).inner, endPositions); |
404 case(JCTree.TYPECAST): |
414 case TYPECAST: |
405 return getEndPos(((JCTypeCast) tree).expr, endPositions); |
415 return getEndPos(((JCTypeCast) tree).expr, endPositions); |
406 case(JCTree.TYPETEST): |
416 case TYPETEST: |
407 return getEndPos(((JCInstanceOf) tree).clazz, endPositions); |
417 return getEndPos(((JCInstanceOf) tree).clazz, endPositions); |
408 case(JCTree.POS): |
418 case POS: |
409 case(JCTree.NEG): |
419 case NEG: |
410 case(JCTree.NOT): |
420 case NOT: |
411 case(JCTree.COMPL): |
421 case COMPL: |
412 case(JCTree.PREINC): |
422 case PREINC: |
413 case(JCTree.PREDEC): |
423 case PREDEC: |
414 return getEndPos(((JCUnary) tree).arg, endPositions); |
424 return getEndPos(((JCUnary) tree).arg, endPositions); |
415 case(JCTree.WHILELOOP): |
425 case WHILELOOP: |
416 return getEndPos(((JCWhileLoop) tree).body, endPositions); |
426 return getEndPos(((JCWhileLoop) tree).body, endPositions); |
417 case(JCTree.ERRONEOUS): { |
427 case ERRONEOUS: { |
418 JCErroneous node = (JCErroneous)tree; |
428 JCErroneous node = (JCErroneous)tree; |
419 if (node.errs != null && node.errs.nonEmpty()) |
429 if (node.errs != null && node.errs.nonEmpty()) |
420 return getEndPos(node.errs.last(), endPositions); |
430 return getEndPos(node.errs.last(), endPositions); |
421 } |
431 } |
422 } |
432 } |
423 return Position.NOPOS; |
433 return Position.NOPOS; |
424 } |
434 } |
425 |
435 |
426 |
436 |
603 * otherwise return null. |
613 * otherwise return null. |
604 */ |
614 */ |
605 public static Name fullName(JCTree tree) { |
615 public static Name fullName(JCTree tree) { |
606 tree = skipParens(tree); |
616 tree = skipParens(tree); |
607 switch (tree.getTag()) { |
617 switch (tree.getTag()) { |
608 case JCTree.IDENT: |
618 case IDENT: |
609 return ((JCIdent) tree).name; |
619 return ((JCIdent) tree).name; |
610 case JCTree.SELECT: |
620 case SELECT: |
611 Name sname = fullName(((JCFieldAccess) tree).selected); |
621 Name sname = fullName(((JCFieldAccess) tree).selected); |
612 return sname == null ? null : sname.append('.', name(tree)); |
622 return sname == null ? null : sname.append('.', name(tree)); |
613 default: |
623 default: |
614 return null; |
624 return null; |
615 } |
625 } |
616 } |
626 } |
617 |
627 |
618 public static Symbol symbolFor(JCTree node) { |
628 public static Symbol symbolFor(JCTree node) { |
619 node = skipParens(node); |
629 node = skipParens(node); |
620 switch (node.getTag()) { |
630 switch (node.getTag()) { |
621 case JCTree.CLASSDEF: |
631 case CLASSDEF: |
622 return ((JCClassDecl) node).sym; |
632 return ((JCClassDecl) node).sym; |
623 case JCTree.METHODDEF: |
633 case METHODDEF: |
624 return ((JCMethodDecl) node).sym; |
634 return ((JCMethodDecl) node).sym; |
625 case JCTree.VARDEF: |
635 case VARDEF: |
626 return ((JCVariableDecl) node).sym; |
636 return ((JCVariableDecl) node).sym; |
627 default: |
637 default: |
628 return null; |
638 return null; |
629 } |
639 } |
630 } |
640 } |
631 |
641 |
632 public static boolean isDeclaration(JCTree node) { |
642 public static boolean isDeclaration(JCTree node) { |
633 node = skipParens(node); |
643 node = skipParens(node); |
634 switch (node.getTag()) { |
644 switch (node.getTag()) { |
635 case JCTree.CLASSDEF: |
645 case CLASSDEF: |
636 case JCTree.METHODDEF: |
646 case METHODDEF: |
637 case JCTree.VARDEF: |
647 case VARDEF: |
638 return true; |
648 return true; |
639 default: |
649 default: |
640 return false; |
650 return false; |
641 } |
651 } |
642 } |
652 } |
645 * otherwise return null. |
655 * otherwise return null. |
646 */ |
656 */ |
647 public static Symbol symbol(JCTree tree) { |
657 public static Symbol symbol(JCTree tree) { |
648 tree = skipParens(tree); |
658 tree = skipParens(tree); |
649 switch (tree.getTag()) { |
659 switch (tree.getTag()) { |
650 case JCTree.IDENT: |
660 case IDENT: |
651 return ((JCIdent) tree).sym; |
661 return ((JCIdent) tree).sym; |
652 case JCTree.SELECT: |
662 case SELECT: |
653 return ((JCFieldAccess) tree).sym; |
663 return ((JCFieldAccess) tree).sym; |
654 case JCTree.TYPEAPPLY: |
664 case TYPEAPPLY: |
655 return symbol(((JCTypeApply) tree).clazz); |
665 return symbol(((JCTypeApply) tree).clazz); |
656 default: |
666 default: |
657 return null; |
667 return null; |
658 } |
668 } |
659 } |
669 } |
660 |
670 |
661 /** Return true if this is a nonstatic selection. */ |
671 /** Return true if this is a nonstatic selection. */ |
662 public static boolean nonstaticSelect(JCTree tree) { |
672 public static boolean nonstaticSelect(JCTree tree) { |
663 tree = skipParens(tree); |
673 tree = skipParens(tree); |
664 if (tree.getTag() != JCTree.SELECT) return false; |
674 if (!tree.hasTag(SELECT)) return false; |
665 JCFieldAccess s = (JCFieldAccess) tree; |
675 JCFieldAccess s = (JCFieldAccess) tree; |
666 Symbol e = symbol(s.selected); |
676 Symbol e = symbol(s.selected); |
667 return e == null || (e.kind != Kinds.PCK && e.kind != Kinds.TYP); |
677 return e == null || (e.kind != Kinds.PCK && e.kind != Kinds.TYP); |
668 } |
678 } |
669 |
679 |
670 /** If this tree is an identifier or a field, set its symbol, otherwise skip. |
680 /** If this tree is an identifier or a field, set its symbol, otherwise skip. |
671 */ |
681 */ |
672 public static void setSymbol(JCTree tree, Symbol sym) { |
682 public static void setSymbol(JCTree tree, Symbol sym) { |
673 tree = skipParens(tree); |
683 tree = skipParens(tree); |
674 switch (tree.getTag()) { |
684 switch (tree.getTag()) { |
675 case JCTree.IDENT: |
685 case IDENT: |
676 ((JCIdent) tree).sym = sym; break; |
686 ((JCIdent) tree).sym = sym; break; |
677 case JCTree.SELECT: |
687 case SELECT: |
678 ((JCFieldAccess) tree).sym = sym; break; |
688 ((JCFieldAccess) tree).sym = sym; break; |
679 default: |
689 default: |
680 } |
690 } |
681 } |
691 } |
682 |
692 |
683 /** If this tree is a declaration or a block, return its flags field, |
693 /** If this tree is a declaration or a block, return its flags field, |
684 * otherwise return 0. |
694 * otherwise return 0. |
685 */ |
695 */ |
686 public static long flags(JCTree tree) { |
696 public static long flags(JCTree tree) { |
687 switch (tree.getTag()) { |
697 switch (tree.getTag()) { |
688 case JCTree.VARDEF: |
698 case VARDEF: |
689 return ((JCVariableDecl) tree).mods.flags; |
699 return ((JCVariableDecl) tree).mods.flags; |
690 case JCTree.METHODDEF: |
700 case METHODDEF: |
691 return ((JCMethodDecl) tree).mods.flags; |
701 return ((JCMethodDecl) tree).mods.flags; |
692 case JCTree.CLASSDEF: |
702 case CLASSDEF: |
693 return ((JCClassDecl) tree).mods.flags; |
703 return ((JCClassDecl) tree).mods.flags; |
694 case JCTree.BLOCK: |
704 case BLOCK: |
695 return ((JCBlock) tree).flags; |
705 return ((JCBlock) tree).flags; |
696 default: |
706 default: |
697 return 0; |
707 return 0; |
698 } |
708 } |
699 } |
709 } |
737 precCount = 16; |
747 precCount = 16; |
738 |
748 |
739 |
749 |
740 /** Map operators to their precedence levels. |
750 /** Map operators to their precedence levels. |
741 */ |
751 */ |
742 public static int opPrec(int op) { |
752 public static int opPrec(JCTree.Tag op) { |
743 switch(op) { |
753 switch(op) { |
744 case JCTree.POS: |
754 case POS: |
745 case JCTree.NEG: |
755 case NEG: |
746 case JCTree.NOT: |
756 case NOT: |
747 case JCTree.COMPL: |
757 case COMPL: |
748 case JCTree.PREINC: |
758 case PREINC: |
749 case JCTree.PREDEC: return prefixPrec; |
759 case PREDEC: return prefixPrec; |
750 case JCTree.POSTINC: |
760 case POSTINC: |
751 case JCTree.POSTDEC: |
761 case POSTDEC: |
752 case JCTree.NULLCHK: return postfixPrec; |
762 case NULLCHK: return postfixPrec; |
753 case JCTree.ASSIGN: return assignPrec; |
763 case ASSIGN: return assignPrec; |
754 case JCTree.BITOR_ASG: |
764 case BITOR_ASG: |
755 case JCTree.BITXOR_ASG: |
765 case BITXOR_ASG: |
756 case JCTree.BITAND_ASG: |
766 case BITAND_ASG: |
757 case JCTree.SL_ASG: |
767 case SL_ASG: |
758 case JCTree.SR_ASG: |
768 case SR_ASG: |
759 case JCTree.USR_ASG: |
769 case USR_ASG: |
760 case JCTree.PLUS_ASG: |
770 case PLUS_ASG: |
761 case JCTree.MINUS_ASG: |
771 case MINUS_ASG: |
762 case JCTree.MUL_ASG: |
772 case MUL_ASG: |
763 case JCTree.DIV_ASG: |
773 case DIV_ASG: |
764 case JCTree.MOD_ASG: return assignopPrec; |
774 case MOD_ASG: return assignopPrec; |
765 case JCTree.OR: return orPrec; |
775 case OR: return orPrec; |
766 case JCTree.AND: return andPrec; |
776 case AND: return andPrec; |
767 case JCTree.EQ: |
777 case EQ: |
768 case JCTree.NE: return eqPrec; |
778 case NE: return eqPrec; |
769 case JCTree.LT: |
779 case LT: |
770 case JCTree.GT: |
780 case GT: |
771 case JCTree.LE: |
781 case LE: |
772 case JCTree.GE: return ordPrec; |
782 case GE: return ordPrec; |
773 case JCTree.BITOR: return bitorPrec; |
783 case BITOR: return bitorPrec; |
774 case JCTree.BITXOR: return bitxorPrec; |
784 case BITXOR: return bitxorPrec; |
775 case JCTree.BITAND: return bitandPrec; |
785 case BITAND: return bitandPrec; |
776 case JCTree.SL: |
786 case SL: |
777 case JCTree.SR: |
787 case SR: |
778 case JCTree.USR: return shiftPrec; |
788 case USR: return shiftPrec; |
779 case JCTree.PLUS: |
789 case PLUS: |
780 case JCTree.MINUS: return addPrec; |
790 case MINUS: return addPrec; |
781 case JCTree.MUL: |
791 case MUL: |
782 case JCTree.DIV: |
792 case DIV: |
783 case JCTree.MOD: return mulPrec; |
793 case MOD: return mulPrec; |
784 case JCTree.TYPETEST: return ordPrec; |
794 case TYPETEST: return ordPrec; |
785 default: throw new AssertionError(); |
795 default: throw new AssertionError(); |
786 } |
796 } |
787 } |
797 } |
788 |
798 |
789 static Tree.Kind tagToKind(int tag) { |
799 static Tree.Kind tagToKind(JCTree.Tag tag) { |
790 switch (tag) { |
800 switch (tag) { |
791 // Postfix expressions |
801 // Postfix expressions |
792 case JCTree.POSTINC: // _ ++ |
802 case POSTINC: // _ ++ |
793 return Tree.Kind.POSTFIX_INCREMENT; |
803 return Tree.Kind.POSTFIX_INCREMENT; |
794 case JCTree.POSTDEC: // _ -- |
804 case POSTDEC: // _ -- |
795 return Tree.Kind.POSTFIX_DECREMENT; |
805 return Tree.Kind.POSTFIX_DECREMENT; |
796 |
806 |
797 // Unary operators |
807 // Unary operators |
798 case JCTree.PREINC: // ++ _ |
808 case PREINC: // ++ _ |
799 return Tree.Kind.PREFIX_INCREMENT; |
809 return Tree.Kind.PREFIX_INCREMENT; |
800 case JCTree.PREDEC: // -- _ |
810 case PREDEC: // -- _ |
801 return Tree.Kind.PREFIX_DECREMENT; |
811 return Tree.Kind.PREFIX_DECREMENT; |
802 case JCTree.POS: // + |
812 case POS: // + |
803 return Tree.Kind.UNARY_PLUS; |
813 return Tree.Kind.UNARY_PLUS; |
804 case JCTree.NEG: // - |
814 case NEG: // - |
805 return Tree.Kind.UNARY_MINUS; |
815 return Tree.Kind.UNARY_MINUS; |
806 case JCTree.COMPL: // ~ |
816 case COMPL: // ~ |
807 return Tree.Kind.BITWISE_COMPLEMENT; |
817 return Tree.Kind.BITWISE_COMPLEMENT; |
808 case JCTree.NOT: // ! |
818 case NOT: // ! |
809 return Tree.Kind.LOGICAL_COMPLEMENT; |
819 return Tree.Kind.LOGICAL_COMPLEMENT; |
810 |
820 |
811 // Binary operators |
821 // Binary operators |
812 |
822 |
813 // Multiplicative operators |
823 // Multiplicative operators |
814 case JCTree.MUL: // * |
824 case MUL: // * |
815 return Tree.Kind.MULTIPLY; |
825 return Tree.Kind.MULTIPLY; |
816 case JCTree.DIV: // / |
826 case DIV: // / |
817 return Tree.Kind.DIVIDE; |
827 return Tree.Kind.DIVIDE; |
818 case JCTree.MOD: // % |
828 case MOD: // % |
819 return Tree.Kind.REMAINDER; |
829 return Tree.Kind.REMAINDER; |
820 |
830 |
821 // Additive operators |
831 // Additive operators |
822 case JCTree.PLUS: // + |
832 case PLUS: // + |
823 return Tree.Kind.PLUS; |
833 return Tree.Kind.PLUS; |
824 case JCTree.MINUS: // - |
834 case MINUS: // - |
825 return Tree.Kind.MINUS; |
835 return Tree.Kind.MINUS; |
826 |
836 |
827 // Shift operators |
837 // Shift operators |
828 case JCTree.SL: // << |
838 case SL: // << |
829 return Tree.Kind.LEFT_SHIFT; |
839 return Tree.Kind.LEFT_SHIFT; |
830 case JCTree.SR: // >> |
840 case SR: // >> |
831 return Tree.Kind.RIGHT_SHIFT; |
841 return Tree.Kind.RIGHT_SHIFT; |
832 case JCTree.USR: // >>> |
842 case USR: // >>> |
833 return Tree.Kind.UNSIGNED_RIGHT_SHIFT; |
843 return Tree.Kind.UNSIGNED_RIGHT_SHIFT; |
834 |
844 |
835 // Relational operators |
845 // Relational operators |
836 case JCTree.LT: // < |
846 case LT: // < |
837 return Tree.Kind.LESS_THAN; |
847 return Tree.Kind.LESS_THAN; |
838 case JCTree.GT: // > |
848 case GT: // > |
839 return Tree.Kind.GREATER_THAN; |
849 return Tree.Kind.GREATER_THAN; |
840 case JCTree.LE: // <= |
850 case LE: // <= |
841 return Tree.Kind.LESS_THAN_EQUAL; |
851 return Tree.Kind.LESS_THAN_EQUAL; |
842 case JCTree.GE: // >= |
852 case GE: // >= |
843 return Tree.Kind.GREATER_THAN_EQUAL; |
853 return Tree.Kind.GREATER_THAN_EQUAL; |
844 |
854 |
845 // Equality operators |
855 // Equality operators |
846 case JCTree.EQ: // == |
856 case EQ: // == |
847 return Tree.Kind.EQUAL_TO; |
857 return Tree.Kind.EQUAL_TO; |
848 case JCTree.NE: // != |
858 case NE: // != |
849 return Tree.Kind.NOT_EQUAL_TO; |
859 return Tree.Kind.NOT_EQUAL_TO; |
850 |
860 |
851 // Bitwise and logical operators |
861 // Bitwise and logical operators |
852 case JCTree.BITAND: // & |
862 case BITAND: // & |
853 return Tree.Kind.AND; |
863 return Tree.Kind.AND; |
854 case JCTree.BITXOR: // ^ |
864 case BITXOR: // ^ |
855 return Tree.Kind.XOR; |
865 return Tree.Kind.XOR; |
856 case JCTree.BITOR: // | |
866 case BITOR: // | |
857 return Tree.Kind.OR; |
867 return Tree.Kind.OR; |
858 |
868 |
859 // Conditional operators |
869 // Conditional operators |
860 case JCTree.AND: // && |
870 case AND: // && |
861 return Tree.Kind.CONDITIONAL_AND; |
871 return Tree.Kind.CONDITIONAL_AND; |
862 case JCTree.OR: // || |
872 case OR: // || |
863 return Tree.Kind.CONDITIONAL_OR; |
873 return Tree.Kind.CONDITIONAL_OR; |
864 |
874 |
865 // Assignment operators |
875 // Assignment operators |
866 case JCTree.MUL_ASG: // *= |
876 case MUL_ASG: // *= |
867 return Tree.Kind.MULTIPLY_ASSIGNMENT; |
877 return Tree.Kind.MULTIPLY_ASSIGNMENT; |
868 case JCTree.DIV_ASG: // /= |
878 case DIV_ASG: // /= |
869 return Tree.Kind.DIVIDE_ASSIGNMENT; |
879 return Tree.Kind.DIVIDE_ASSIGNMENT; |
870 case JCTree.MOD_ASG: // %= |
880 case MOD_ASG: // %= |
871 return Tree.Kind.REMAINDER_ASSIGNMENT; |
881 return Tree.Kind.REMAINDER_ASSIGNMENT; |
872 case JCTree.PLUS_ASG: // += |
882 case PLUS_ASG: // += |
873 return Tree.Kind.PLUS_ASSIGNMENT; |
883 return Tree.Kind.PLUS_ASSIGNMENT; |
874 case JCTree.MINUS_ASG: // -= |
884 case MINUS_ASG: // -= |
875 return Tree.Kind.MINUS_ASSIGNMENT; |
885 return Tree.Kind.MINUS_ASSIGNMENT; |
876 case JCTree.SL_ASG: // <<= |
886 case SL_ASG: // <<= |
877 return Tree.Kind.LEFT_SHIFT_ASSIGNMENT; |
887 return Tree.Kind.LEFT_SHIFT_ASSIGNMENT; |
878 case JCTree.SR_ASG: // >>= |
888 case SR_ASG: // >>= |
879 return Tree.Kind.RIGHT_SHIFT_ASSIGNMENT; |
889 return Tree.Kind.RIGHT_SHIFT_ASSIGNMENT; |
880 case JCTree.USR_ASG: // >>>= |
890 case USR_ASG: // >>>= |
881 return Tree.Kind.UNSIGNED_RIGHT_SHIFT_ASSIGNMENT; |
891 return Tree.Kind.UNSIGNED_RIGHT_SHIFT_ASSIGNMENT; |
882 case JCTree.BITAND_ASG: // &= |
892 case BITAND_ASG: // &= |
883 return Tree.Kind.AND_ASSIGNMENT; |
893 return Tree.Kind.AND_ASSIGNMENT; |
884 case JCTree.BITXOR_ASG: // ^= |
894 case BITXOR_ASG: // ^= |
885 return Tree.Kind.XOR_ASSIGNMENT; |
895 return Tree.Kind.XOR_ASSIGNMENT; |
886 case JCTree.BITOR_ASG: // |= |
896 case BITOR_ASG: // |= |
887 return Tree.Kind.OR_ASSIGNMENT; |
897 return Tree.Kind.OR_ASSIGNMENT; |
888 |
898 |
889 // Null check (implementation detail), for example, __.getClass() |
899 // Null check (implementation detail), for example, __.getClass() |
890 case JCTree.NULLCHK: |
900 case NULLCHK: |
891 return Tree.Kind.OTHER; |
901 return Tree.Kind.OTHER; |
892 |
902 |
893 default: |
903 default: |
894 return null; |
904 return null; |
895 } |
905 } |
899 * Returns the underlying type of the tree if it is annotated type, |
909 * Returns the underlying type of the tree if it is annotated type, |
900 * or the tree itself otherwise |
910 * or the tree itself otherwise |
901 */ |
911 */ |
902 public static JCExpression typeIn(JCExpression tree) { |
912 public static JCExpression typeIn(JCExpression tree) { |
903 switch (tree.getTag()) { |
913 switch (tree.getTag()) { |
904 case JCTree.IDENT: /* simple names */ |
914 case IDENT: /* simple names */ |
905 case JCTree.TYPEIDENT: /* primitive name */ |
915 case TYPEIDENT: /* primitive name */ |
906 case JCTree.SELECT: /* qualified name */ |
916 case SELECT: /* qualified name */ |
907 case JCTree.TYPEARRAY: /* array types */ |
917 case TYPEARRAY: /* array types */ |
908 case JCTree.WILDCARD: /* wild cards */ |
918 case WILDCARD: /* wild cards */ |
909 case JCTree.TYPEPARAMETER: /* type parameters */ |
919 case TYPEPARAMETER: /* type parameters */ |
910 case JCTree.TYPEAPPLY: /* parameterized types */ |
920 case TYPEAPPLY: /* parameterized types */ |
911 return tree; |
921 return tree; |
912 default: |
922 default: |
913 throw new AssertionError("Unexpected type tree: " + tree); |
923 throw new AssertionError("Unexpected type tree: " + tree); |
914 } |
924 } |
915 } |
925 } |
916 |
926 |
917 public static JCTree innermostType(JCTree type) { |
927 public static JCTree innermostType(JCTree type) { |
918 switch (type.getTag()) { |
928 switch (type.getTag()) { |
919 case JCTree.TYPEARRAY: |
929 case TYPEARRAY: |
920 return innermostType(((JCArrayTypeTree)type).elemtype); |
930 return innermostType(((JCArrayTypeTree)type).elemtype); |
921 case JCTree.WILDCARD: |
931 case WILDCARD: |
922 return innermostType(((JCWildcard)type).inner); |
932 return innermostType(((JCWildcard)type).inner); |
923 default: |
933 default: |
924 return type; |
934 return type; |
925 } |
935 } |
926 } |
936 } |