EMMA Coverage Report (generated Thu Dec 06 15:52:10 GMT 2007)
[all classes][com.sun.tools.javac.tree]

COVERAGE SUMMARY FOR SOURCE FILE [JCTree.java]

nameclass, %method, %block, %line, %
JCTree.java37%  (20/54)15%  (62/426)19%  (380/2034)21%  (137.8/656)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class JCTree$10%   (0/1)0%   (0/1)0%   (0/26)0%   (0/1)
<static initializer> 0%   (0/1)0%   (0/26)0%   (0/1)
     
class JCTree$JCAnnotation0%   (0/1)0%   (0/7)0%   (0/28)0%   (0/10)
JCTree$JCAnnotation (JCTree, List): void 0%   (0/1)0%   (0/9)0%   (0/4)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getAnnotationType (): JCTree 0%   (0/1)0%   (0/3)0%   (0/1)
getArguments (): List 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
     
class JCTree$JCArrayAccess0%   (0/1)0%   (0/7)0%   (0/28)0%   (0/10)
JCTree$JCArrayAccess (JCTree$JCExpression, JCTree$JCExpression): void 0%   (0/1)0%   (0/9)0%   (0/4)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getExpression (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getIndex (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
     
class JCTree$JCArrayTypeTree0%   (0/1)0%   (0/6)0%   (0/22)0%   (0/8)
JCTree$JCArrayTypeTree (JCTree$JCExpression): void 0%   (0/1)0%   (0/6)0%   (0/3)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
getType (): JCTree 0%   (0/1)0%   (0/3)0%   (0/1)
     
class JCTree$JCAssert0%   (0/1)0%   (0/7)0%   (0/28)0%   (0/10)
JCTree$JCAssert (JCTree$JCExpression, JCTree$JCExpression): void 0%   (0/1)0%   (0/9)0%   (0/4)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getCondition (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getDetail (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
     
class JCTree$JCAssignOp0%   (0/1)0%   (0/8)0%   (0/42)0%   (0/13)
JCTree$JCAssignOp (int, JCTree, JCTree, Symbol): void 0%   (0/1)0%   (0/17)0%   (0/6)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getExpression (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/4)0%   (0/1)
getOperator (): Symbol 0%   (0/1)0%   (0/3)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/3)0%   (0/1)
getVariable (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
     
class JCTree$JCBinary0%   (0/1)0%   (0/8)0%   (0/40)0%   (0/13)
JCTree$JCBinary (int, JCTree$JCExpression, JCTree$JCExpression, Symbol): void 0%   (0/1)0%   (0/15)0%   (0/6)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/4)0%   (0/1)
getLeftOperand (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getOperator (): Symbol 0%   (0/1)0%   (0/3)0%   (0/1)
getRightOperand (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/3)0%   (0/1)
     
class JCTree$JCBreak0%   (0/1)0%   (0/6)0%   (0/25)0%   (0/9)
JCTree$JCBreak (Name, JCTree): void 0%   (0/1)0%   (0/9)0%   (0/4)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getLabel (): Name 0%   (0/1)0%   (0/3)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
     
class JCTree$JCCase0%   (0/1)0%   (0/7)0%   (0/28)0%   (0/10)
JCTree$JCCase (JCTree$JCExpression, List): void 0%   (0/1)0%   (0/9)0%   (0/4)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getExpression (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getStatements (): List 0%   (0/1)0%   (0/3)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
     
class JCTree$JCCatch0%   (0/1)0%   (0/7)0%   (0/28)0%   (0/10)
JCTree$JCCatch (JCTree$JCVariableDecl, JCTree$JCBlock): void 0%   (0/1)0%   (0/9)0%   (0/4)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getBlock (): JCTree$JCBlock 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getParameter (): JCTree$JCVariableDecl 0%   (0/1)0%   (0/3)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
     
class JCTree$JCConditional0%   (0/1)0%   (0/8)0%   (0/34)0%   (0/12)
JCTree$JCConditional (JCTree$JCExpression, JCTree$JCExpression, JCTree$JCExpr... 0%   (0/1)0%   (0/12)0%   (0/5)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getCondition (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getFalseExpression (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
getTrueExpression (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
     
class JCTree$JCContinue0%   (0/1)0%   (0/6)0%   (0/25)0%   (0/9)
JCTree$JCContinue (Name, JCTree): void 0%   (0/1)0%   (0/9)0%   (0/4)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getLabel (): Name 0%   (0/1)0%   (0/3)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
     
class JCTree$JCDoWhileLoop0%   (0/1)0%   (0/7)0%   (0/28)0%   (0/10)
JCTree$JCDoWhileLoop (JCTree$JCStatement, JCTree$JCExpression): void 0%   (0/1)0%   (0/9)0%   (0/4)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getCondition (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getStatement (): JCTree$JCStatement 0%   (0/1)0%   (0/3)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
     
class JCTree$JCEnhancedForLoop0%   (0/1)0%   (0/8)0%   (0/34)0%   (0/12)
JCTree$JCEnhancedForLoop (JCTree$JCVariableDecl, JCTree$JCExpression, JCTree$... 0%   (0/1)0%   (0/12)0%   (0/5)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getExpression (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getStatement (): JCTree$JCStatement 0%   (0/1)0%   (0/3)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
getVariable (): JCTree$JCVariableDecl 0%   (0/1)0%   (0/3)0%   (0/1)
     
class JCTree$JCForLoop0%   (0/1)0%   (0/9)0%   (0/40)0%   (0/14)
JCTree$JCForLoop (List, JCTree$JCExpression, List, JCTree$JCStatement): void 0%   (0/1)0%   (0/15)0%   (0/6)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getCondition (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getInitializer (): List 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getStatement (): JCTree$JCStatement 0%   (0/1)0%   (0/3)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
getUpdate (): List 0%   (0/1)0%   (0/3)0%   (0/1)
     
class JCTree$JCIf0%   (0/1)0%   (0/8)0%   (0/34)0%   (0/12)
JCTree$JCIf (JCTree$JCExpression, JCTree$JCStatement, JCTree$JCStatement): void 0%   (0/1)0%   (0/12)0%   (0/5)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getCondition (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getElseStatement (): JCTree$JCStatement 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
getThenStatement (): JCTree$JCStatement 0%   (0/1)0%   (0/3)0%   (0/1)
     
class JCTree$JCImport0%   (0/1)0%   (0/7)0%   (0/28)0%   (0/10)
JCTree$JCImport (JCTree, boolean): void 0%   (0/1)0%   (0/9)0%   (0/4)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getQualifiedIdentifier (): JCTree 0%   (0/1)0%   (0/3)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
isStatic (): boolean 0%   (0/1)0%   (0/3)0%   (0/1)
     
class JCTree$JCInstanceOf0%   (0/1)0%   (0/7)0%   (0/28)0%   (0/10)
JCTree$JCInstanceOf (JCTree$JCExpression, JCTree): void 0%   (0/1)0%   (0/9)0%   (0/4)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getExpression (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
getType (): JCTree 0%   (0/1)0%   (0/3)0%   (0/1)
     
class JCTree$JCLabeledStatement0%   (0/1)0%   (0/7)0%   (0/28)0%   (0/10)
JCTree$JCLabeledStatement (Name, JCTree$JCStatement): void 0%   (0/1)0%   (0/9)0%   (0/4)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getLabel (): Name 0%   (0/1)0%   (0/3)0%   (0/1)
getStatement (): JCTree$JCStatement 0%   (0/1)0%   (0/3)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
     
class JCTree$JCLiteral0%   (0/1)0%   (0/7)0%   (0/94)0%   (0/28)
JCTree$JCLiteral (int, Object): void 0%   (0/1)0%   (0/9)0%   (0/4)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/31)0%   (0/10)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
getValue (): Object 0%   (0/1)0%   (0/37)0%   (0/9)
setType (Type): JCTree$JCLiteral 0%   (0/1)0%   (0/6)0%   (0/2)
     
class JCTree$JCNewArray0%   (0/1)0%   (0/8)0%   (0/34)0%   (0/12)
JCTree$JCNewArray (JCTree$JCExpression, List, List): void 0%   (0/1)0%   (0/12)0%   (0/5)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getDimensions (): List 0%   (0/1)0%   (0/3)0%   (0/1)
getInitializers (): List 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
getType (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
     
class JCTree$JCPrimitiveTypeTree0%   (0/1)0%   (0/6)0%   (0/52)0%   (0/18)
JCTree$JCPrimitiveTypeTree (int): void 0%   (0/1)0%   (0/6)0%   (0/3)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getPrimitiveTypeKind (): TypeKind 0%   (0/1)0%   (0/33)0%   (0/11)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
     
class JCTree$JCSkip0%   (0/1)0%   (0/5)0%   (0/16)0%   (0/6)
JCTree$JCSkip (): void 0%   (0/1)0%   (0/3)0%   (0/2)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
     
class JCTree$JCSwitch0%   (0/1)0%   (0/7)0%   (0/28)0%   (0/10)
JCTree$JCSwitch (JCTree$JCExpression, List): void 0%   (0/1)0%   (0/9)0%   (0/4)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getCases (): List 0%   (0/1)0%   (0/3)0%   (0/1)
getExpression (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
     
class JCTree$JCSynchronized0%   (0/1)0%   (0/7)0%   (0/28)0%   (0/10)
JCTree$JCSynchronized (JCTree$JCExpression, JCTree$JCBlock): void 0%   (0/1)0%   (0/9)0%   (0/4)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getBlock (): JCTree$JCBlock 0%   (0/1)0%   (0/3)0%   (0/1)
getExpression (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
     
class JCTree$JCThrow0%   (0/1)0%   (0/6)0%   (0/23)0%   (0/8)
JCTree$JCThrow (JCTree): void 0%   (0/1)0%   (0/7)0%   (0/3)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getExpression (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
     
class JCTree$JCTry0%   (0/1)0%   (0/8)0%   (0/34)0%   (0/12)
JCTree$JCTry (JCTree$JCBlock, List, JCTree$JCBlock): void 0%   (0/1)0%   (0/12)0%   (0/5)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getBlock (): JCTree$JCBlock 0%   (0/1)0%   (0/3)0%   (0/1)
getCatches (): List 0%   (0/1)0%   (0/3)0%   (0/1)
getFinallyBlock (): JCTree$JCBlock 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
     
class JCTree$JCTypeApply0%   (0/1)0%   (0/7)0%   (0/28)0%   (0/10)
JCTree$JCTypeApply (JCTree$JCExpression, List): void 0%   (0/1)0%   (0/9)0%   (0/4)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
getType (): JCTree 0%   (0/1)0%   (0/3)0%   (0/1)
getTypeArguments (): List 0%   (0/1)0%   (0/3)0%   (0/1)
     
class JCTree$JCTypeParameter0%   (0/1)0%   (0/7)0%   (0/28)0%   (0/10)
JCTree$JCTypeParameter (Name, List): void 0%   (0/1)0%   (0/9)0%   (0/4)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getBounds (): List 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getName (): Name 0%   (0/1)0%   (0/3)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
     
class JCTree$JCUnary0%   (0/1)0%   (0/8)0%   (0/35)0%   (0/12)
JCTree$JCUnary (int, JCTree$JCExpression): void 0%   (0/1)0%   (0/9)0%   (0/4)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getExpression (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/4)0%   (0/1)
getOperator (): Symbol 0%   (0/1)0%   (0/3)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/3)0%   (0/1)
setTag (int): void 0%   (0/1)0%   (0/4)0%   (0/2)
     
class JCTree$JCWhileLoop0%   (0/1)0%   (0/7)0%   (0/28)0%   (0/10)
JCTree$JCWhileLoop (JCTree$JCExpression, JCTree$JCStatement): void 0%   (0/1)0%   (0/9)0%   (0/4)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getCondition (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getStatement (): JCTree$JCStatement 0%   (0/1)0%   (0/3)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
     
class JCTree$JCWildcard0%   (0/1)0%   (0/6)0%   (0/52)0%   (0/14)
JCTree$JCWildcard (JCTree$TypeBoundKind, JCTree): void 0%   (0/1)0%   (0/12)0%   (0/5)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getBound (): JCTree 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/26)0%   (0/5)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
     
class JCTree$LetExpr0%   (0/1)0%   (0/5)0%   (0/25)0%   (0/8)
JCTree$LetExpr (List, JCTree): void 0%   (0/1)0%   (0/9)0%   (0/4)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/5)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
     
class JCTree$TypeBoundKind0%   (0/1)0%   (0/5)0%   (0/22)0%   (0/7)
JCTree$TypeBoundKind (BoundKind): void 0%   (0/1)0%   (0/6)0%   (0/3)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/5)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
     
class JCTree$Visitor100% (1/1)12%  (6/52)12%  (26/214)10%  (4.9/51)
visitAnnotation (JCTree$JCAnnotation): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitApply (JCTree$JCMethodInvocation): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitAssert (JCTree$JCAssert): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitAssign (JCTree$JCAssign): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitAssignop (JCTree$JCAssignOp): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitBinary (JCTree$JCBinary): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitBlock (JCTree$JCBlock): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitBreak (JCTree$JCBreak): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitCase (JCTree$JCCase): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitCatch (JCTree$JCCatch): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitConditional (JCTree$JCConditional): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitContinue (JCTree$JCContinue): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitDoLoop (JCTree$JCDoWhileLoop): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitErroneous (JCTree$JCErroneous): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitExec (JCTree$JCExpressionStatement): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitForLoop (JCTree$JCForLoop): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitForeachLoop (JCTree$JCEnhancedForLoop): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitIf (JCTree$JCIf): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitImport (JCTree$JCImport): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitIndexed (JCTree$JCArrayAccess): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitLabelled (JCTree$JCLabeledStatement): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitLetExpr (JCTree$LetExpr): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitLiteral (JCTree$JCLiteral): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitModifiers (JCTree$JCModifiers): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitNewArray (JCTree$JCNewArray): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitNewClass (JCTree$JCNewClass): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitParens (JCTree$JCParens): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitReturn (JCTree$JCReturn): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitSelect (JCTree$JCFieldAccess): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitSkip (JCTree$JCSkip): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitSwitch (JCTree$JCSwitch): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitSynchronized (JCTree$JCSynchronized): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitThrow (JCTree$JCThrow): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitTopLevel (JCTree$JCCompilationUnit): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitTree (JCTree): void 0%   (0/1)0%   (0/7)0%   (0/1)
visitTry (JCTree$JCTry): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitTypeApply (JCTree$JCTypeApply): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitTypeArray (JCTree$JCArrayTypeTree): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitTypeBoundKind (JCTree$TypeBoundKind): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitTypeCast (JCTree$JCTypeCast): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitTypeIdent (JCTree$JCPrimitiveTypeTree): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitTypeParameter (JCTree$JCTypeParameter): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitTypeTest (JCTree$JCInstanceOf): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitUnary (JCTree$JCUnary): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitWhileLoop (JCTree$JCWhileLoop): void 0%   (0/1)0%   (0/4)0%   (0/1)
visitWildcard (JCTree$JCWildcard): void 0%   (0/1)0%   (0/4)0%   (0/1)
<static initializer> 100% (1/1)88%  (7/8)87%  (0.9/1)
JCTree$Visitor (): void 100% (1/1)100% (3/3)100% (1/1)
visitClassDef (JCTree$JCClassDecl): void 100% (1/1)100% (4/4)100% (1/1)
visitIdent (JCTree$JCIdent): void 100% (1/1)100% (4/4)100% (1/1)
visitMethodDef (JCTree$JCMethodDecl): void 100% (1/1)100% (4/4)100% (1/1)
visitVarDef (JCTree$JCVariableDecl): void 100% (1/1)100% (4/4)100% (1/1)
     
class JCTree$JCStatement100% (1/1)33%  (1/3)20%  (3/15)20%  (1/5)
setPos (int): JCTree$JCStatement 0%   (0/1)0%   (0/6)0%   (0/2)
setType (Type): JCTree$JCStatement 0%   (0/1)0%   (0/6)0%   (0/2)
JCTree$JCStatement (): void 100% (1/1)100% (3/3)100% (1/1)
     
class JCTree$JCErroneous100% (1/1)17%  (1/6)27%  (6/22)38%  (3/8)
accept (JCTree$Visitor): void 0%   (0/1)0%   (0/4)0%   (0/1)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getErrorTrees (): List 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getTag (): int 0%   (0/1)0%   (0/2)0%   (0/1)
JCTree$JCErroneous (List): void 100% (1/1)100% (6/6)100% (3/3)
     
class JCTree100% (1/1)60%  (6/10)37%  (21/57)45%  (9/20)
clone (): Object 0%   (0/1)0%   (0/9)0%   (0/3)
getEndPosition (Map): int 0%   (0/1)0%   (0/4)0%   (0/1)
getTree (): JCTree 0%   (0/1)0%   (0/2)0%   (0/1)
toString (): String 0%   (0/1)0%   (0/21)0%   (0/6)
JCTree (): void 100% (1/1)100% (3/3)100% (2/2)
getPreferredPosition (): int 100% (1/1)100% (3/3)100% (1/1)
getStartPosition (): int 100% (1/1)100% (3/3)100% (1/1)
pos (): JCDiagnostic$DiagnosticPosition 100% (1/1)100% (2/2)100% (1/1)
setPos (int): JCTree 100% (1/1)100% (5/5)100% (2/2)
setType (Type): JCTree 100% (1/1)100% (5/5)100% (2/2)
     
class JCTree$JCCompilationUnit100% (1/1)27%  (3/11)37%  (39/105)48%  (14/29)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getImports (): List 0%   (0/1)0%   (0/28)0%   (0/5)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getLineMap (): Position$LineMap 0%   (0/1)0%   (0/3)0%   (0/1)
getPackageAnnotations (): List 0%   (0/1)0%   (0/3)0%   (0/1)
getPackageName (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getSourceFile (): JavaFileObject 0%   (0/1)0%   (0/3)0%   (0/1)
getTypeDecls (): List 0%   (0/1)0%   (0/19)0%   (0/4)
JCTree$JCCompilationUnit (List, JCTree$JCExpression, List, JavaFileObject, Sy... 100% (1/1)100% (33/33)100% (12/12)
accept (JCTree$Visitor): void 100% (1/1)100% (4/4)100% (1/1)
getTag (): int 100% (1/1)100% (2/2)100% (1/1)
     
class JCTree$JCBlock100% (1/1)43%  (3/7)46%  (18/39)64%  (7/11)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getStatements (): List 0%   (0/1)0%   (0/3)0%   (0/1)
isStatic (): boolean 0%   (0/1)0%   (0/11)0%   (0/1)
JCTree$JCBlock (long, List): void 100% (1/1)100% (12/12)100% (5/5)
accept (JCTree$Visitor): void 100% (1/1)100% (4/4)100% (1/1)
getTag (): int 100% (1/1)100% (2/2)100% (1/1)
     
class JCTree$JCMethodInvocation100% (1/1)33%  (3/9)48%  (21/44)50%  (6.9/14)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getArguments (): List 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getMethodSelect (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getTypeArguments (): List 0%   (0/1)0%   (0/3)0%   (0/1)
setType (Type): JCTree$JCMethodInvocation 0%   (0/1)0%   (0/6)0%   (0/2)
JCTree$JCMethodInvocation (List, JCTree$JCExpression, List): void 100% (1/1)94%  (15/16)99%  (4.9/5)
accept (JCTree$Visitor): void 100% (1/1)100% (4/4)100% (1/1)
getTag (): int 100% (1/1)100% (2/2)100% (1/1)
     
class JCTree$JCModifiers100% (1/1)43%  (3/7)52%  (15/29)60%  (6/10)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getAnnotations (): List 0%   (0/1)0%   (0/3)0%   (0/1)
getFlags (): Set 0%   (0/1)0%   (0/4)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
JCTree$JCModifiers (long, List): void 100% (1/1)100% (9/9)100% (4/4)
accept (JCTree$Visitor): void 100% (1/1)100% (4/4)100% (1/1)
getTag (): int 100% (1/1)100% (2/2)100% (1/1)
     
class JCTree$JCAssign100% (1/1)43%  (3/7)54%  (15/28)60%  (6/10)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getExpression (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getVariable (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
JCTree$JCAssign (JCTree$JCExpression, JCTree$JCExpression): void 100% (1/1)100% (9/9)100% (4/4)
accept (JCTree$Visitor): void 100% (1/1)100% (4/4)100% (1/1)
getTag (): int 100% (1/1)100% (2/2)100% (1/1)
     
class JCTree$JCTypeCast100% (1/1)43%  (3/7)54%  (15/28)60%  (6/10)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getExpression (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getType (): JCTree 0%   (0/1)0%   (0/3)0%   (0/1)
JCTree$JCTypeCast (JCTree, JCTree$JCExpression): void 100% (1/1)100% (9/9)100% (4/4)
accept (JCTree$Visitor): void 100% (1/1)100% (4/4)100% (1/1)
getTag (): int 100% (1/1)100% (2/2)100% (1/1)
     
class JCTree$JCMethodDecl100% (1/1)23%  (3/13)54%  (36/67)57%  (13/23)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getBody (): JCTree$JCBlock 0%   (0/1)0%   (0/3)0%   (0/1)
getDefaultValue (): JCTree 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getModifiers (): JCTree$JCModifiers 0%   (0/1)0%   (0/3)0%   (0/1)
getName (): Name 0%   (0/1)0%   (0/3)0%   (0/1)
getParameters (): List 0%   (0/1)0%   (0/3)0%   (0/1)
getReturnType (): JCTree 0%   (0/1)0%   (0/3)0%   (0/1)
getThrows (): List 0%   (0/1)0%   (0/3)0%   (0/1)
getTypeParameters (): List 0%   (0/1)0%   (0/3)0%   (0/1)
JCTree$JCMethodDecl (JCTree$JCModifiers, Name, JCTree$JCExpression, List, Lis... 100% (1/1)100% (30/30)100% (11/11)
accept (JCTree$Visitor): void 100% (1/1)100% (4/4)100% (1/1)
getTag (): int 100% (1/1)100% (2/2)100% (1/1)
     
class JCTree$JCNewClass100% (1/1)30%  (3/10)54%  (27/50)56%  (9/16)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getArguments (): List 0%   (0/1)0%   (0/3)0%   (0/1)
getClassBody (): JCTree$JCClassDecl 0%   (0/1)0%   (0/3)0%   (0/1)
getEnclosingExpression (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getIdentifier (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getTypeArguments (): List 0%   (0/1)0%   (0/3)0%   (0/1)
JCTree$JCNewClass (JCTree$JCExpression, List, JCTree$JCExpression, List, JCTr... 100% (1/1)95%  (21/22)99%  (7/7)
accept (JCTree$Visitor): void 100% (1/1)100% (4/4)100% (1/1)
getTag (): int 100% (1/1)100% (2/2)100% (1/1)
     
class JCTree$JCClassDecl100% (1/1)27%  (3/11)55%  (30/55)58%  (11/19)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getExtendsClause (): JCTree 0%   (0/1)0%   (0/3)0%   (0/1)
getImplementsClause (): List 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getMembers (): List 0%   (0/1)0%   (0/3)0%   (0/1)
getModifiers (): JCTree$JCModifiers 0%   (0/1)0%   (0/3)0%   (0/1)
getSimpleName (): Name 0%   (0/1)0%   (0/3)0%   (0/1)
getTypeParameters (): List 0%   (0/1)0%   (0/3)0%   (0/1)
JCTree$JCClassDecl (JCTree$JCModifiers, Name, List, JCTree, List, List, Symbo... 100% (1/1)100% (24/24)100% (9/9)
accept (JCTree$Visitor): void 100% (1/1)100% (4/4)100% (1/1)
getTag (): int 100% (1/1)100% (2/2)100% (1/1)
     
class JCTree$JCExpressionStatement100% (1/1)50%  (3/6)55%  (12/22)62%  (5/8)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getExpression (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
JCTree$JCExpressionStatement (JCTree$JCExpression): void 100% (1/1)100% (6/6)100% (3/3)
accept (JCTree$Visitor): void 100% (1/1)100% (4/4)100% (1/1)
getTag (): int 100% (1/1)100% (2/2)100% (1/1)
     
class JCTree$JCParens100% (1/1)50%  (3/6)55%  (12/22)62%  (5/8)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getExpression (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
JCTree$JCParens (JCTree$JCExpression): void 100% (1/1)100% (6/6)100% (3/3)
accept (JCTree$Visitor): void 100% (1/1)100% (4/4)100% (1/1)
getTag (): int 100% (1/1)100% (2/2)100% (1/1)
     
class JCTree$JCReturn100% (1/1)50%  (3/6)55%  (12/22)62%  (5/8)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getExpression (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
JCTree$JCReturn (JCTree$JCExpression): void 100% (1/1)100% (6/6)100% (3/3)
accept (JCTree$Visitor): void 100% (1/1)100% (4/4)100% (1/1)
getTag (): int 100% (1/1)100% (2/2)100% (1/1)
     
class JCTree$JCVariableDecl100% (1/1)33%  (3/9)56%  (24/43)60%  (9/15)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getInitializer (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getModifiers (): JCTree$JCModifiers 0%   (0/1)0%   (0/3)0%   (0/1)
getName (): Name 0%   (0/1)0%   (0/3)0%   (0/1)
getType (): JCTree 0%   (0/1)0%   (0/3)0%   (0/1)
JCTree$JCVariableDecl (JCTree$JCModifiers, Name, JCTree$JCExpression, JCTree$... 100% (1/1)100% (18/18)100% (7/7)
accept (JCTree$Visitor): void 100% (1/1)100% (4/4)100% (1/1)
getTag (): int 100% (1/1)100% (2/2)100% (1/1)
     
class JCTree$JCFieldAccess100% (1/1)43%  (3/7)58%  (18/31)64%  (7/11)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getExpression (): JCTree$JCExpression 0%   (0/1)0%   (0/3)0%   (0/1)
getIdentifier (): Name 0%   (0/1)0%   (0/3)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
JCTree$JCFieldAccess (JCTree$JCExpression, Name, Symbol): void 100% (1/1)100% (12/12)100% (5/5)
accept (JCTree$Visitor): void 100% (1/1)100% (4/4)100% (1/1)
getTag (): int 100% (1/1)100% (2/2)100% (1/1)
     
class JCTree$JCIdent100% (1/1)50%  (3/6)60%  (15/25)67%  (6/9)
accept (TreeVisitor, Object): Object 0%   (0/1)0%   (0/5)0%   (0/1)
getKind (): Tree$Kind 0%   (0/1)0%   (0/2)0%   (0/1)
getName (): Name 0%   (0/1)0%   (0/3)0%   (0/1)
JCTree$JCIdent (Name, Symbol): void 100% (1/1)100% (9/9)100% (4/4)
accept (JCTree$Visitor): void 100% (1/1)100% (4/4)100% (1/1)
getTag (): int 100% (1/1)100% (2/2)100% (1/1)
     
class JCTree$JCExpression100% (1/1)100% (3/3)100% (15/15)100% (5/5)
JCTree$JCExpression (): void 100% (1/1)100% (3/3)100% (1/1)
setPos (int): JCTree$JCExpression 100% (1/1)100% (6/6)100% (2/2)
setType (Type): JCTree$JCExpression 100% (1/1)100% (6/6)100% (2/2)

1/*
2 * Copyright 1999-2006 Sun Microsystems, Inc.  All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25 
26package com.sun.tools.javac.tree;
27 
28import java.util.*;
29 
30import java.io.File;
31import java.io.IOException;
32import java.io.PrintWriter;
33import java.io.StringWriter;
34import javax.lang.model.element.Modifier;
35import javax.lang.model.type.TypeKind;
36import javax.tools.JavaFileObject;
37 
38import com.sun.tools.javac.util.*;
39import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
40import com.sun.tools.javac.util.List;
41import com.sun.tools.javac.code.*;
42import com.sun.tools.javac.code.Scope;
43import com.sun.tools.javac.code.Symbol.*;
44import com.sun.source.tree.Tree;
45import com.sun.source.tree.*;
46 
47import static com.sun.tools.javac.code.BoundKind.*;
48 
49/**
50 * Root class for abstract syntax tree nodes. It provides definitions
51 * for specific tree nodes as subclasses nested inside.
52 *
53 * <p>Each subclass is highly standardized.  It generally contains
54 * only tree fields for the syntactic subcomponents of the node.  Some
55 * classes that represent identifier uses or definitions also define a
56 * Symbol field that denotes the represented identifier.  Classes for
57 * non-local jumps also carry the jump target as a field.  The root
58 * class Tree itself defines fields for the tree's type and position.
59 * No other fields are kept in a tree node; instead parameters are
60 * passed to methods accessing the node.
61 *
62 * <p>Except for the methods defined by com.sun.source, the only
63 * method defined in subclasses is `visit' which applies a given
64 * visitor to the tree. The actual tree processing is done by visitor
65 * classes in other packages. The abstract class Visitor, as well as
66 * an Factory interface for trees, are defined as inner classes in
67 * Tree.
68 *
69 * <p>To avoid ambiguities with the Tree API in com.sun.source all sub
70 * classes should, by convention, start with JC (javac).
71 *
72 * <p><b>This is NOT part of any API supported by Sun Microsystems.
73 * If you write code that depends on this, you do so at your own risk.
74 * This code and its internal interfaces are subject to change or
75 * deletion without notice.</b>
76 *
77 * @see TreeMaker
78 * @see TreeInfo
79 * @see TreeTranslator
80 * @see Pretty
81 */
82public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
83 
84    /* Tree tag values, identifying kinds of trees */
85 
86    /** Toplevel nodes, of type TopLevel, representing entire source files.
87     */
88    public static final int  TOPLEVEL = 1;
89 
90    /** Import clauses, of type Import.
91     */
92    public static final int IMPORT = TOPLEVEL + 1;
93 
94    /** Class definitions, of type ClassDef.
95     */
96    public static final int CLASSDEF = IMPORT + 1;
97 
98    /** Method definitions, of type MethodDef.
99     */
100    public static final int METHODDEF = CLASSDEF + 1;
101 
102    /** Variable definitions, of type VarDef.
103     */
104    public static final int VARDEF = METHODDEF + 1;
105 
106    /** The no-op statement ";", of type Skip
107     */
108    public static final int SKIP = VARDEF + 1;
109 
110    /** Blocks, of type Block.
111     */
112    public static final int BLOCK = SKIP + 1;
113 
114    /** Do-while loops, of type DoLoop.
115     */
116    public static final int DOLOOP = BLOCK + 1;
117 
118    /** While-loops, of type WhileLoop.
119     */
120    public static final int WHILELOOP = DOLOOP + 1;
121 
122    /** For-loops, of type ForLoop.
123     */
124    public static final int FORLOOP = WHILELOOP + 1;
125 
126    /** Foreach-loops, of type ForeachLoop.
127     */
128    public static final int FOREACHLOOP = FORLOOP + 1;
129 
130    /** Labelled statements, of type Labelled.
131     */
132    public static final int LABELLED = FOREACHLOOP + 1;
133 
134    /** Switch statements, of type Switch.
135     */
136    public static final int SWITCH = LABELLED + 1;
137 
138    /** Case parts in switch statements, of type Case.
139     */
140    public static final int CASE = SWITCH + 1;
141 
142    /** Synchronized statements, of type Synchonized.
143     */
144    public static final int SYNCHRONIZED = CASE + 1;
145 
146    /** Try statements, of type Try.
147     */
148    public static final int TRY = SYNCHRONIZED + 1;
149 
150    /** Catch clauses in try statements, of type Catch.
151     */
152    public static final int CATCH = TRY + 1;
153 
154    /** Conditional expressions, of type Conditional.
155     */
156    public static final int CONDEXPR = CATCH + 1;
157 
158    /** Conditional statements, of type If.
159     */
160    public static final int IF = CONDEXPR + 1;
161 
162    /** Expression statements, of type Exec.
163     */
164    public static final int EXEC = IF + 1;
165 
166    /** Break statements, of type Break.
167     */
168    public static final int BREAK = EXEC + 1;
169 
170    /** Continue statements, of type Continue.
171     */
172    public static final int CONTINUE = BREAK + 1;
173 
174    /** Return statements, of type Return.
175     */
176    public static final int RETURN = CONTINUE + 1;
177 
178    /** Throw statements, of type Throw.
179     */
180    public static final int THROW = RETURN + 1;
181 
182    /** Assert statements, of type Assert.
183     */
184    public static final int ASSERT = THROW + 1;
185 
186    /** Method invocation expressions, of type Apply.
187     */
188    public static final int APPLY = ASSERT + 1;
189 
190    /** Class instance creation expressions, of type NewClass.
191     */
192    public static final int NEWCLASS = APPLY + 1;
193 
194    /** Array creation expressions, of type NewArray.
195     */
196    public static final int NEWARRAY = NEWCLASS + 1;
197 
198    /** Parenthesized subexpressions, of type Parens.
199     */
200    public static final int PARENS = NEWARRAY + 1;
201 
202    /** Assignment expressions, of type Assign.
203     */
204    public static final int ASSIGN = PARENS + 1;
205 
206    /** Type cast expressions, of type TypeCast.
207     */
208    public static final int TYPECAST = ASSIGN + 1;
209 
210    /** Type test expressions, of type TypeTest.
211     */
212    public static final int TYPETEST = TYPECAST + 1;
213 
214    /** Indexed array expressions, of type Indexed.
215     */
216    public static final int INDEXED = TYPETEST + 1;
217 
218    /** Selections, of type Select.
219     */
220    public static final int SELECT = INDEXED + 1;
221 
222    /** Simple identifiers, of type Ident.
223     */
224    public static final int IDENT = SELECT + 1;
225 
226    /** Literals, of type Literal.
227     */
228    public static final int LITERAL = IDENT + 1;
229 
230    /** Basic type identifiers, of type TypeIdent.
231     */
232    public static final int TYPEIDENT = LITERAL + 1;
233 
234    /** Array types, of type TypeArray.
235     */
236    public static final int TYPEARRAY = TYPEIDENT + 1;
237 
238    /** Parameterized types, of type TypeApply.
239     */
240    public static final int TYPEAPPLY = TYPEARRAY + 1;
241 
242    /** Formal type parameters, of type TypeParameter.
243     */
244    public static final int TYPEPARAMETER = TYPEAPPLY + 1;
245 
246    /** Type argument.
247     */
248    public static final int WILDCARD = TYPEPARAMETER + 1;
249 
250    /** Bound kind: extends, super, exact, or unbound
251     */
252    public static final int TYPEBOUNDKIND = WILDCARD + 1;
253 
254    /** metadata: Annotation.
255     */
256    public static final int ANNOTATION = TYPEBOUNDKIND + 1;
257 
258    /** metadata: Modifiers
259     */
260    public static final int MODIFIERS = ANNOTATION + 1;
261 
262    /** Error trees, of type Erroneous.
263     */
264    public static final int ERRONEOUS = MODIFIERS + 1;
265 
266    /** Unary operators, of type Unary.
267     */
268    public static final int POS = ERRONEOUS + 1;             // +
269    public static final int NEG = POS + 1;                   // -
270    public static final int NOT = NEG + 1;                   // !
271    public static final int COMPL = NOT + 1;                 // ~
272    public static final int PREINC = COMPL + 1;              // ++ _
273    public static final int PREDEC = PREINC + 1;             // -- _
274    public static final int POSTINC = PREDEC + 1;            // _ ++
275    public static final int POSTDEC = POSTINC + 1;           // _ --
276 
277    /** unary operator for null reference checks, only used internally.
278     */
279    public static final int NULLCHK = POSTDEC + 1;
280 
281    /** Binary operators, of type Binary.
282     */
283    public static final int OR = NULLCHK + 1;                // ||
284    public static final int AND = OR + 1;                    // &&
285    public static final int BITOR = AND + 1;                 // |
286    public static final int BITXOR = BITOR + 1;              // ^
287    public static final int BITAND = BITXOR + 1;             // &
288    public static final int EQ = BITAND + 1;                 // ==
289    public static final int NE = EQ + 1;                     // !=
290    public static final int LT = NE + 1;                     // <
291    public static final int GT = LT + 1;                     // >
292    public static final int LE = GT + 1;                     // <=
293    public static final int GE = LE + 1;                     // >=
294    public static final int SL = GE + 1;                     // <<
295    public static final int SR = SL + 1;                     // >>
296    public static final int USR = SR + 1;                    // >>>
297    public static final int PLUS = USR + 1;                  // +
298    public static final int MINUS = PLUS + 1;                // -
299    public static final int MUL = MINUS + 1;                 // *
300    public static final int DIV = MUL + 1;                   // /
301    public static final int MOD = DIV + 1;                   // %
302 
303    /** Assignment operators, of type Assignop.
304     */
305    public static final int BITOR_ASG = MOD + 1;             // |=
306    public static final int BITXOR_ASG = BITOR_ASG + 1;      // ^=
307    public static final int BITAND_ASG = BITXOR_ASG + 1;     // &=
308 
309    public static final int SL_ASG = SL + BITOR_ASG - BITOR; // <<=
310    public static final int SR_ASG = SL_ASG + 1;             // >>=
311    public static final int USR_ASG = SR_ASG + 1;            // >>>=
312    public static final int PLUS_ASG = USR_ASG + 1;          // +=
313    public static final int MINUS_ASG = PLUS_ASG + 1;        // -=
314    public static final int MUL_ASG = MINUS_ASG + 1;         // *=
315    public static final int DIV_ASG = MUL_ASG + 1;           // /=
316    public static final int MOD_ASG = DIV_ASG + 1;           // %=
317 
318    /** A synthetic let expression, of type LetExpr.
319     */
320    public static final int LETEXPR = MOD_ASG + 1;           // ala scheme
321 
322 
323    /** The offset between assignment operators and normal operators.
324     */
325    public static final int ASGOffset = BITOR_ASG - BITOR;
326 
327    /* The (encoded) position in the source file. @see util.Position.
328     */
329    public int pos;
330 
331    /* The type of this node.
332     */
333    public Type type;
334 
335    /* The tag of this node -- one of the constants declared above.
336     */
337    public abstract int getTag();
338 
339    /** Convert a tree to a pretty-printed string. */
340    public String toString() {
341        StringWriter s = new StringWriter();
342        try {
343            new Pretty(s, false).printExpr(this);
344        }
345        catch (IOException e) {
346            // should never happen, because StringWriter is defined
347            // never to throw any IOExceptions
348            throw new AssertionError(e);
349        }
350        return s.toString();
351    }
352 
353    /** Set position field and return this tree.
354     */
355    public JCTree setPos(int pos) {
356        this.pos = pos;
357        return this;
358    }
359 
360    /** Set type field and return this tree.
361     */
362    public JCTree setType(Type type) {
363        this.type = type;
364        return this;
365    }
366 
367    /** Visit this tree with a given visitor.
368     */
369    public abstract void accept(Visitor v);
370 
371    public abstract <R,D> R accept(TreeVisitor<R,D> v, D d);
372 
373    /** Return a shallow copy of this tree.
374     */
375    public Object clone() {
376        try {
377            return super.clone();
378        } catch(CloneNotSupportedException e) {
379            throw new RuntimeException(e);
380        }
381    }
382 
383    /** Get a default position for this tree node.
384     */
385    public DiagnosticPosition pos() {
386        return this;
387    }
388 
389    // for default DiagnosticPosition
390    public JCTree getTree() {
391        return this;
392    }
393 
394    // for default DiagnosticPosition
395    public int getStartPosition() {
396        return TreeInfo.getStartPos(this);
397    }
398 
399    // for default DiagnosticPosition
400    public int getPreferredPosition() {
401        return pos;
402    }
403 
404    // for default DiagnosticPosition
405    public int getEndPosition(Map<JCTree, Integer> endPosTable) {
406        return TreeInfo.getEndPos(this, endPosTable);
407    }
408 
409    /**
410     * Everything in one source file is kept in a TopLevel structure.
411     * @param pid              The tree representing the package clause.
412     * @param sourcefile       The source file name.
413     * @param defs             All definitions in this file (ClassDef, Import, and Skip)
414     * @param packge           The package it belongs to.
415     * @param namedImportScope A scope for all named imports.
416     * @param starImportScope  A scope for all import-on-demands.
417     * @param lineMap          Line starting positions, defined only
418     *                         if option -g is set.
419     * @param docComments      A hashtable that stores all documentation comments
420     *                         indexed by the tree nodes they refer to.
421     *                         defined only if option -s is set.
422     * @param endPositions     A hashtable that stores ending positions of source
423     *                         ranges indexed by the tree nodes they belong to.
424     *                         Defined only if option -Xjcov is set.
425     */
426    public static class JCCompilationUnit extends JCTree implements CompilationUnitTree {
427        public List<JCAnnotation> packageAnnotations;
428        public JCExpression pid;
429        public List<JCTree> defs;
430        public JavaFileObject sourcefile;
431        public PackageSymbol packge;
432        public Scope namedImportScope;
433        public Scope starImportScope;
434        public long flags;
435        public Position.LineMap lineMap = null;
436        public Map<JCTree, String> docComments = null;
437        public Map<JCTree, Integer> endPositions = null;
438        protected JCCompilationUnit(List<JCAnnotation> packageAnnotations,
439                        JCExpression pid,
440                        List<JCTree> defs,
441                        JavaFileObject sourcefile,
442                        PackageSymbol packge,
443                        Scope namedImportScope,
444                        Scope starImportScope) {
445            this.packageAnnotations = packageAnnotations;
446            this.pid = pid;
447            this.defs = defs;
448            this.sourcefile = sourcefile;
449            this.packge = packge;
450            this.namedImportScope = namedImportScope;
451            this.starImportScope = starImportScope;
452        }
453        @Override
454        public void accept(Visitor v) { v.visitTopLevel(this); }
455 
456        public Kind getKind() { return Kind.COMPILATION_UNIT; }
457        public List<JCAnnotation> getPackageAnnotations() {
458            return packageAnnotations;
459        }
460        public List<JCImport> getImports() {
461            ListBuffer<JCImport> imports = new ListBuffer<JCImport>();
462            for (JCTree tree : defs) {
463                if (tree.getTag() == IMPORT)
464                    imports.append((JCImport)tree);
465                else
466                    break;
467            }
468            return imports.toList();
469        }
470        public JCExpression getPackageName() { return pid; }
471        public JavaFileObject getSourceFile() {
472            return sourcefile;
473        }
474        public Position.LineMap getLineMap() {
475            return lineMap;
476        }
477        public List<JCTree> getTypeDecls() {
478            List<JCTree> typeDefs;
479            for (typeDefs = defs; !typeDefs.isEmpty(); typeDefs = typeDefs.tail)
480                if (typeDefs.head.getTag() != IMPORT)
481                    break;
482            return typeDefs;
483        }
484        @Override
485        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
486            return v.visitCompilationUnit(this, d);
487        }
488 
489        @Override
490        public int getTag() {
491            return TOPLEVEL;
492        }
493    }
494 
495    /**
496     * An import clause.
497     * @param qualid    The imported class(es).
498     */
499    public static class JCImport extends JCTree implements ImportTree {
500        public boolean staticImport;
501        public JCTree qualid;
502        protected JCImport(JCTree qualid, boolean importStatic) {
503            this.qualid = qualid;
504            this.staticImport = importStatic;
505        }
506        @Override
507        public void accept(Visitor v) { v.visitImport(this); }
508 
509        public boolean isStatic() { return staticImport; }
510        public JCTree getQualifiedIdentifier() { return qualid; }
511 
512        public Kind getKind() { return Kind.IMPORT; }
513        @Override
514        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
515            return v.visitImport(this, d);
516        }
517 
518        @Override
519        public int getTag() {
520            return IMPORT;
521        }
522    }
523 
524    public static abstract class JCStatement extends JCTree implements StatementTree {
525        @Override
526        public JCStatement setType(Type type) {
527            super.setType(type);
528            return this;
529        }
530        @Override
531        public JCStatement setPos(int pos) {
532            super.setPos(pos);
533            return this;
534        }
535    }
536 
537    public static abstract class JCExpression extends JCTree implements ExpressionTree {
538        @Override
539        public JCExpression setType(Type type) {
540            super.setType(type);
541            return this;
542        }
543        @Override
544        public JCExpression setPos(int pos) {
545            super.setPos(pos);
546            return this;
547        }
548    }
549 
550    /**
551     * A class definition.
552     * @param modifiers the modifiers
553     * @param name the name of the class
554     * @param typarams formal class parameters
555     * @param extending the classes this class extends
556     * @param implementing the interfaces implemented by this class
557     * @param defs all variables and methods defined in this class
558     * @param sym the symbol
559     */
560    public static class JCClassDecl extends JCStatement implements ClassTree {
561        public JCModifiers mods;
562        public Name name;
563        public List<JCTypeParameter> typarams;
564        public JCTree extending;
565        public List<JCExpression> implementing;
566        public List<JCTree> defs;
567        public ClassSymbol sym;
568        protected JCClassDecl(JCModifiers mods,
569                           Name name,
570                           List<JCTypeParameter> typarams,
571                           JCTree extending,
572                           List<JCExpression> implementing,
573                           List<JCTree> defs,
574                           ClassSymbol sym)
575        {
576            this.mods = mods;
577            this.name = name;
578            this.typarams = typarams;
579            this.extending = extending;
580            this.implementing = implementing;
581            this.defs = defs;
582            this.sym = sym;
583        }
584        @Override
585        public void accept(Visitor v) { v.visitClassDef(this); }
586 
587        public Kind getKind() { return Kind.CLASS; }
588        public JCModifiers getModifiers() { return mods; }
589        public Name getSimpleName() { return name; }
590        public List<JCTypeParameter> getTypeParameters() {
591            return typarams;
592        }
593        public JCTree getExtendsClause() { return extending; }
594        public List<JCExpression> getImplementsClause() {
595            return implementing;
596        }
597        public List<JCTree> getMembers() {
598            return defs;
599        }
600        @Override
601        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
602            return v.visitClass(this, d);
603        }
604 
605        @Override
606        public int getTag() {
607            return CLASSDEF;
608        }
609    }
610 
611    /**
612     * A method definition.
613     * @param modifiers method modifiers
614     * @param name method name
615     * @param restype type of method return value
616     * @param typarams type parameters
617     * @param params value parameters
618     * @param thrown exceptions thrown by this method
619     * @param stats statements in the method
620     * @param sym method symbol
621     */
622    public static class JCMethodDecl extends JCTree implements MethodTree {
623        public JCModifiers mods;
624        public Name name;
625        public JCExpression restype;
626        public List<JCTypeParameter> typarams;
627        public List<JCVariableDecl> params;
628        public List<JCExpression> thrown;
629        public JCBlock body;
630        public JCExpression defaultValue; // for annotation types
631        public MethodSymbol sym;
632        protected JCMethodDecl(JCModifiers mods,
633                            Name name,
634                            JCExpression restype,
635                            List<JCTypeParameter> typarams,
636                            List<JCVariableDecl> params,
637                            List<JCExpression> thrown,
638                            JCBlock body,
639                            JCExpression defaultValue,
640                            MethodSymbol sym)
641        {
642            this.mods = mods;
643            this.name = name;
644            this.restype = restype;
645            this.typarams = typarams;
646            this.params = params;
647            this.thrown = thrown;
648            this.body = body;
649            this.defaultValue = defaultValue;
650            this.sym = sym;
651        }
652        @Override
653        public void accept(Visitor v) { v.visitMethodDef(this); }
654 
655        public Kind getKind() { return Kind.METHOD; }
656        public JCModifiers getModifiers() { return mods; }
657        public Name getName() { return name; }
658        public JCTree getReturnType() { return restype; }
659        public List<JCTypeParameter> getTypeParameters() {
660            return typarams;
661        }
662        public List<JCVariableDecl> getParameters() {
663            return params;
664        }
665        public List<JCExpression> getThrows() {
666            return thrown;
667        }
668        public JCBlock getBody() { return body; }
669        public JCTree getDefaultValue() { // for annotation types
670            return defaultValue;
671        }
672        @Override
673        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
674            return v.visitMethod(this, d);
675        }
676 
677        @Override
678        public int getTag() {
679            return METHODDEF;
680        }
681  }
682 
683    /**
684     * A variable definition.
685     * @param modifiers variable modifiers
686     * @param name variable name
687     * @param vartype type of the variable
688     * @param init variables initial value
689     * @param sym symbol
690     */
691    public static class JCVariableDecl extends JCStatement implements VariableTree {
692        public JCModifiers mods;
693        public Name name;
694        public JCExpression vartype;
695        public JCExpression init;
696        public VarSymbol sym;
697        protected JCVariableDecl(JCModifiers mods,
698                         Name name,
699                         JCExpression vartype,
700                         JCExpression init,
701                         VarSymbol sym) {
702            this.mods = mods;
703            this.name = name;
704            this.vartype = vartype;
705            this.init = init;
706            this.sym = sym;
707        }
708        @Override
709        public void accept(Visitor v) { v.visitVarDef(this); }
710 
711        public Kind getKind() { return Kind.VARIABLE; }
712        public JCModifiers getModifiers() { return mods; }
713        public Name getName() { return name; }
714        public JCTree getType() { return vartype; }
715        public JCExpression getInitializer() {
716            return init;
717        }
718        @Override
719        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
720            return v.visitVariable(this, d);
721        }
722 
723        @Override
724        public int getTag() {
725            return VARDEF;
726        }
727    }
728 
729      /**
730     * A no-op statement ";".
731     */
732    public static class JCSkip extends JCStatement implements EmptyStatementTree {
733        protected JCSkip() {
734        }
735        @Override
736        public void accept(Visitor v) { v.visitSkip(this); }
737 
738        public Kind getKind() { return Kind.EMPTY_STATEMENT; }
739        @Override
740        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
741            return v.visitEmptyStatement(this, d);
742        }
743 
744        @Override
745        public int getTag() {
746            return SKIP;
747        }
748    }
749 
750    /**
751     * A statement block.
752     * @param stats statements
753     * @param flags flags
754     */
755    public static class JCBlock extends JCStatement implements BlockTree {
756        public long flags;
757        public List<JCStatement> stats;
758        /** Position of closing brace, optional. */
759        public int endpos = Position.NOPOS;
760        protected JCBlock(long flags, List<JCStatement> stats) {
761            this.stats = stats;
762            this.flags = flags;
763        }
764        @Override
765        public void accept(Visitor v) { v.visitBlock(this); }
766 
767        public Kind getKind() { return Kind.BLOCK; }
768        public List<JCStatement> getStatements() {
769            return stats;
770        }
771        public boolean isStatic() { return (flags & Flags.STATIC) != 0; }
772        @Override
773        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
774            return v.visitBlock(this, d);
775        }
776 
777        @Override
778        public int getTag() {
779            return BLOCK;
780        }
781    }
782 
783    /**
784     * A do loop
785     */
786    public static class JCDoWhileLoop extends JCStatement implements DoWhileLoopTree {
787        public JCStatement body;
788        public JCExpression cond;
789        protected JCDoWhileLoop(JCStatement body, JCExpression cond) {
790            this.body = body;
791            this.cond = cond;
792        }
793        @Override
794        public void accept(Visitor v) { v.visitDoLoop(this); }
795 
796        public Kind getKind() { return Kind.DO_WHILE_LOOP; }
797        public JCExpression getCondition() { return cond; }
798        public JCStatement getStatement() { return body; }
799        @Override
800        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
801            return v.visitDoWhileLoop(this, d);
802        }
803 
804        @Override
805        public int getTag() {
806            return DOLOOP;
807        }
808    }
809 
810    /**
811     * A while loop
812     */
813    public static class JCWhileLoop extends JCStatement implements WhileLoopTree {
814        public JCExpression cond;
815        public JCStatement body;
816        protected JCWhileLoop(JCExpression cond, JCStatement body) {
817            this.cond = cond;
818            this.body = body;
819        }
820        @Override
821        public void accept(Visitor v) { v.visitWhileLoop(this); }
822 
823        public Kind getKind() { return Kind.WHILE_LOOP; }
824        public JCExpression getCondition() { return cond; }
825        public JCStatement getStatement() { return body; }
826        @Override
827        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
828            return v.visitWhileLoop(this, d);
829        }
830 
831        @Override
832        public int getTag() {
833            return WHILELOOP;
834        }
835    }
836 
837    /**
838     * A for loop.
839     */
840    public static class JCForLoop extends JCStatement implements ForLoopTree {
841        public List<JCStatement> init;
842        public JCExpression cond;
843        public List<JCExpressionStatement> step;
844        public JCStatement body;
845        protected JCForLoop(List<JCStatement> init,
846                          JCExpression cond,
847                          List<JCExpressionStatement> update,
848                          JCStatement body)
849        {
850            this.init = init;
851            this.cond = cond;
852            this.step = update;
853            this.body = body;
854        }
855        @Override
856        public void accept(Visitor v) { v.visitForLoop(this); }
857 
858        public Kind getKind() { return Kind.FOR_LOOP; }
859        public JCExpression getCondition() { return cond; }
860        public JCStatement getStatement() { return body; }
861        public List<JCStatement> getInitializer() {
862            return init;
863        }
864        public List<JCExpressionStatement> getUpdate() {
865            return step;
866        }
867        @Override
868        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
869            return v.visitForLoop(this, d);
870        }
871 
872        @Override
873        public int getTag() {
874            return FORLOOP;
875        }
876    }
877 
878    /**
879     * The enhanced for loop.
880     */
881    public static class JCEnhancedForLoop extends JCStatement implements EnhancedForLoopTree {
882        public JCVariableDecl var;
883        public JCExpression expr;
884        public JCStatement body;
885        protected JCEnhancedForLoop(JCVariableDecl var, JCExpression expr, JCStatement body) {
886            this.var = var;
887            this.expr = expr;
888            this.body = body;
889        }
890        @Override
891        public void accept(Visitor v) { v.visitForeachLoop(this); }
892 
893        public Kind getKind() { return Kind.ENHANCED_FOR_LOOP; }
894        public JCVariableDecl getVariable() { return var; }
895        public JCExpression getExpression() { return expr; }
896        public JCStatement getStatement() { return body; }
897        @Override
898        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
899            return v.visitEnhancedForLoop(this, d);
900        }
901        @Override
902        public int getTag() {
903            return FOREACHLOOP;
904        }
905    }
906 
907    /**
908     * A labelled expression or statement.
909     */
910    public static class JCLabeledStatement extends JCStatement implements LabeledStatementTree {
911        public Name label;
912        public JCStatement body;
913        protected JCLabeledStatement(Name label, JCStatement body) {
914            this.label = label;
915            this.body = body;
916        }
917        @Override
918        public void accept(Visitor v) { v.visitLabelled(this); }
919        public Kind getKind() { return Kind.LABELED_STATEMENT; }
920        public Name getLabel() { return label; }
921        public JCStatement getStatement() { return body; }
922        @Override
923        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
924            return v.visitLabeledStatement(this, d);
925        }
926        @Override
927        public int getTag() {
928            return LABELLED;
929        }
930    }
931 
932    /**
933     * A "switch ( ) { }" construction.
934     */
935    public static class JCSwitch extends JCStatement implements SwitchTree {
936        public JCExpression selector;
937        public List<JCCase> cases;
938        protected JCSwitch(JCExpression selector, List<JCCase> cases) {
939            this.selector = selector;
940            this.cases = cases;
941        }
942        @Override
943        public void accept(Visitor v) { v.visitSwitch(this); }
944 
945        public Kind getKind() { return Kind.SWITCH; }
946        public JCExpression getExpression() { return selector; }
947        public List<JCCase> getCases() { return cases; }
948        @Override
949        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
950            return v.visitSwitch(this, d);
951        }
952        @Override
953        public int getTag() {
954            return SWITCH;
955        }
956    }
957 
958    /**
959     * A "case  :" of a switch.
960     */
961    public static class JCCase extends JCStatement implements CaseTree {
962        public JCExpression pat;
963        public List<JCStatement> stats;
964        protected JCCase(JCExpression pat, List<JCStatement> stats) {
965            this.pat = pat;
966            this.stats = stats;
967        }
968        @Override
969        public void accept(Visitor v) { v.visitCase(this); }
970 
971        public Kind getKind() { return Kind.CASE; }
972        public JCExpression getExpression() { return pat; }
973        public List<JCStatement> getStatements() { return stats; }
974        @Override
975        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
976            return v.visitCase(this, d);
977        }
978        @Override
979        public int getTag() {
980            return CASE;
981        }
982    }
983 
984    /**
985     * A synchronized block.
986     */
987    public static class JCSynchronized extends JCStatement implements SynchronizedTree {
988        public JCExpression lock;
989        public JCBlock body;
990        protected JCSynchronized(JCExpression lock, JCBlock body) {
991            this.lock = lock;
992            this.body = body;
993        }
994        @Override
995        public void accept(Visitor v) { v.visitSynchronized(this); }
996 
997        public Kind getKind() { return Kind.SYNCHRONIZED; }
998        public JCExpression getExpression() { return lock; }
999        public JCBlock getBlock() { return body; }
1000        @Override
1001        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1002            return v.visitSynchronized(this, d);
1003        }
1004        @Override
1005        public int getTag() {
1006            return SYNCHRONIZED;
1007        }
1008    }
1009 
1010    /**
1011     * A "try { } catch ( ) { } finally { }" block.
1012     */
1013    public static class JCTry extends JCStatement implements TryTree {
1014        public JCBlock body;
1015        public List<JCCatch> catchers;
1016        public JCBlock finalizer;
1017        protected JCTry(JCBlock body, List<JCCatch> catchers, JCBlock finalizer) {
1018            this.body = body;
1019            this.catchers = catchers;
1020            this.finalizer = finalizer;
1021        }
1022        @Override
1023        public void accept(Visitor v) { v.visitTry(this); }
1024 
1025        public Kind getKind() { return Kind.TRY; }
1026        public JCBlock getBlock() { return body; }
1027        public List<JCCatch> getCatches() {
1028            return catchers;
1029        }
1030        public JCBlock getFinallyBlock() { return finalizer; }
1031        @Override
1032        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1033            return v.visitTry(this, d);
1034        }
1035        @Override
1036        public int getTag() {
1037            return TRY;
1038        }
1039    }
1040 
1041    /**
1042     * A catch block.
1043     */
1044    public static class JCCatch extends JCTree implements CatchTree {
1045        public JCVariableDecl param;
1046        public JCBlock body;
1047        protected JCCatch(JCVariableDecl param, JCBlock body) {
1048            this.param = param;
1049            this.body = body;
1050        }
1051        @Override
1052        public void accept(Visitor v) { v.visitCatch(this); }
1053 
1054        public Kind getKind() { return Kind.CATCH; }
1055        public JCVariableDecl getParameter() { return param; }
1056        public JCBlock getBlock() { return body; }
1057        @Override
1058        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1059            return v.visitCatch(this, d);
1060        }
1061        @Override
1062        public int getTag() {
1063            return CATCH;
1064        }
1065    }
1066 
1067    /**
1068     * A ( ) ? ( ) : ( ) conditional expression
1069     */
1070    public static class JCConditional extends JCExpression implements ConditionalExpressionTree {
1071        public JCExpression cond;
1072        public JCExpression truepart;
1073        public JCExpression falsepart;
1074        protected JCConditional(JCExpression cond,
1075                              JCExpression truepart,
1076                              JCExpression falsepart)
1077        {
1078            this.cond = cond;
1079            this.truepart = truepart;
1080            this.falsepart = falsepart;
1081        }
1082        @Override
1083        public void accept(Visitor v) { v.visitConditional(this); }
1084 
1085        public Kind getKind() { return Kind.CONDITIONAL_EXPRESSION; }
1086        public JCExpression getCondition() { return cond; }
1087        public JCExpression getTrueExpression() { return truepart; }
1088        public JCExpression getFalseExpression() { return falsepart; }
1089        @Override
1090        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1091            return v.visitConditionalExpression(this, d);
1092        }
1093        @Override
1094        public int getTag() {
1095            return CONDEXPR;
1096        }
1097    }
1098 
1099    /**
1100     * An "if ( ) { } else { }" block
1101     */
1102    public static class JCIf extends JCStatement implements IfTree {
1103        public JCExpression cond;
1104        public JCStatement thenpart;
1105        public JCStatement elsepart;
1106        protected JCIf(JCExpression cond,
1107                     JCStatement thenpart,
1108                     JCStatement elsepart)
1109        {
1110            this.cond = cond;
1111            this.thenpart = thenpart;
1112            this.elsepart = elsepart;
1113        }
1114        @Override
1115        public void accept(Visitor v) { v.visitIf(this); }
1116 
1117        public Kind getKind() { return Kind.IF; }
1118        public JCExpression getCondition() { return cond; }
1119        public JCStatement getThenStatement() { return thenpart; }
1120        public JCStatement getElseStatement() { return elsepart; }
1121        @Override
1122        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1123            return v.visitIf(this, d);
1124        }
1125        @Override
1126        public int getTag() {
1127            return IF;
1128        }
1129    }
1130 
1131    /**
1132     * an expression statement
1133     * @param expr expression structure
1134     */
1135    public static class JCExpressionStatement extends JCStatement implements ExpressionStatementTree {
1136        public JCExpression expr;
1137        protected JCExpressionStatement(JCExpression expr)
1138        {
1139            this.expr = expr;
1140        }
1141        @Override
1142        public void accept(Visitor v) { v.visitExec(this); }
1143 
1144        public Kind getKind() { return Kind.EXPRESSION_STATEMENT; }
1145        public JCExpression getExpression() { return expr; }
1146        @Override
1147        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1148            return v.visitExpressionStatement(this, d);
1149        }
1150        @Override
1151        public int getTag() {
1152            return EXEC;
1153        }
1154    }
1155 
1156    /**
1157     * A break from a loop or switch.
1158     */
1159    public static class JCBreak extends JCStatement implements BreakTree {
1160        public Name label;
1161        public JCTree target;
1162        protected JCBreak(Name label, JCTree target) {
1163            this.label = label;
1164            this.target = target;
1165        }
1166        @Override
1167        public void accept(Visitor v) { v.visitBreak(this); }
1168 
1169        public Kind getKind() { return Kind.BREAK; }
1170        public Name getLabel() { return label; }
1171        @Override
1172        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1173            return v.visitBreak(this, d);
1174        }
1175        @Override
1176        public int getTag() {
1177            return BREAK;
1178        }
1179    }
1180 
1181    /**
1182     * A continue of a loop.
1183     */
1184    public static class JCContinue extends JCStatement implements ContinueTree {
1185        public Name label;
1186        public JCTree target;
1187        protected JCContinue(Name label, JCTree target) {
1188            this.label = label;
1189            this.target = target;
1190        }
1191        @Override
1192        public void accept(Visitor v) { v.visitContinue(this); }
1193 
1194        public Kind getKind() { return Kind.CONTINUE; }
1195        public Name getLabel() { return label; }
1196        @Override
1197        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1198            return v.visitContinue(this, d);
1199        }
1200        @Override
1201        public int getTag() {
1202            return CONTINUE;
1203        }
1204    }
1205 
1206    /**
1207     * A return statement.
1208     */
1209    public static class JCReturn extends JCStatement implements ReturnTree {
1210        public JCExpression expr;
1211        protected JCReturn(JCExpression expr) {
1212            this.expr = expr;
1213        }
1214        @Override
1215        public void accept(Visitor v) { v.visitReturn(this); }
1216 
1217        public Kind getKind() { return Kind.RETURN; }
1218        public JCExpression getExpression() { return expr; }
1219        @Override
1220        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1221            return v.visitReturn(this, d);
1222        }
1223        @Override
1224        public int getTag() {
1225            return RETURN;
1226        }
1227    }
1228 
1229    /**
1230     * A throw statement.
1231     */
1232    public static class JCThrow extends JCStatement implements ThrowTree {
1233        public JCExpression expr;
1234        protected JCThrow(JCTree expr) {
1235            this.expr = (JCExpression)expr;
1236        }
1237        @Override
1238        public void accept(Visitor v) { v.visitThrow(this); }
1239 
1240        public Kind getKind() { return Kind.THROW; }
1241        public JCExpression getExpression() { return expr; }
1242        @Override
1243        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1244            return v.visitThrow(this, d);
1245        }
1246        @Override
1247        public int getTag() {
1248            return THROW;
1249        }
1250    }
1251 
1252    /**
1253     * An assert statement.
1254     */
1255    public static class JCAssert extends JCStatement implements AssertTree {
1256        public JCExpression cond;
1257        public JCExpression detail;
1258        protected JCAssert(JCExpression cond, JCExpression detail) {
1259            this.cond = cond;
1260            this.detail = detail;
1261        }
1262        @Override
1263        public void accept(Visitor v) { v.visitAssert(this); }
1264 
1265        public Kind getKind() { return Kind.ASSERT; }
1266        public JCExpression getCondition() { return cond; }
1267        public JCExpression getDetail() { return detail; }
1268        @Override
1269        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1270            return v.visitAssert(this, d);
1271        }
1272        @Override
1273        public int getTag() {
1274            return ASSERT;
1275        }
1276    }
1277 
1278    /**
1279     * A method invocation
1280     */
1281    public static class JCMethodInvocation extends JCExpression implements MethodInvocationTree {
1282        public List<JCExpression> typeargs;
1283        public JCExpression meth;
1284        public List<JCExpression> args;
1285        public Type varargsElement;
1286        protected JCMethodInvocation(List<JCExpression> typeargs,
1287                        JCExpression meth,
1288                        List<JCExpression> args)
1289        {
1290            this.typeargs = (typeargs == null) ? List.<JCExpression>nil()
1291                                               : typeargs;
1292            this.meth = meth;
1293            this.args = args;
1294        }
1295        @Override
1296        public void accept(Visitor v) { v.visitApply(this); }
1297 
1298        public Kind getKind() { return Kind.METHOD_INVOCATION; }
1299        public List<JCExpression> getTypeArguments() {
1300            return typeargs;
1301        }
1302        public JCExpression getMethodSelect() { return meth; }
1303        public List<JCExpression> getArguments() {
1304            return args;
1305        }
1306        @Override
1307        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1308            return v.visitMethodInvocation(this, d);
1309        }
1310        @Override
1311        public JCMethodInvocation setType(Type type) {
1312            super.setType(type);
1313            return this;
1314        }
1315        @Override
1316        public int getTag() {
1317            return(APPLY);
1318        }
1319    }
1320 
1321    /**
1322     * A new(...) operation.
1323     */
1324    public static class JCNewClass extends JCExpression implements NewClassTree {
1325        public JCExpression encl;
1326        public List<JCExpression> typeargs;
1327        public JCExpression clazz;
1328        public List<JCExpression> args;
1329        public JCClassDecl def;
1330        public Symbol constructor;
1331        public Type varargsElement;
1332        protected JCNewClass(JCExpression encl,
1333                           List<JCExpression> typeargs,
1334                           JCExpression clazz,
1335                           List<JCExpression> args,
1336                           JCClassDecl def)
1337        {
1338            this.encl = encl;
1339            this.typeargs = (typeargs == null) ? List.<JCExpression>nil()
1340                                               : typeargs;
1341            this.clazz = clazz;
1342            this.args = args;
1343            this.def = def;
1344        }
1345        @Override
1346        public void accept(Visitor v) { v.visitNewClass(this); }
1347 
1348        public Kind getKind() { return Kind.NEW_CLASS; }
1349        public JCExpression getEnclosingExpression() { // expr.new C< ... > ( ... )
1350            return encl;
1351        }
1352        public List<JCExpression> getTypeArguments() {
1353            return typeargs;
1354        }
1355        public JCExpression getIdentifier() { return clazz; }
1356        public List<JCExpression> getArguments() {
1357            return args;
1358        }
1359        public JCClassDecl getClassBody() { return def; }
1360        @Override
1361        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1362            return v.visitNewClass(this, d);
1363        }
1364        @Override
1365        public int getTag() {
1366            return NEWCLASS;
1367        }
1368    }
1369 
1370    /**
1371     * A new[...] operation.
1372     */
1373    public static class JCNewArray extends JCExpression implements NewArrayTree {
1374        public JCExpression elemtype;
1375        public List<JCExpression> dims;
1376        public List<JCExpression> elems;
1377        protected JCNewArray(JCExpression elemtype,
1378                           List<JCExpression> dims,
1379                           List<JCExpression> elems)
1380        {
1381            this.elemtype = elemtype;
1382            this.dims = dims;
1383            this.elems = elems;
1384        }
1385        @Override
1386        public void accept(Visitor v) { v.visitNewArray(this); }
1387 
1388        public Kind getKind() { return Kind.NEW_ARRAY; }
1389        public JCExpression getType() { return elemtype; }
1390        public List<JCExpression> getDimensions() {
1391            return dims;
1392        }
1393        public List<JCExpression> getInitializers() {
1394            return elems;
1395        }
1396        @Override
1397        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1398            return v.visitNewArray(this, d);
1399        }
1400        @Override
1401        public int getTag() {
1402            return NEWARRAY;
1403        }
1404    }
1405 
1406    /**
1407     * A parenthesized subexpression ( ... )
1408     */
1409    public static class JCParens extends JCExpression implements ParenthesizedTree {
1410        public JCExpression expr;
1411        protected JCParens(JCExpression expr) {
1412            this.expr = expr;
1413        }
1414        @Override
1415        public void accept(Visitor v) { v.visitParens(this); }
1416 
1417        public Kind getKind() { return Kind.PARENTHESIZED; }
1418        public JCExpression getExpression() { return expr; }
1419        @Override
1420        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1421            return v.visitParenthesized(this, d);
1422        }
1423        @Override
1424        public int getTag() {
1425            return PARENS;
1426        }
1427    }
1428 
1429    /**
1430     * A assignment with "=".
1431     */
1432    public static class JCAssign extends JCExpression implements AssignmentTree {
1433        public JCExpression lhs;
1434        public JCExpression rhs;
1435        protected JCAssign(JCExpression lhs, JCExpression rhs) {
1436            this.lhs = lhs;
1437            this.rhs = rhs;
1438        }
1439        @Override
1440        public void accept(Visitor v) { v.visitAssign(this); }
1441 
1442        public Kind getKind() { return Kind.ASSIGNMENT; }
1443        public JCExpression getVariable() { return lhs; }
1444        public JCExpression getExpression() { return rhs; }
1445        @Override
1446        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1447            return v.visitAssignment(this, d);
1448        }
1449        @Override
1450        public int getTag() {
1451            return ASSIGN;
1452        }
1453    }
1454 
1455    /**
1456     * An assignment with "+=", "|=" ...
1457     */
1458    public static class JCAssignOp extends JCExpression implements CompoundAssignmentTree {
1459        private int opcode;
1460        public JCExpression lhs;
1461        public JCExpression rhs;
1462        public Symbol operator;
1463        protected JCAssignOp(int opcode, JCTree lhs, JCTree rhs, Symbol operator) {
1464            this.opcode = opcode;
1465            this.lhs = (JCExpression)lhs;
1466            this.rhs = (JCExpression)rhs;
1467            this.operator = operator;
1468        }
1469        @Override
1470        public void accept(Visitor v) { v.visitAssignop(this); }
1471 
1472        public Kind getKind() { return TreeInfo.tagToKind(getTag()); }
1473        public JCExpression getVariable() { return lhs; }
1474        public JCExpression getExpression() { return rhs; }
1475        public Symbol getOperator() {
1476            return operator;
1477        }
1478        @Override
1479        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1480            return v.visitCompoundAssignment(this, d);
1481        }
1482        @Override
1483        public int getTag() {
1484            return opcode;
1485        }
1486    }
1487 
1488    /**
1489     * A unary operation.
1490     */
1491    public static class JCUnary extends JCExpression implements UnaryTree {
1492        private int opcode;
1493        public JCExpression arg;
1494        public Symbol operator;
1495        protected JCUnary(int opcode, JCExpression arg) {
1496            this.opcode = opcode;
1497            this.arg = arg;
1498        }
1499        @Override
1500        public void accept(Visitor v) { v.visitUnary(this); }
1501 
1502        public Kind getKind() { return TreeInfo.tagToKind(getTag()); }
1503        public JCExpression getExpression() { return arg; }
1504        public Symbol getOperator() {
1505            return operator;
1506        }
1507        @Override
1508        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1509            return v.visitUnary(this, d);
1510        }
1511        @Override
1512        public int getTag() {
1513            return opcode;
1514        }
1515 
1516        public void setTag(int tag) {
1517            opcode = tag;
1518        }
1519    }
1520 
1521    /**
1522     * A binary operation.
1523     */
1524    public static class JCBinary extends JCExpression implements BinaryTree {
1525        private int opcode;
1526        public JCExpression lhs;
1527        public JCExpression rhs;
1528        public Symbol operator;
1529        protected JCBinary(int opcode,
1530                         JCExpression lhs,
1531                         JCExpression rhs,
1532                         Symbol operator) {
1533            this.opcode = opcode;
1534            this.lhs = lhs;
1535            this.rhs = rhs;
1536            this.operator = operator;
1537        }
1538        @Override
1539        public void accept(Visitor v) { v.visitBinary(this); }
1540 
1541        public Kind getKind() { return TreeInfo.tagToKind(getTag()); }
1542        public JCExpression getLeftOperand() { return lhs; }
1543        public JCExpression getRightOperand() { return rhs; }
1544        public Symbol getOperator() {
1545            return operator;
1546        }
1547        @Override
1548        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1549            return v.visitBinary(this, d);
1550        }
1551        @Override
1552        public int getTag() {
1553            return opcode;
1554        }
1555    }
1556 
1557    /**
1558     * A type cast.
1559     */
1560    public static class JCTypeCast extends JCExpression implements TypeCastTree {
1561        public JCTree clazz;
1562        public JCExpression expr;
1563        protected JCTypeCast(JCTree clazz, JCExpression expr) {
1564            this.clazz = clazz;
1565            this.expr = expr;
1566        }
1567        @Override
1568        public void accept(Visitor v) { v.visitTypeCast(this); }
1569 
1570        public Kind getKind() { return Kind.TYPE_CAST; }
1571        public JCTree getType() { return clazz; }
1572        public JCExpression getExpression() { return expr; }
1573        @Override
1574        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1575            return v.visitTypeCast(this, d);
1576        }
1577        @Override
1578        public int getTag() {
1579            return TYPECAST;
1580        }
1581    }
1582 
1583    /**
1584     * A type test.
1585     */
1586    public static class JCInstanceOf extends JCExpression implements InstanceOfTree {
1587        public JCExpression expr;
1588        public JCTree clazz;
1589        protected JCInstanceOf(JCExpression expr, JCTree clazz) {
1590            this.expr = expr;
1591            this.clazz = clazz;
1592        }
1593        @Override
1594        public void accept(Visitor v) { v.visitTypeTest(this); }
1595 
1596        public Kind getKind() { return Kind.INSTANCE_OF; }
1597        public JCTree getType() { return clazz; }
1598        public JCExpression getExpression() { return expr; }
1599        @Override
1600        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1601            return v.visitInstanceOf(this, d);
1602        }
1603        @Override
1604        public int getTag() {
1605            return TYPETEST;
1606        }
1607    }
1608 
1609    /**
1610     * An array selection
1611     */
1612    public static class JCArrayAccess extends JCExpression implements ArrayAccessTree {
1613        public JCExpression indexed;
1614        public JCExpression index;
1615        protected JCArrayAccess(JCExpression indexed, JCExpression index) {
1616            this.indexed = indexed;
1617            this.index = index;
1618        }
1619        @Override
1620        public void accept(Visitor v) { v.visitIndexed(this); }
1621 
1622        public Kind getKind() { return Kind.ARRAY_ACCESS; }
1623        public JCExpression getExpression() { return indexed; }
1624        public JCExpression getIndex() { return index; }
1625        @Override
1626        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1627            return v.visitArrayAccess(this, d);
1628        }
1629        @Override
1630        public int getTag() {
1631            return INDEXED;
1632        }
1633    }
1634 
1635    /**
1636     * Selects through packages and classes
1637     * @param selected selected Tree hierarchie
1638     * @param selector name of field to select thru
1639     * @param sym symbol of the selected class
1640     */
1641    public static class JCFieldAccess extends JCExpression implements MemberSelectTree {
1642        public JCExpression selected;
1643        public Name name;
1644        public Symbol sym;
1645        protected JCFieldAccess(JCExpression selected, Name name, Symbol sym) {
1646            this.selected = selected;
1647            this.name = name;
1648            this.sym = sym;
1649        }
1650        @Override
1651        public void accept(Visitor v) { v.visitSelect(this); }
1652 
1653        public Kind getKind() { return Kind.MEMBER_SELECT; }
1654        public JCExpression getExpression() { return selected; }
1655        @Override
1656        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1657            return v.visitMemberSelect(this, d);
1658        }
1659        public Name getIdentifier() { return name; }
1660        @Override
1661        public int getTag() {
1662            return SELECT;
1663        }
1664    }
1665 
1666    /**
1667     * An identifier
1668     * @param idname the name
1669     * @param sym the symbol
1670     */
1671    public static class JCIdent extends JCExpression implements IdentifierTree {
1672        public Name name;
1673        public Symbol sym;
1674        protected JCIdent(Name name, Symbol sym) {
1675            this.name = name;
1676            this.sym = sym;
1677        }
1678        @Override
1679        public void accept(Visitor v) { v.visitIdent(this); }
1680 
1681        public Kind getKind() { return Kind.IDENTIFIER; }
1682        public Name getName() { return name; }
1683        @Override
1684        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1685            return v.visitIdentifier(this, d);
1686        }
1687        public int getTag() {
1688            return IDENT;
1689        }
1690    }
1691 
1692    /**
1693     * A constant value given literally.
1694     * @param value value representation
1695     */
1696    public static class JCLiteral extends JCExpression implements LiteralTree {
1697        public int typetag;
1698        public Object value;
1699        protected JCLiteral(int typetag, Object value) {
1700            this.typetag = typetag;
1701            this.value = value;
1702        }
1703        @Override
1704        public void accept(Visitor v) { v.visitLiteral(this); }
1705 
1706        public Kind getKind() {
1707            switch (typetag) {
1708            case TypeTags.INT:
1709                return Kind.INT_LITERAL;
1710            case TypeTags.LONG:
1711                return Kind.LONG_LITERAL;
1712            case TypeTags.FLOAT:
1713                return Kind.FLOAT_LITERAL;
1714            case TypeTags.DOUBLE:
1715                return Kind.DOUBLE_LITERAL;
1716            case TypeTags.BOOLEAN:
1717                return Kind.BOOLEAN_LITERAL;
1718            case TypeTags.CHAR:
1719                return Kind.CHAR_LITERAL;
1720            case TypeTags.CLASS:
1721                return Kind.STRING_LITERAL;
1722            case TypeTags.BOT:
1723                return Kind.NULL_LITERAL;
1724            default:
1725                throw new AssertionError("unknown literal kind " + this);
1726            }
1727        }
1728        public Object getValue() {
1729            switch (typetag) {
1730                case TypeTags.BOOLEAN:
1731                    int bi = (Integer) value;
1732                    return (bi != 0);
1733                case TypeTags.CHAR:
1734                    int ci = (Integer) value;
1735                    char c = (char) ci;
1736                    if (c != ci)
1737                        throw new AssertionError("bad value for char literal");
1738                    return c;
1739                default:
1740                    return value;
1741            }
1742        }
1743        @Override
1744        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1745            return v.visitLiteral(this, d);
1746        }
1747        @Override
1748        public JCLiteral setType(Type type) {
1749            super.setType(type);
1750            return this;
1751        }
1752        @Override
1753        public int getTag() {
1754            return LITERAL;
1755        }
1756    }
1757 
1758    /**
1759     * Identifies a basic type.
1760     * @param tag the basic type id
1761     * @see TypeTags
1762     */
1763    public static class JCPrimitiveTypeTree extends JCExpression implements PrimitiveTypeTree {
1764        public int typetag;
1765        protected JCPrimitiveTypeTree(int typetag) {
1766            this.typetag = typetag;
1767        }
1768        @Override
1769        public void accept(Visitor v) { v.visitTypeIdent(this); }
1770 
1771        public Kind getKind() { return Kind.PRIMITIVE_TYPE; }
1772        public TypeKind getPrimitiveTypeKind() {
1773            switch (typetag) {
1774            case TypeTags.BOOLEAN:
1775                return TypeKind.BOOLEAN;
1776            case TypeTags.BYTE:
1777                return TypeKind.BYTE;
1778            case TypeTags.SHORT:
1779                return TypeKind.SHORT;
1780            case TypeTags.INT:
1781                return TypeKind.INT;
1782            case TypeTags.LONG:
1783                return TypeKind.LONG;
1784            case TypeTags.CHAR:
1785                return TypeKind.CHAR;
1786            case TypeTags.FLOAT:
1787                return TypeKind.FLOAT;
1788            case TypeTags.DOUBLE:
1789                return TypeKind.DOUBLE;
1790            case TypeTags.VOID:
1791                return TypeKind.VOID;
1792            default:
1793                throw new AssertionError("unknown primitive type " + this);
1794            }
1795        }
1796        @Override
1797        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1798            return v.visitPrimitiveType(this, d);
1799        }
1800        @Override
1801        public int getTag() {
1802            return TYPEIDENT;
1803        }
1804    }
1805 
1806    /**
1807     * An array type, A[]
1808     */
1809    public static class JCArrayTypeTree extends JCExpression implements ArrayTypeTree {
1810        public JCExpression elemtype;
1811        protected JCArrayTypeTree(JCExpression elemtype) {
1812            this.elemtype = elemtype;
1813        }
1814        @Override
1815        public void accept(Visitor v) { v.visitTypeArray(this); }
1816 
1817        public Kind getKind() { return Kind.ARRAY_TYPE; }
1818        public JCTree getType() { return elemtype; }
1819        @Override
1820        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1821            return v.visitArrayType(this, d);
1822        }
1823        @Override
1824        public int getTag() {
1825            return TYPEARRAY;
1826        }
1827    }
1828 
1829    /**
1830     * A parameterized type, T<...>
1831     */
1832    public static class JCTypeApply extends JCExpression implements ParameterizedTypeTree {
1833        public JCExpression clazz;
1834        public List<JCExpression> arguments;
1835        protected JCTypeApply(JCExpression clazz, List<JCExpression> arguments) {
1836            this.clazz = clazz;
1837            this.arguments = arguments;
1838        }
1839        @Override
1840        public void accept(Visitor v) { v.visitTypeApply(this); }
1841 
1842        public Kind getKind() { return Kind.PARAMETERIZED_TYPE; }
1843        public JCTree getType() { return clazz; }
1844        public List<JCExpression> getTypeArguments() {
1845            return arguments;
1846        }
1847        @Override
1848        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1849            return v.visitParameterizedType(this, d);
1850        }
1851        @Override
1852        public int getTag() {
1853            return TYPEAPPLY;
1854        }
1855    }
1856 
1857    /**
1858     * A formal class parameter.
1859     * @param name name
1860     * @param bounds bounds
1861     */
1862    public static class JCTypeParameter extends JCTree implements TypeParameterTree {
1863        public Name name;
1864        public List<JCExpression> bounds;
1865        protected JCTypeParameter(Name name, List<JCExpression> bounds) {
1866            this.name = name;
1867            this.bounds = bounds;
1868        }
1869        @Override
1870        public void accept(Visitor v) { v.visitTypeParameter(this); }
1871 
1872        public Kind getKind() { return Kind.TYPE_PARAMETER; }
1873        public Name getName() { return name; }
1874        public List<JCExpression> getBounds() {
1875            return bounds;
1876        }
1877        @Override
1878        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1879            return v.visitTypeParameter(this, d);
1880        }
1881        @Override
1882        public int getTag() {
1883            return TYPEPARAMETER;
1884        }
1885    }
1886 
1887    public static class JCWildcard extends JCExpression implements WildcardTree {
1888        public TypeBoundKind kind;
1889        public JCTree inner;
1890        protected JCWildcard(TypeBoundKind kind, JCTree inner) {
1891            kind.getClass(); // null-check
1892            this.kind = kind;
1893            this.inner = inner;
1894        }
1895        @Override
1896        public void accept(Visitor v) { v.visitWildcard(this); }
1897 
1898        public Kind getKind() {
1899            switch (kind.kind) {
1900            case UNBOUND:
1901                return Kind.UNBOUNDED_WILDCARD;
1902            case EXTENDS:
1903                return Kind.EXTENDS_WILDCARD;
1904            case SUPER:
1905                return Kind.SUPER_WILDCARD;
1906            default:
1907                throw new AssertionError("Unknown wildcard bound " + kind);
1908            }
1909        }
1910        public JCTree getBound() { return inner; }
1911        @Override
1912        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1913            return v.visitWildcard(this, d);
1914        }
1915        @Override
1916        public int getTag() {
1917            return WILDCARD;
1918        }
1919    }
1920 
1921    public static class TypeBoundKind extends JCTree {
1922        public BoundKind kind;
1923        protected TypeBoundKind(BoundKind kind) {
1924            this.kind = kind;
1925        }
1926        @Override
1927        public void accept(Visitor v) { v.visitTypeBoundKind(this); }
1928 
1929        public Kind getKind() {
1930            throw new AssertionError("TypeBoundKind is not part of a public API");
1931        }
1932        @Override
1933        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1934            throw new AssertionError("TypeBoundKind is not part of a public API");
1935        }
1936        @Override
1937        public int getTag() {
1938            return TYPEBOUNDKIND;
1939        }
1940    }
1941 
1942    public static class JCAnnotation extends JCExpression implements AnnotationTree {
1943        public JCTree annotationType;
1944        public List<JCExpression> args;
1945        protected JCAnnotation(JCTree annotationType, List<JCExpression> args) {
1946            this.annotationType = annotationType;
1947            this.args = args;
1948        }
1949        @Override
1950        public void accept(Visitor v) { v.visitAnnotation(this); }
1951 
1952        public Kind getKind() { return Kind.ANNOTATION; }
1953        public JCTree getAnnotationType() { return annotationType; }
1954        public List<JCExpression> getArguments() {
1955            return args;
1956        }
1957        @Override
1958        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1959            return v.visitAnnotation(this, d);
1960        }
1961        @Override
1962        public int getTag() {
1963            return ANNOTATION;
1964        }
1965    }
1966 
1967    public static class JCModifiers extends JCTree implements com.sun.source.tree.ModifiersTree {
1968        public long flags;
1969        public List<JCAnnotation> annotations;
1970        protected JCModifiers(long flags, List<JCAnnotation> annotations) {
1971            this.flags = flags;
1972            this.annotations = annotations;
1973        }
1974        @Override
1975        public void accept(Visitor v) { v.visitModifiers(this); }
1976 
1977        public Kind getKind() { return Kind.MODIFIERS; }
1978        public Set<Modifier> getFlags() {
1979            return Flags.asModifierSet(flags);
1980        }
1981        public List<JCAnnotation> getAnnotations() {
1982            return annotations;
1983        }
1984        @Override
1985        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
1986            return v.visitModifiers(this, d);
1987        }
1988        @Override
1989        public int getTag() {
1990            return MODIFIERS;
1991        }
1992    }
1993 
1994    public static class JCErroneous extends JCExpression
1995            implements com.sun.source.tree.ErroneousTree {
1996        public List<? extends JCTree> errs;
1997        protected JCErroneous(List<? extends JCTree> errs) {
1998            this.errs = errs;
1999        }
2000        @Override
2001        public void accept(Visitor v) { v.visitErroneous(this); }
2002 
2003        public Kind getKind() { return Kind.ERRONEOUS; }
2004 
2005        public List<? extends JCTree> getErrorTrees() {
2006            return errs;
2007        }
2008 
2009        @Override
2010        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2011            return v.visitErroneous(this, d);
2012        }
2013        @Override
2014        public int getTag() {
2015            return ERRONEOUS;
2016        }
2017    }
2018 
2019    /** (let int x = 3; in x+2) */
2020    public static class LetExpr extends JCExpression {
2021        public List<JCVariableDecl> defs;
2022        public JCTree expr;
2023        protected LetExpr(List<JCVariableDecl> defs, JCTree expr) {
2024            this.defs = defs;
2025            this.expr = expr;
2026        }
2027        @Override
2028        public void accept(Visitor v) { v.visitLetExpr(this); }
2029 
2030        public Kind getKind() {
2031            throw new AssertionError("LetExpr is not part of a public API");
2032        }
2033        @Override
2034        public <R,D> R accept(TreeVisitor<R,D> v, D d) {
2035            throw new AssertionError("LetExpr is not part of a public API");
2036        }
2037        @Override
2038        public int getTag() {
2039            return LETEXPR;
2040        }
2041    }
2042 
2043    /** An interface for tree factories
2044     */
2045    public interface Factory {
2046        JCCompilationUnit TopLevel(List<JCAnnotation> packageAnnotations,
2047                                   JCExpression pid,
2048                                   List<JCTree> defs);
2049        JCImport Import(JCTree qualid, boolean staticImport);
2050        JCClassDecl ClassDef(JCModifiers mods,
2051                          Name name,
2052                          List<JCTypeParameter> typarams,
2053                          JCTree extending,
2054                          List<JCExpression> implementing,
2055                          List<JCTree> defs);
2056        JCMethodDecl MethodDef(JCModifiers mods,
2057                            Name name,
2058                            JCExpression restype,
2059                            List<JCTypeParameter> typarams,
2060                            List<JCVariableDecl> params,
2061                            List<JCExpression> thrown,
2062                            JCBlock body,
2063                            JCExpression defaultValue);
2064        JCVariableDecl VarDef(JCModifiers mods,
2065                      Name name,
2066                      JCExpression vartype,
2067                      JCExpression init);
2068        JCSkip Skip();
2069        JCBlock Block(long flags, List<JCStatement> stats);
2070        JCDoWhileLoop DoLoop(JCStatement body, JCExpression cond);
2071        JCWhileLoop WhileLoop(JCExpression cond, JCStatement body);
2072        JCForLoop ForLoop(List<JCStatement> init,
2073                        JCExpression cond,
2074                        List<JCExpressionStatement> step,
2075                        JCStatement body);
2076        JCEnhancedForLoop ForeachLoop(JCVariableDecl var, JCExpression expr, JCStatement body);
2077        JCLabeledStatement Labelled(Name label, JCStatement body);
2078        JCSwitch Switch(JCExpression selector, List<JCCase> cases);
2079        JCCase Case(JCExpression pat, List<JCStatement> stats);
2080        JCSynchronized Synchronized(JCExpression lock, JCBlock body);
2081        JCTry Try(JCBlock body, List<JCCatch> catchers, JCBlock finalizer);
2082        JCCatch Catch(JCVariableDecl param, JCBlock body);
2083        JCConditional Conditional(JCExpression cond,
2084                                JCExpression thenpart,
2085                                JCExpression elsepart);
2086        JCIf If(JCExpression cond, JCStatement thenpart, JCStatement elsepart);
2087        JCExpressionStatement Exec(JCExpression expr);
2088        JCBreak Break(Name label);
2089        JCContinue Continue(Name label);
2090        JCReturn Return(JCExpression expr);
2091        JCThrow Throw(JCTree expr);
2092        JCAssert Assert(JCExpression cond, JCExpression detail);
2093        JCMethodInvocation Apply(List<JCExpression> typeargs,
2094                    JCExpression fn,
2095                    List<JCExpression> args);
2096        JCNewClass NewClass(JCExpression encl,
2097                          List<JCExpression> typeargs,
2098                          JCExpression clazz,
2099                          List<JCExpression> args,
2100                          JCClassDecl def);
2101        JCNewArray NewArray(JCExpression elemtype,
2102                          List<JCExpression> dims,
2103                          List<JCExpression> elems);
2104        JCParens Parens(JCExpression expr);
2105        JCAssign Assign(JCExpression lhs, JCExpression rhs);
2106        JCAssignOp Assignop(int opcode, JCTree lhs, JCTree rhs);
2107        JCUnary Unary(int opcode, JCExpression arg);
2108        JCBinary Binary(int opcode, JCExpression lhs, JCExpression rhs);
2109        JCTypeCast TypeCast(JCTree expr, JCExpression type);
2110        JCInstanceOf TypeTest(JCExpression expr, JCTree clazz);
2111        JCArrayAccess Indexed(JCExpression indexed, JCExpression index);
2112        JCFieldAccess Select(JCExpression selected, Name selector);
2113        JCIdent Ident(Name idname);
2114        JCLiteral Literal(int tag, Object value);
2115        JCPrimitiveTypeTree TypeIdent(int typetag);
2116        JCArrayTypeTree TypeArray(JCExpression elemtype);
2117        JCTypeApply TypeApply(JCExpression clazz, List<JCExpression> arguments);
2118        JCTypeParameter TypeParameter(Name name, List<JCExpression> bounds);
2119        JCWildcard Wildcard(TypeBoundKind kind, JCTree type);
2120        TypeBoundKind TypeBoundKind(BoundKind kind);
2121        JCAnnotation Annotation(JCTree annotationType, List<JCExpression> args);
2122        JCModifiers Modifiers(long flags, List<JCAnnotation> annotations);
2123        JCErroneous Erroneous(List<? extends JCTree> errs);
2124        LetExpr LetExpr(List<JCVariableDecl> defs, JCTree expr);
2125    }
2126 
2127    /** A generic visitor class for trees.
2128     */
2129    public static abstract class Visitor {
2130        public void visitTopLevel(JCCompilationUnit that)    { visitTree(that); }
2131        public void visitImport(JCImport that)               { visitTree(that); }
2132        public void visitClassDef(JCClassDecl that)          { visitTree(that); }
2133        public void visitMethodDef(JCMethodDecl that)        { visitTree(that); }
2134        public void visitVarDef(JCVariableDecl that)         { visitTree(that); }
2135        public void visitSkip(JCSkip that)                   { visitTree(that); }
2136        public void visitBlock(JCBlock that)                 { visitTree(that); }
2137        public void visitDoLoop(JCDoWhileLoop that)          { visitTree(that); }
2138        public void visitWhileLoop(JCWhileLoop that)         { visitTree(that); }
2139        public void visitForLoop(JCForLoop that)             { visitTree(that); }
2140        public void visitForeachLoop(JCEnhancedForLoop that) { visitTree(that); }
2141        public void visitLabelled(JCLabeledStatement that)   { visitTree(that); }
2142        public void visitSwitch(JCSwitch that)               { visitTree(that); }
2143        public void visitCase(JCCase that)                   { visitTree(that); }
2144        public void visitSynchronized(JCSynchronized that)   { visitTree(that); }
2145        public void visitTry(JCTry that)                     { visitTree(that); }
2146        public void visitCatch(JCCatch that)                 { visitTree(that); }
2147        public void visitConditional(JCConditional that)     { visitTree(that); }
2148        public void visitIf(JCIf that)                       { visitTree(that); }
2149        public void visitExec(JCExpressionStatement that)    { visitTree(that); }
2150        public void visitBreak(JCBreak that)                 { visitTree(that); }
2151        public void visitContinue(JCContinue that)           { visitTree(that); }
2152        public void visitReturn(JCReturn that)               { visitTree(that); }
2153        public void visitThrow(JCThrow that)                 { visitTree(that); }
2154        public void visitAssert(JCAssert that)               { visitTree(that); }
2155        public void visitApply(JCMethodInvocation that)      { visitTree(that); }
2156        public void visitNewClass(JCNewClass that)           { visitTree(that); }
2157        public void visitNewArray(JCNewArray that)           { visitTree(that); }
2158        public void visitParens(JCParens that)               { visitTree(that); }
2159        public void visitAssign(JCAssign that)               { visitTree(that); }
2160        public void visitAssignop(JCAssignOp that)           { visitTree(that); }
2161        public void visitUnary(JCUnary that)                 { visitTree(that); }
2162        public void visitBinary(JCBinary that)               { visitTree(that); }
2163        public void visitTypeCast(JCTypeCast that)           { visitTree(that); }
2164        public void visitTypeTest(JCInstanceOf that)         { visitTree(that); }
2165        public void visitIndexed(JCArrayAccess that)         { visitTree(that); }
2166        public void visitSelect(JCFieldAccess that)          { visitTree(that); }
2167        public void visitIdent(JCIdent that)                 { visitTree(that); }
2168        public void visitLiteral(JCLiteral that)             { visitTree(that); }
2169        public void visitTypeIdent(JCPrimitiveTypeTree that) { visitTree(that); }
2170        public void visitTypeArray(JCArrayTypeTree that)     { visitTree(that); }
2171        public void visitTypeApply(JCTypeApply that)         { visitTree(that); }
2172        public void visitTypeParameter(JCTypeParameter that) { visitTree(that); }
2173        public void visitWildcard(JCWildcard that)           { visitTree(that); }
2174        public void visitTypeBoundKind(TypeBoundKind that)   { visitTree(that); }
2175        public void visitAnnotation(JCAnnotation that)       { visitTree(that); }
2176        public void visitModifiers(JCModifiers that)         { visitTree(that); }
2177        public void visitErroneous(JCErroneous that)         { visitTree(that); }
2178        public void visitLetExpr(LetExpr that)               { visitTree(that); }
2179 
2180        public void visitTree(JCTree that)                   { assert false; }
2181    }
2182 
2183}

[all classes][com.sun.tools.javac.tree]
EMMA 2.0.5312 (C) Vladimir Roubtsov