private CAstNode makeVarRef(String varName) { return Ast.makeNode(CAstNode.VAR, Ast.makeConstant(varName)); }
private CAstNode visit() { return fFactory.makeConstant(null); }
@Override public CAstNode visitWithStatement(WithStatement node, WalkContext arg) { // TODO implement this somehow return Ast.makeNode(CAstNode.EMPTY); }
private CAstNode visit(SynchronizedStatement n, WalkContext context) { CAstNode exprNode = visitNode(n.getExpression(), context); String exprName = fFactory.makeUnique(); CAstNode declStmt = makeNode(context, fFactory, n, CAstNode.DECL_STMT, fFactory .makeConstant(new CAstSymbolImpl(exprName, fTypeDict.getCAstTypeFor(n.getExpression().resolveTypeBinding()), true)), exprNode); CAstNode monitorEnterNode = makeNode(context, fFactory, n, CAstNode.MONITOR_ENTER, makeNode(context, fFactory, n, CAstNode.VAR, fFactory.makeConstant(exprName))); context.cfg().map(monitorEnterNode, monitorEnterNode); for (Pair<ITypeBinding, Object> catchTarget : context.getCatchTargets(fNullPointerExcType)) context.cfg().add(monitorEnterNode, catchTarget.snd, catchTarget.fst); CAstNode bodyNodes = visitNode(n.getBody(), context); CAstNode monitorExitNode = makeNode(context, fFactory, n, CAstNode.MONITOR_EXIT, makeNode(context, fFactory, n, CAstNode.VAR, fFactory.makeConstant(exprName))); context.cfg().map(monitorExitNode, monitorExitNode); for (Pair<ITypeBinding, Object> catchTarget : context.getCatchTargets(fNullPointerExcType)) context.cfg().add(monitorExitNode, catchTarget.snd, catchTarget.fst); CAstNode tryBody = makeNode(context, fFactory, n, CAstNode.BLOCK_STMT, monitorEnterNode, bodyNodes); CAstNode bigBody = makeNode(context, fFactory, n, CAstNode.UNWIND, tryBody, monitorExitNode); return makeNode(context, fFactory, n, CAstNode.BLOCK_STMT, declStmt, bigBody); }
@Override public CAstNode visitLabel(Label node, WalkContext arg) { String label = node.getName(); return Ast.makeConstant(label); }
@Override public CAstNode visitEmptyExpression(EmptyExpression node, WalkContext arg) { return Ast.makeNode(CAstNode.EMPTY); }
private CAstNode makeVarRef(String name) { return Ast.makeNode(VAR, Ast.makeConstant(name)); }
@Override public CAstNode visitRegExpLiteral(RegExpLiteral node, WalkContext arg) { CAstNode flagsNode = Ast.makeConstant(node.getFlags()); CAstNode valNode = Ast.makeConstant(node.getValue()); return handleNew(arg, "RegExp", new CAstNode[]{ flagsNode, valNode }); }
@Override public CAstNode visitComment(Comment node, WalkContext arg) { return Ast.makeNode(CAstNode.EMPTY); }
private CAstNode makeBuiltinNew(String typeName) { return Ast.makeNode(CAstNode.NEW, Ast.makeConstant(typeName)); }
@Override public CAstNode visitNumberLiteral(NumberLiteral node, WalkContext arg) { return Ast.makeConstant(node.getDouble()); }
@Override public CAstNode visitEmptyStatement(EmptyStatement node, WalkContext arg) { return Ast.makeNode(CAstNode.EMPTY); }
private CAstNode makeVarRef(String name) { return Ast.makeNode(VAR, Ast.makeConstant(name)); }
@Override public CAstNode visitStringLiteral(StringLiteral node, WalkContext arg) { return Ast.makeConstant(node.getValue()); }
@Override public CAstNode visitScope(Scope node, WalkContext arg) { List<CAstNode> nodes = new ArrayList<>(); for(Node child : node) { nodes.add(visit((AstNode)child, arg)); } if (nodes.isEmpty()) { return Ast.makeNode(CAstNode.EMPTY); } else { return Ast.makeNode(CAstNode.LOCAL_SCOPE, Ast.makeNode(CAstNode.BLOCK_STMT, nodes.toArray(new CAstNode[0]))); } }
private CAstNode operationElementVar(int operationIndex) { return Ast.makeNode(CAstNode.VAR, Ast.makeConstant(operationElementName(operationIndex))); }
private CAstNode visit(CharacterLiteral n) { return fFactory.makeConstant(n.charValue()); }
@Override public CAstNode visitBlock(Block node, WalkContext arg) { List<CAstNode> nodes = new ArrayList<>(); for(Node child : node) { nodes.add(visit((AstNode)child, arg)); } if (nodes.isEmpty()) { return Ast.makeNode(CAstNode.EMPTY); } else { return Ast.makeNode(CAstNode.BLOCK_STMT, nodes.toArray(new CAstNode[0])); } }
private CAstNode operationReceiverVar(int operationIndex) { return Ast.makeNode(CAstNode.VAR, Ast.makeConstant(operationReceiverName(operationIndex))); }
private CAstNode visit(NumberLiteral n) { return fFactory.makeConstant(n.resolveConstantExpressionValue()); }