30 import jdk.nashorn.internal.ir.Node; 31 import jdk.nashorn.internal.ir.UnaryNode; 32 33 /** 34 * Like NodeVisitor but navigating further into operators. 35 * @param <T> Lexical context class for this NodeOperatorVisitor 36 */ 37 public abstract class NodeOperatorVisitor<T extends LexicalContext> extends NodeVisitor<T> { 38 /** 39 * Constructor 40 * 41 * @param lc a custom lexical context 42 */ 43 public NodeOperatorVisitor(final T lc) { 44 super(lc); 45 } 46 47 @Override 48 public boolean enterUnaryNode(final UnaryNode unaryNode) { 49 switch (unaryNode.tokenType()) { 50 case ADD: 51 return enterADD(unaryNode); 52 case BIT_NOT: 53 return enterBIT_NOT(unaryNode); 54 case DELETE: 55 return enterDELETE(unaryNode); 56 case NEW: 57 return enterNEW(unaryNode); 58 case NOT: 59 return enterNOT(unaryNode); 60 case SUB: 61 return enterSUB(unaryNode); 62 case TYPEOF: 63 return enterTYPEOF(unaryNode); 64 case VOID: 65 return enterVOID(unaryNode); 66 case DECPREFIX: 67 case DECPOSTFIX: 68 case INCPREFIX: 69 case INCPOSTFIX: 70 return enterDECINC(unaryNode); 71 default: 72 return super.enterUnaryNode(unaryNode); 73 } 74 } 75 76 @Override 77 public final Node leaveUnaryNode(final UnaryNode unaryNode) { 78 switch (unaryNode.tokenType()) { 79 case ADD: 80 return leaveADD(unaryNode); 81 case BIT_NOT: 82 return leaveBIT_NOT(unaryNode); 83 case DELETE: 84 return leaveDELETE(unaryNode); 85 case NEW: 86 return leaveNEW(unaryNode); 87 case NOT: 88 return leaveNOT(unaryNode); 89 case SUB: 90 return leaveSUB(unaryNode); 91 case TYPEOF: 92 return leaveTYPEOF(unaryNode); 93 case VOID: 94 return leaveVOID(unaryNode); 95 case DECPREFIX: 96 case DECPOSTFIX: 97 case INCPREFIX: 98 case INCPOSTFIX: 99 return leaveDECINC(unaryNode); 100 default: 101 return super.leaveUnaryNode(unaryNode); 102 } 103 } 104 105 @Override 106 public final boolean enterBinaryNode(final BinaryNode binaryNode) { 107 switch (binaryNode.tokenType()) { 108 case ADD: 109 return enterADD(binaryNode); 110 case AND: 263 return leaveSHL(binaryNode); 264 case SHR: 265 return leaveSHR(binaryNode); 266 case SUB: 267 return leaveSUB(binaryNode); 268 default: 269 return super.leaveBinaryNode(binaryNode); 270 } 271 } 272 273 /* 274 * Unary entries and exists. 275 */ 276 277 /** 278 * Unary enter - callback for entering a unary + 279 * 280 * @param unaryNode the node 281 * @return true if traversal should continue and node children be traversed, false otherwise 282 */ 283 public boolean enterADD(final UnaryNode unaryNode) { 284 return enterDefault(unaryNode); 285 } 286 287 /** 288 * Unary leave - callback for leaving a unary + 289 * 290 * @param unaryNode the node 291 * @return processed node, which will replace the original one, or the original node 292 */ 293 public Node leaveADD(final UnaryNode unaryNode) { 294 return leaveDefault(unaryNode); 295 } 296 297 /** 298 * Unary enter - callback for entering a ~ operator 299 * 300 * @param unaryNode the node 301 * @return true if traversal should continue and node children be traversed, false otherwise 302 */ 303 public boolean enterBIT_NOT(final UnaryNode unaryNode) { 304 return enterDefault(unaryNode); 305 } 306 307 /** 308 * Unary leave - callback for leaving a unary ~ 309 * 310 * @param unaryNode the node 311 * @return processed node, which will replace the original one, or the original node 312 */ 313 public Node leaveBIT_NOT(final UnaryNode unaryNode) { 383 public boolean enterNOT(final UnaryNode unaryNode) { 384 return enterDefault(unaryNode); 385 } 386 387 /** 388 * Unary leave - callback for leaving a ! operator 389 * 390 * @param unaryNode the node 391 * @return processed node, which will replace the original one, or the original node 392 */ 393 public Node leaveNOT(final UnaryNode unaryNode) { 394 return leaveDefault(unaryNode); 395 } 396 397 /** 398 * Unary enter - callback for entering a unary - 399 * 400 * @param unaryNode the node 401 * @return true if traversal should continue and node children be traversed, false otherwise 402 */ 403 public boolean enterSUB(final UnaryNode unaryNode) { 404 return enterDefault(unaryNode); 405 } 406 407 /** 408 * Unary leave - callback for leaving a unary - 409 * 410 * @param unaryNode the node 411 * @return processed node, which will replace the original one, or the original node 412 */ 413 public Node leaveSUB(final UnaryNode unaryNode) { 414 return leaveDefault(unaryNode); 415 } 416 417 /** 418 * Unary enter - callback for entering a typeof 419 * 420 * @param unaryNode the node 421 * @return true if traversal should continue and node children be traversed, false otherwise 422 */ 423 public boolean enterTYPEOF(final UnaryNode unaryNode) { 424 return enterDefault(unaryNode); 425 } 426 427 /** 428 * Unary leave - callback for leaving a typeof operator 429 * 430 * @param unaryNode the node 431 * @return processed node, which will replace the original one, or the original node 432 */ 433 public Node leaveTYPEOF(final UnaryNode unaryNode) { | 30 import jdk.nashorn.internal.ir.Node; 31 import jdk.nashorn.internal.ir.UnaryNode; 32 33 /** 34 * Like NodeVisitor but navigating further into operators. 35 * @param <T> Lexical context class for this NodeOperatorVisitor 36 */ 37 public abstract class NodeOperatorVisitor<T extends LexicalContext> extends NodeVisitor<T> { 38 /** 39 * Constructor 40 * 41 * @param lc a custom lexical context 42 */ 43 public NodeOperatorVisitor(final T lc) { 44 super(lc); 45 } 46 47 @Override 48 public boolean enterUnaryNode(final UnaryNode unaryNode) { 49 switch (unaryNode.tokenType()) { 50 case POS: 51 return enterPOS(unaryNode); 52 case BIT_NOT: 53 return enterBIT_NOT(unaryNode); 54 case DELETE: 55 return enterDELETE(unaryNode); 56 case NEW: 57 return enterNEW(unaryNode); 58 case NOT: 59 return enterNOT(unaryNode); 60 case NEG: 61 return enterNEG(unaryNode); 62 case TYPEOF: 63 return enterTYPEOF(unaryNode); 64 case VOID: 65 return enterVOID(unaryNode); 66 case DECPREFIX: 67 case DECPOSTFIX: 68 case INCPREFIX: 69 case INCPOSTFIX: 70 return enterDECINC(unaryNode); 71 default: 72 return super.enterUnaryNode(unaryNode); 73 } 74 } 75 76 @Override 77 public final Node leaveUnaryNode(final UnaryNode unaryNode) { 78 switch (unaryNode.tokenType()) { 79 case POS: 80 return leavePOS(unaryNode); 81 case BIT_NOT: 82 return leaveBIT_NOT(unaryNode); 83 case DELETE: 84 return leaveDELETE(unaryNode); 85 case NEW: 86 return leaveNEW(unaryNode); 87 case NOT: 88 return leaveNOT(unaryNode); 89 case NEG: 90 return leaveNEG(unaryNode); 91 case TYPEOF: 92 return leaveTYPEOF(unaryNode); 93 case VOID: 94 return leaveVOID(unaryNode); 95 case DECPREFIX: 96 case DECPOSTFIX: 97 case INCPREFIX: 98 case INCPOSTFIX: 99 return leaveDECINC(unaryNode); 100 default: 101 return super.leaveUnaryNode(unaryNode); 102 } 103 } 104 105 @Override 106 public final boolean enterBinaryNode(final BinaryNode binaryNode) { 107 switch (binaryNode.tokenType()) { 108 case ADD: 109 return enterADD(binaryNode); 110 case AND: 263 return leaveSHL(binaryNode); 264 case SHR: 265 return leaveSHR(binaryNode); 266 case SUB: 267 return leaveSUB(binaryNode); 268 default: 269 return super.leaveBinaryNode(binaryNode); 270 } 271 } 272 273 /* 274 * Unary entries and exists. 275 */ 276 277 /** 278 * Unary enter - callback for entering a unary + 279 * 280 * @param unaryNode the node 281 * @return true if traversal should continue and node children be traversed, false otherwise 282 */ 283 public boolean enterPOS(final UnaryNode unaryNode) { 284 return enterDefault(unaryNode); 285 } 286 287 /** 288 * Unary leave - callback for leaving a unary + 289 * 290 * @param unaryNode the node 291 * @return processed node, which will replace the original one, or the original node 292 */ 293 public Node leavePOS(final UnaryNode unaryNode) { 294 return leaveDefault(unaryNode); 295 } 296 297 /** 298 * Unary enter - callback for entering a ~ operator 299 * 300 * @param unaryNode the node 301 * @return true if traversal should continue and node children be traversed, false otherwise 302 */ 303 public boolean enterBIT_NOT(final UnaryNode unaryNode) { 304 return enterDefault(unaryNode); 305 } 306 307 /** 308 * Unary leave - callback for leaving a unary ~ 309 * 310 * @param unaryNode the node 311 * @return processed node, which will replace the original one, or the original node 312 */ 313 public Node leaveBIT_NOT(final UnaryNode unaryNode) { 383 public boolean enterNOT(final UnaryNode unaryNode) { 384 return enterDefault(unaryNode); 385 } 386 387 /** 388 * Unary leave - callback for leaving a ! operator 389 * 390 * @param unaryNode the node 391 * @return processed node, which will replace the original one, or the original node 392 */ 393 public Node leaveNOT(final UnaryNode unaryNode) { 394 return leaveDefault(unaryNode); 395 } 396 397 /** 398 * Unary enter - callback for entering a unary - 399 * 400 * @param unaryNode the node 401 * @return true if traversal should continue and node children be traversed, false otherwise 402 */ 403 public boolean enterNEG(final UnaryNode unaryNode) { 404 return enterDefault(unaryNode); 405 } 406 407 /** 408 * Unary leave - callback for leaving a unary - 409 * 410 * @param unaryNode the node 411 * @return processed node, which will replace the original one, or the original node 412 */ 413 public Node leaveNEG(final UnaryNode unaryNode) { 414 return leaveDefault(unaryNode); 415 } 416 417 /** 418 * Unary enter - callback for entering a typeof 419 * 420 * @param unaryNode the node 421 * @return true if traversal should continue and node children be traversed, false otherwise 422 */ 423 public boolean enterTYPEOF(final UnaryNode unaryNode) { 424 return enterDefault(unaryNode); 425 } 426 427 /** 428 * Unary leave - callback for leaving a typeof operator 429 * 430 * @param unaryNode the node 431 * @return processed node, which will replace the original one, or the original node 432 */ 433 public Node leaveTYPEOF(final UnaryNode unaryNode) { |