Guest User

Untitled

a guest
Nov 16th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.09 KB | None | 0 0
  1. void method() {
  2. A(processId);
  3. B();
  4. }
  5.  
  6. void callMethod() {
  7. int processId = rand();
  8. invokeMethod(
  9. {->
  10. A(processId);
  11. B();
  12. }, processId);
  13. }
  14.  
  15. void invokeMethod(Closure closure, int processId) {
  16. doSomething(processId);
  17. closure.call();
  18. }
  19.  
  20. private void wrapMethod(@NonNull MethodNode node)
  21. {
  22. VariableExpression var = new VariableExpression("processId", new ClassNode(Integer.class));
  23. var.setClosureSharedVariable(true);
  24. //Generate a statement that creates a processId
  25. Statement statement = GeneralUtils.declS(var, GeneralUtils.callThisX("getUUID"));
  26.  
  27. ClosureExpression methodClosure = createMethodClosure(node);
  28.  
  29. ArgumentListExpression args = createArgumentListExpression(methodClosure,
  30. varX("processId"));
  31.  
  32. MethodCallExpression method = GeneralUtils.callThisX("invokeMethod", args);
  33.  
  34. BlockStatement newMethodCode = GeneralUtils.block(statement, GeneralUtils.stmt(method));
  35. newMethodCode.setVariableScope(methodClosure.getVariableScope().copy());
  36.  
  37. //Just to be safe, modifying the scope of the node as well.
  38. VariableScope newScope = node.getVariableScope().copy();
  39. newScope.putDeclaredVariable(var);
  40.  
  41. node.setCode(newMethodCode);
  42. node.setVariableScope(newScope);
  43. }
  44.  
  45. private ClosureExpression createMethodClosure(MethodNode node) {
  46. //Get code from within node to dump into a closure.
  47. BlockStatement block = (BlockStatement) node.getCode();
  48.  
  49. //Setting closureScope and adding processId
  50. VariableScope closureScope = block.getVariableScope().copy();
  51.  
  52. closureScope.getReferencedLocalVariablesIterator()
  53. .forEachRemaining(x -> x.setClosureSharedVariable(true));
  54. Variable var = new VariableExpression("processId", new ClassNode(Integer.class));
  55. var.setClosureSharedVariable(true);
  56. closureScope.putDeclaredVariable(var);
  57.  
  58. ClosureExpression methodClosure = GeneralUtils.closureX(block);
  59. methodClosure.setVariableScope(closureScope);
  60. return methodClosure;
  61. }
Add Comment
Please, Sign In to add comment