ReplaceCompileUnits.java revision 1426:751ada854e5a
1330449Seadler/*
2330449Seadler * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
3330449Seadler * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
448905Srnordier *
548905Srnordier * This code is free software; you can redistribute it and/or modify it
648905Srnordier * under the terms of the GNU General Public License version 2 only, as
748905Srnordier * published by the Free Software Foundation.  Oracle designates this
848905Srnordier * particular file as subject to the "Classpath" exception as provided
948905Srnordier * by Oracle in the LICENSE file that accompanied this code.
1048905Srnordier *
1148905Srnordier * This code is distributed in the hope that it will be useful, but WITHOUT
1248905Srnordier * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1348905Srnordier * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1448905Srnordier * version 2 for more details (a copy is included in the LICENSE file that
1548905Srnordier * accompanied this code).
1648905Srnordier *
1748905Srnordier * You should have received a copy of the GNU General Public License version
1848905Srnordier * 2 along with this work; if not, write to the Free Software Foundation,
1948905Srnordier * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2048905Srnordier *
2148905Srnordier * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2248905Srnordier * or visit www.oracle.com if you need additional information or have any
2348905Srnordier * questions.
2448905Srnordier */
2548905Srnordier
2648905Srnordierpackage jdk.nashorn.internal.codegen;
2748905Srnordier
2850479Speterimport java.util.ArrayList;
2948905Srnordierimport java.util.List;
3048905Srnordierimport jdk.nashorn.internal.ir.CompileUnitHolder;
31130927Sobrienimport jdk.nashorn.internal.ir.FunctionNode;
32130927Sobrienimport jdk.nashorn.internal.ir.LexicalContext;
33130927Sobrienimport jdk.nashorn.internal.ir.LiteralNode;
3448905Srnordierimport jdk.nashorn.internal.ir.LiteralNode.ArrayLiteralNode;
3548905Srnordierimport jdk.nashorn.internal.ir.LiteralNode.ArrayLiteralNode.ArrayUnit;
3648905Srnordierimport jdk.nashorn.internal.ir.Node;
3748905Srnordierimport jdk.nashorn.internal.ir.visitor.NodeVisitor;
3848905Srnordier
3948905Srnordier/**
4048905Srnordier * Base class for a node visitor that replaces {@link CompileUnit}s in {@link CompileUnitHolder}s.
4148905Srnordier */
4248905Srnordierabstract class ReplaceCompileUnits extends NodeVisitor<LexicalContext> {
4348905Srnordier    ReplaceCompileUnits() {
44130927Sobrien        super(new LexicalContext());
4548905Srnordier    }
4668313Srnordier
4748905Srnordier    /**
4848905Srnordier     * Override to provide a replacement for an old compile unit.
4948905Srnordier     * @param oldUnit the old compile unit to replace
5048905Srnordier     * @return the compile unit's replacement.
5168313Srnordier     */
5248905Srnordier    abstract CompileUnit getReplacement(final CompileUnit oldUnit);
5348905Srnordier
5448905Srnordier    CompileUnit getExistingReplacement(final CompileUnitHolder node) {
55130927Sobrien        final CompileUnit oldUnit = node.getCompileUnit();
5648905Srnordier        assert oldUnit != null;
5748905Srnordier
5848905Srnordier        final CompileUnit newUnit = getReplacement(oldUnit);
5948905Srnordier        assert newUnit != null;
6048905Srnordier
6148905Srnordier        return newUnit;
6248905Srnordier    }
6348905Srnordier
64112089Sru    @Override
6548905Srnordier    public Node leaveFunctionNode(final FunctionNode node) {
6648905Srnordier        return node.setCompileUnit(lc, getExistingReplacement(node));
6748905Srnordier    }
6848905Srnordier
6948905Srnordier    @Override
7048905Srnordier    public Node leaveLiteralNode(final LiteralNode<?> node) {
7148905Srnordier        if (node instanceof ArrayLiteralNode) {
7248905Srnordier            final ArrayLiteralNode aln = (ArrayLiteralNode)node;
7348905Srnordier            if (aln.getUnits() == null) {
7448905Srnordier                return node;
7568313Srnordier            }
7668313Srnordier            final List<ArrayUnit> newArrayUnits = new ArrayList<>();
7768313Srnordier            for (final ArrayUnit au : aln.getUnits()) {
7868313Srnordier                newArrayUnits.add(new ArrayUnit(getExistingReplacement(au), au.getLo(), au.getHi()));
7948905Srnordier            }
8048905Srnordier            return aln.setUnits(lc, newArrayUnits);
8168313Srnordier        }
8268313Srnordier        return node;
8368313Srnordier    }
8468313Srnordier}
8568313Srnordier