/* * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.apache.flex.compiler.internal.tree.as; import java.util.ArrayList; import java.util.Collection; import java.util.EnumSet; import org.apache.flex.compiler.internal.scopes.ASScope; import org.apache.flex.compiler.internal.semantics.PostProcessStep; import org.apache.flex.compiler.parsing.IASToken; import org.apache.flex.compiler.problems.ICompilerProblem; import org.apache.flex.compiler.tree.ASTNodeID; import org.apache.flex.compiler.tree.as.IASNode; import org.apache.flex.compiler.tree.as.IExpressionNode; import org.apache.flex.compiler.tree.as.IForLoopNode; public class ForLoopNode extends FixedChildrenNode implements IForLoopNode { /** * Constructor. */ public ForLoopNode(IASToken forKeyword) { super(); if (forKeyword != null) { startBefore(forKeyword); if (forKeyword.getText().length() == 3) kind = ForLoopKind.FOR; else kind = ForLoopKind.FOR_EACH; } else { kind = ForLoopKind.FOR; } conditionsStatementsNode = new ContainerNode(); contentsNode = new BlockNode(); } /** * The statements in the loop header */ protected ContainerNode conditionsStatementsNode; /** * The contents of this loop */ protected BlockNode contentsNode; /** * For loop type */ private ForLoopKind kind; // // NodeBase overrides // @Override public ASTNodeID getNodeID() { switch (kind) { case FOR: return ASTNodeID.ForLoopID; case FOR_EACH: return ASTNodeID.ForEachLoopID; } return ASTNodeID.ForLoopID; } @Override public int getChildCount() { int count = 0; if (conditionsStatementsNode != null) count++; if (contentsNode != null) count++; return count; } @Override public IASNode getChild(int i) { if (i == 0) return conditionsStatementsNode; else if (i == 1) return contentsNode; return null; } @Override protected void analyze(EnumSet<PostProcessStep> set, ASScope scope, Collection<ICompilerProblem> problems) { // Put header statements into the current block conditionsStatementsNode.analyze(set, scope, problems); contentsNode.analyze(set, scope, problems); } // // IForLoopNode implementations // @Override public IASNode getStatementContentsNode() { return contentsNode; } @Override public ForLoopKind getKind() { return kind; } @Override public IExpressionNode[] getConditionalExpressionNodes() { int childCount = conditionsStatementsNode.getChildCount(); ArrayList<IExpressionNode> retVal = new ArrayList<IExpressionNode>(3); for (int i = 0; i < childCount; i++) { IASNode child = conditionsStatementsNode.getChild(i); if (child instanceof IExpressionNode) retVal.add((IExpressionNode)child); } return retVal.toArray(new IExpressionNode[0]); } // // Other methods // public ContainerNode getConditionalsContainerNode() { return conditionsStatementsNode; } public BlockNode getContentsNode() { return contentsNode; } }