BlockStatement.java revision 1173:82ae555768c7
118334Speter/* 218334Speter * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. 350397Sobrien * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 418334Speter * 518334Speter * This code is free software; you can redistribute it and/or modify it 618334Speter * under the terms of the GNU General Public License version 2 only, as 718334Speter * published by the Free Software Foundation. Oracle designates this 818334Speter * particular file as subject to the "Classpath" exception as provided 918334Speter * by Oracle in the LICENSE file that accompanied this code. 1018334Speter * 1118334Speter * This code is distributed in the hope that it will be useful, but WITHOUT 1218334Speter * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1318334Speter * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1418334Speter * version 2 for more details (a copy is included in the LICENSE file that 1518334Speter * accompanied this code). 1618334Speter * 1718334Speter * You should have received a copy of the GNU General Public License version 1818334Speter * 2 along with this work; if not, write to the Free Software Foundation, 1918334Speter * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2018334Speter * 2118334Speter * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2218334Speter * or visit www.oracle.com if you need additional information or have any 2318334Speter * questions. 2418334Speter */ 2518334Speter 26169689Skanpackage jdk.nashorn.internal.ir; 27169689Skan 2818334Speterimport java.util.List; 2918334Speterimport jdk.nashorn.internal.ir.visitor.NodeVisitor; 3018334Speter 3118334Speter/** 3218334Speter * Represents a block used as a statement. 3318334Speter */ 3418334Speterpublic class BlockStatement extends Statement { 3518334Speter private static final long serialVersionUID = 1L; 3618334Speter 3718334Speter /** Block to execute. */ 3818334Speter private final Block block; 3918334Speter 4018334Speter /** 4118334Speter * Constructor 4218334Speter * 4318334Speter * @param block the block to execute 4418334Speter */ 4518334Speter public BlockStatement(final Block block) { 4618334Speter this(block.getFirstStatementLineNumber(), block); 4718334Speter } 4818334Speter 4918334Speter /** 5018334Speter * Constructor 5118334Speter * 5218334Speter * @param lineNumber line number 5318334Speter * @param block the block to execute 5418334Speter */ 5518334Speter public BlockStatement(final int lineNumber, final Block block) { 5618334Speter super(lineNumber, block.getToken(), block.getFinish()); 5718334Speter this.block = block; 5818334Speter } 5918334Speter 6018334Speter private BlockStatement(final BlockStatement blockStatement, final Block block) { 6118334Speter super(blockStatement); 6218334Speter this.block = block; 6318334Speter } 6418334Speter 6518334Speter /** 6618334Speter * Use this method to create a block statement meant to replace a single statement. 6718334Speter * @param stmt the statement to replace 6818334Speter * @param newStmts the statements for the new block statement 6918334Speter * @return a block statement with the new statements. It will have the line number, token, and finish of the 7018334Speter * original statement. 7118334Speter */ 7218334Speter public static BlockStatement createReplacement(final Statement stmt, final List<Statement> newStmts) { 7318334Speter return createReplacement(stmt, stmt.getFinish(), newStmts); 7418334Speter } 7518334Speter 7618334Speter /** 7718334Speter * Use this method to create a block statement meant to replace a single statement. 7818334Speter * @param stmt the statement to replace 7918334Speter * @param finish the new finish for the block 8018334Speter * @param newStmts the statements for the new block statement 8118334Speter * @return a block statement with the new statements. It will have the line number, and token of the 8218334Speter * original statement. 8318334Speter */ 8418334Speter public static BlockStatement createReplacement(final Statement stmt, final int finish, final List<Statement> newStmts) { 8518334Speter return new BlockStatement(stmt.getLineNumber(), new Block(stmt.getToken(), finish, newStmts)); 8618334Speter } 8718334Speter 8818334Speter @Override 8918334Speter public boolean isTerminal() { 9018334Speter return block.isTerminal(); 9118334Speter } 9218334Speter 9318334Speter @Override 9418334Speter public Node accept(final NodeVisitor<? extends LexicalContext> visitor) { 9518334Speter if (visitor.enterBlockStatement(this)) { 9618334Speter return visitor.leaveBlockStatement(setBlock((Block)block.accept(visitor))); 9718334Speter } 9818334Speter 9918334Speter return this; 10018334Speter } 10118334Speter 10218334Speter @Override 10318334Speter public void toString(final StringBuilder sb, final boolean printType) { 10418334Speter block.toString(sb, printType); 10518334Speter } 10618334Speter 10718334Speter /** 10818334Speter * Return the block to be executed 10918334Speter * @return the block 11018334Speter */ 11118334Speter public Block getBlock() { 11218334Speter return block; 11318334Speter } 11418334Speter 11518334Speter /** 11618334Speter * Reset the block to be executed 11718334Speter * @param block the block 11890075Sobrien * @return new or same execute node 11990075Sobrien */ 12090075Sobrien public BlockStatement setBlock(final Block block) { 12190075Sobrien if (this.block == block) { 12290075Sobrien return this; 12390075Sobrien } 12418334Speter return new BlockStatement(this, block); 12518334Speter } 12618334Speter} 12718334Speter