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