You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ms...@apache.org on 2013/01/16 21:35:31 UTC
svn commit: r1434371 - in
/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler:
as/codegen/IASEmitter.java internal/as/codegen/ASBlockWalker.java
internal/as/codegen/ASEmitter.java
Author: mschmalle
Date: Wed Jan 16 20:35:30 2013
New Revision: 1434371
URL: http://svn.apache.org/viewvc?rev=1434371&view=rev
Log:
Flex:FalconJx
- refactored most of the statements into ASEmitter
- couple other deletions in the ASBlockWalker that are not needed anymore
Modified:
flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/as/codegen/IASEmitter.java
flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASBlockWalker.java
flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java
Modified: flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/as/codegen/IASEmitter.java
URL: http://svn.apache.org/viewvc/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/as/codegen/IASEmitter.java?rev=1434371&r1=1434370&r2=1434371&view=diff
==============================================================================
--- flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/as/codegen/IASEmitter.java (original)
+++ flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/as/codegen/IASEmitter.java Wed Jan 16 20:35:30 2013
@@ -25,18 +25,25 @@ import org.apache.flex.compiler.internal
import org.apache.flex.compiler.tree.as.IASNode;
import org.apache.flex.compiler.tree.as.IBinaryOperatorNode;
import org.apache.flex.compiler.tree.as.IBlockNode;
+import org.apache.flex.compiler.tree.as.ICatchNode;
import org.apache.flex.compiler.tree.as.IClassNode;
import org.apache.flex.compiler.tree.as.IExpressionNode;
import org.apache.flex.compiler.tree.as.IForLoopNode;
import org.apache.flex.compiler.tree.as.IFunctionCallNode;
import org.apache.flex.compiler.tree.as.IFunctionNode;
import org.apache.flex.compiler.tree.as.IGetterNode;
+import org.apache.flex.compiler.tree.as.IIfNode;
import org.apache.flex.compiler.tree.as.IInterfaceNode;
import org.apache.flex.compiler.tree.as.INamespaceNode;
import org.apache.flex.compiler.tree.as.IPackageNode;
import org.apache.flex.compiler.tree.as.IParameterNode;
import org.apache.flex.compiler.tree.as.ISetterNode;
+import org.apache.flex.compiler.tree.as.ISwitchNode;
+import org.apache.flex.compiler.tree.as.IThrowNode;
+import org.apache.flex.compiler.tree.as.ITryNode;
import org.apache.flex.compiler.tree.as.IVariableNode;
+import org.apache.flex.compiler.tree.as.IWhileLoopNode;
+import org.apache.flex.compiler.tree.as.IWithNode;
import org.apache.flex.compiler.visitor.IASBlockWalker;
import org.apache.flex.compiler.visitor.IASNodeStrategy;
@@ -180,6 +187,13 @@ public interface IASEmitter
void emitStatement(IASNode node);
/**
+ * Emit a <code>if(){}else if(){}else{}</code> statement.
+ *
+ * @param node The {@link IIfNode} node.
+ */
+ void emitIf(IIfNode node);
+
+ /**
* Emit a <code>for each</code> statement.
*
* @param node The {@link IForLoopNode} node.
@@ -193,6 +207,55 @@ public interface IASEmitter
*/
void emitForLoop(IForLoopNode node);
+ /**
+ * Emit a <code>switch(){}</code> statement.
+ *
+ * @param node The {@link ISwitchNode} node.
+ */
+ void emitSwitch(ISwitchNode node);
+
+ /**
+ * Emit a <code>while(){}</code> statement.
+ *
+ * @param node The {@link IWhileLoopNode} node.
+ */
+ void emitWhileLoop(IWhileLoopNode node);
+
+ /**
+ * Emit a <code>do{}while()</code> statement.
+ *
+ * @param node The {@link IWhileLoopNode} node.
+ */
+ void emitDoLoop(IWhileLoopNode node);
+
+ /**
+ * Emit a <code>with(){}</code> statement.
+ *
+ * @param node The {@link IWithNode} node.
+ */
+ void emitWith(IWithNode node);
+
+ /**
+ * Emit a <code>throw</code> statement.
+ *
+ * @param node The {@link IThrowNode} node.
+ */
+ void emitThrow(IThrowNode node);
+
+ /**
+ * Emit a <code>try{}</code> statement.
+ *
+ * @param node The {@link ITryNode} node.
+ */
+ void emitTry(ITryNode node);
+
+ /**
+ * Emit a <code>catch(){}</code> statement.
+ *
+ * @param node The {@link ICatchNode} node.
+ */
+ void emitCatch(ICatchNode node);
+
//--------------------------------------------------------------------------
// Expressions
//--------------------------------------------------------------------------
Modified: flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASBlockWalker.java
URL: http://svn.apache.org/viewvc/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASBlockWalker.java?rev=1434371&r1=1434370&r2=1434371&view=diff
==============================================================================
--- flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASBlockWalker.java (original)
+++ flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASBlockWalker.java Wed Jan 16 20:35:30 2013
@@ -19,7 +19,6 @@
package org.apache.flex.compiler.internal.as.codegen;
-import java.util.ArrayList;
import java.util.List;
import org.apache.flex.compiler.as.codegen.IASEmitter;
@@ -45,7 +44,6 @@ import org.apache.flex.compiler.tree.as.
import org.apache.flex.compiler.tree.as.IContainerNode;
import org.apache.flex.compiler.tree.as.IContainerNode.ContainerType;
import org.apache.flex.compiler.tree.as.IDefaultXMLNamespaceNode;
-import org.apache.flex.compiler.tree.as.IDefinitionNode;
import org.apache.flex.compiler.tree.as.IDynamicAccessNode;
import org.apache.flex.compiler.tree.as.IEmbedNode;
import org.apache.flex.compiler.tree.as.IExpressionNode;
@@ -70,14 +68,12 @@ import org.apache.flex.compiler.tree.as.
import org.apache.flex.compiler.tree.as.IPackageNode;
import org.apache.flex.compiler.tree.as.IParameterNode;
import org.apache.flex.compiler.tree.as.IReturnNode;
-import org.apache.flex.compiler.tree.as.IScopedNode;
import org.apache.flex.compiler.tree.as.ISetterNode;
import org.apache.flex.compiler.tree.as.ISwitchNode;
import org.apache.flex.compiler.tree.as.ITerminalNode;
import org.apache.flex.compiler.tree.as.ITernaryOperatorNode;
import org.apache.flex.compiler.tree.as.IThrowNode;
import org.apache.flex.compiler.tree.as.ITryNode;
-import org.apache.flex.compiler.tree.as.ITypeNode;
import org.apache.flex.compiler.tree.as.ITypedExpressionNode;
import org.apache.flex.compiler.tree.as.IUnaryOperatorNode;
import org.apache.flex.compiler.tree.as.IVariableNode;
@@ -146,10 +142,15 @@ public class ASBlockWalker implements IA
}
@Override
+ public void walk(IASNode node)
+ {
+ getStrategy().handle(node);
+ }
+
+ @Override
public void visitCompilationUnit(ICompilationUnit unit)
{
debug("visitCompilationUnit()");
-
IFileNode node = null;
try
{
@@ -182,7 +183,6 @@ public class ASBlockWalker implements IA
public void visitPackage(IPackageNode node)
{
debug("visitPackage()");
-
emitter.emitPackageHeader(node);
emitter.emitPackageHeaderContents(node);
emitter.emitPackageContents(node);
@@ -193,7 +193,6 @@ public class ASBlockWalker implements IA
public void visitClass(IClassNode node)
{
debug("visitClass()");
-
emitter.emitClass(node);
}
@@ -201,7 +200,6 @@ public class ASBlockWalker implements IA
public void visitInterface(IInterfaceNode node)
{
debug("visitInterface()");
-
emitter.emitInterface(node);
}
@@ -209,7 +207,6 @@ public class ASBlockWalker implements IA
public void visitVariable(IVariableNode node)
{
debug("visitVariable()");
-
if (SemanticUtils.isMemberDefinition(node.getDefinition()))
{
emitter.emitField(node);
@@ -224,7 +221,6 @@ public class ASBlockWalker implements IA
public void visitFunction(IFunctionNode node)
{
debug("visitFunction()");
-
if (isMemberDefinition(node.getDefinition()))
{
emitter.emitMethod(node);
@@ -296,63 +292,7 @@ public class ASBlockWalker implements IA
public void visitIf(IIfNode node)
{
debug("visitIf()");
- IConditionalNode conditional = (IConditionalNode) node.getChild(0);
-
- IContainerNode xnode = (IContainerNode) conditional
- .getStatementContentsNode();
-
- emitter.write("if");
- emitter.write(" ");
- emitter.write("(");
- walk(conditional.getChild(0)); // conditional expression
- emitter.write(")");
- if (!isImplicit(xnode))
- emitter.write(" ");
-
- walk(conditional.getChild(1)); // BlockNode
- IConditionalNode[] nodes = node.getElseIfNodes();
- if (nodes.length > 0)
- {
- for (int i = 0; i < nodes.length; i++)
- {
- IConditionalNode enode = nodes[i];
- IContainerNode snode = (IContainerNode) enode
- .getStatementContentsNode();
-
- final boolean isImplicit = isImplicit(snode);
- if (isImplicit)
- emitter.write("\n");
- else
- emitter.write(" ");
-
- emitter.write("else if");
- emitter.write(" ");
- emitter.write("(");
- walk(enode.getChild(0));
- emitter.write(")");
- if (!isImplicit)
- emitter.write(" ");
-
- walk(enode.getChild(1)); // ConditionalNode
- }
- }
-
- ITerminalNode elseNode = node.getElseNode();
- if (elseNode != null)
- {
- IContainerNode cnode = (IContainerNode) elseNode.getChild(0);
- // if an implicit if, add a newline with no space
- final boolean isImplicit = isImplicit(cnode);
- if (isImplicit)
- emitter.write("\n");
- else
- emitter.write(" ");
- emitter.write("else");
- if (!isImplicit)
- emitter.write(" ");
-
- walk(elseNode); // TerminalNode
- }
+ emitter.emitIf(node);
}
@Override
@@ -394,49 +334,7 @@ public class ASBlockWalker implements IA
public void visitSwitch(ISwitchNode node)
{
debug("visitSwitch()");
- emitter.write("switch");
- emitter.write(" ");
- emitter.write("(");
- walk(node.getChild(0));
- emitter.write(")");
- emitter.write(" {");
- emitter.indentPush();
- emitter.write("\n");
-
- IConditionalNode[] cnodes = getCaseNodes(node);
- ITerminalNode dnode = getDefaultNode(node);
-
- for (int i = 0; i < cnodes.length; i++)
- {
- IConditionalNode casen = cnodes[i];
- IContainerNode cnode = (IContainerNode) casen.getChild(1);
- emitter.write("case");
- emitter.write(" ");
- walk(casen.getConditionalExpressionNode());
- emitter.write(":");
- if (!isImplicit(cnode))
- emitter.write(" ");
- walk(casen.getStatementContentsNode());
- if (i == cnodes.length - 1 && dnode == null)
- {
- emitter.indentPop();
- emitter.write("\n");
- }
- else
- emitter.write("\n");
- }
- if (dnode != null)
- {
- IContainerNode cnode = (IContainerNode) dnode.getChild(0);
- emitter.write("default");
- emitter.write(":");
- if (!isImplicit(cnode))
- emitter.write(" ");
- walk(dnode);
- emitter.indentPop();
- emitter.write("\n");
- }
- emitter.write("}");
+ emitter.emitSwitch(node);
}
@Override
@@ -445,90 +343,40 @@ public class ASBlockWalker implements IA
debug("visitWhileLoopNode()");
if (node.getKind() == WhileLoopKind.WHILE)
{
- IContainerNode cnode = (IContainerNode) node.getChild(1);
- emitter.write("while");
- emitter.write(" ");
- emitter.write("(");
- walk(node.getConditionalExpressionNode());
- emitter.write(")");
- if (!isImplicit(cnode))
- emitter.write(" ");
- walk(node.getStatementContentsNode());
+ emitter.emitWhileLoop(node);
}
else if (node.getKind() == WhileLoopKind.DO)
{
- IContainerNode cnode = (IContainerNode) node.getChild(0);
- emitter.write("do");
- if (!isImplicit(cnode))
- emitter.write(" ");
- walk(node.getStatementContentsNode());
- if (!isImplicit(cnode))
- emitter.write(" ");
- else
- emitter.write("\n"); // TODO (mschmalle) there is something wrong here, block should NL
- emitter.write("while");
- emitter.write(" ");
- emitter.write("(");
- walk(node.getConditionalExpressionNode());
- emitter.write(");");
+ emitter.emitDoLoop(node);
}
}
@Override
public void visitWith(IWithNode node)
{
- IContainerNode cnode = (IContainerNode) node.getChild(1);
- emitter.write("with");
- emitter.write(" ");
- emitter.write("(");
- walk(node.getTargetNode());
- emitter.write(")");
- if (!isImplicit(cnode))
- emitter.write(" ");
- walk(node.getStatementContentsNode());
+ debug("visitWith()");
+ emitter.emitWith(node);
}
@Override
public void visitThrow(IThrowNode node)
{
- emitter.write("throw");
- emitter.write(" ");
- walk(node.getThrownExpressionNode());
+ debug("visitThrow()");
+ emitter.emitThrow(node);
}
@Override
public void visitTry(ITryNode node)
{
debug("visitTry()");
- emitter.write("try");
- emitter.write(" ");
- walk(node.getStatementContentsNode());
- for (int i = 0; i < node.getCatchNodeCount(); i++)
- {
- walk(node.getCatchNode(i));
- }
- ITerminalNode fnode = node.getFinallyNode();
- if (fnode != null)
- {
- emitter.write(" ");
- emitter.write("finally");
- emitter.write(" ");
- walk(fnode);
- }
+ emitter.emitTry(node);
}
@Override
public void visitCatch(ICatchNode node)
{
debug("visitCatch()");
- emitter.write(" ");
- emitter.write("catch");
- emitter.write(" ");
- emitter.write("(");
- walk(node.getCatchParameterNode());
- emitter.write(")");
- emitter.write(" ");
- walk(node.getStatementContentsNode());
+ emitter.emitCatch(node);
}
@Override
@@ -819,20 +667,6 @@ public class ASBlockWalker implements IA
//
//--------------------------------------------------------------------------
- protected IFunctionNode getConstructor(IDefinitionNode[] members)
- {
- for (IDefinitionNode node : members)
- {
- if (node instanceof IFunctionNode)
- {
- IFunctionNode fnode = (IFunctionNode) node;
- if (fnode.isConstructor())
- return fnode;
- }
- }
- return null;
- }
-
protected void debug(String message)
{
System.out.println(message);
@@ -868,73 +702,10 @@ public class ASBlockWalker implements IA
//
//--------------------------------------------------------------------------
- @SuppressWarnings("unused")
- private static boolean hasTypeNode(IPackageNode node)
- {
- return node.getScopedNode().getChildCount() != 0;
- }
-
- ITypeNode findTypeNode(IPackageNode node)
- {
- IScopedNode scope = node.getScopedNode();
- for (int i = 0; i < scope.getChildCount(); i++)
- {
- IASNode child = scope.getChild(i);
- if (child instanceof ITypeNode)
- return (ITypeNode) child;
- }
- return null;
- }
-
- @Override
- public void walk(IASNode node)
- {
- getStrategy().handle(node);
- }
-
- private static final boolean isImplicit(IContainerNode node)
- {
- return node.getContainerType() == ContainerType.IMPLICIT
- || node.getContainerType() == ContainerType.SYNTHESIZED;
- }
-
private static boolean isMemberDefinition(IDefinition definition)
{
return definition != null
&& (definition.getParent() instanceof IClassDefinition || definition
.getParent() instanceof IInterfaceDefinition);
}
-
- // there seems to be a bug in the ISwitchNode.getCaseNodes(), need to file a bug
- public IConditionalNode[] getCaseNodes(ISwitchNode node)
- {
- IBlockNode block = (IBlockNode) node.getChild(1);
- int childCount = block.getChildCount();
- ArrayList<IConditionalNode> retVal = new ArrayList<IConditionalNode>(
- childCount);
-
- for (int i = 0; i < childCount; i++)
- {
- IASNode child = block.getChild(i);
- if (child instanceof IConditionalNode)
- retVal.add((IConditionalNode) child);
- }
-
- return retVal.toArray(new IConditionalNode[0]);
- }
-
- // there seems to be a bug in the ISwitchNode.getDefaultNode(), need to file a bug
- public ITerminalNode getDefaultNode(ISwitchNode node)
- {
- IBlockNode block = (IBlockNode) node.getChild(1);
- int childCount = block.getChildCount();
- for (int i = childCount - 1; i >= 0; i--)
- {
- IASNode child = block.getChild(i);
- if (child instanceof ITerminalNode)
- return (ITerminalNode) child;
- }
-
- return null;
- }
}
Modified: flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java
URL: http://svn.apache.org/viewvc/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java?rev=1434371&r1=1434370&r2=1434371&view=diff
==============================================================================
--- flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java (original)
+++ flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java Wed Jan 16 20:35:30 2013
@@ -40,7 +40,10 @@ import org.apache.flex.compiler.tree.AST
import org.apache.flex.compiler.tree.as.IASNode;
import org.apache.flex.compiler.tree.as.IAccessorNode;
import org.apache.flex.compiler.tree.as.IBinaryOperatorNode;
+import org.apache.flex.compiler.tree.as.IBlockNode;
+import org.apache.flex.compiler.tree.as.ICatchNode;
import org.apache.flex.compiler.tree.as.IClassNode;
+import org.apache.flex.compiler.tree.as.IConditionalNode;
import org.apache.flex.compiler.tree.as.IContainerNode;
import org.apache.flex.compiler.tree.as.IDefinitionNode;
import org.apache.flex.compiler.tree.as.IExpressionNode;
@@ -48,6 +51,7 @@ import org.apache.flex.compiler.tree.as.
import org.apache.flex.compiler.tree.as.IFunctionCallNode;
import org.apache.flex.compiler.tree.as.IFunctionNode;
import org.apache.flex.compiler.tree.as.IGetterNode;
+import org.apache.flex.compiler.tree.as.IIfNode;
import org.apache.flex.compiler.tree.as.IInterfaceNode;
import org.apache.flex.compiler.tree.as.IKeywordNode;
import org.apache.flex.compiler.tree.as.INamespaceNode;
@@ -56,9 +60,15 @@ import org.apache.flex.compiler.tree.as.
import org.apache.flex.compiler.tree.as.IScopedNode;
import org.apache.flex.compiler.tree.as.ISetterNode;
import org.apache.flex.compiler.tree.as.IStatementNode;
+import org.apache.flex.compiler.tree.as.ISwitchNode;
+import org.apache.flex.compiler.tree.as.ITerminalNode;
+import org.apache.flex.compiler.tree.as.IThrowNode;
+import org.apache.flex.compiler.tree.as.ITryNode;
import org.apache.flex.compiler.tree.as.ITypeNode;
import org.apache.flex.compiler.tree.as.IVariableNode;
import org.apache.flex.compiler.tree.as.IContainerNode.ContainerType;
+import org.apache.flex.compiler.tree.as.IWhileLoopNode;
+import org.apache.flex.compiler.tree.as.IWithNode;
import org.apache.flex.compiler.visitor.IASBlockWalker;
/**
@@ -735,6 +745,68 @@ public class ASEmitter implements IASEmi
}
@Override
+ public void emitIf(IIfNode node)
+ {
+ IConditionalNode conditional = (IConditionalNode) node.getChild(0);
+
+ IContainerNode xnode = (IContainerNode) conditional
+ .getStatementContentsNode();
+
+ write("if");
+ write(" ");
+ write("(");
+ getWalker().walk(conditional.getChild(0)); // conditional expression
+ write(")");
+ if (!isImplicit(xnode))
+ write(" ");
+
+ getWalker().walk(conditional.getChild(1)); // BlockNode
+ IConditionalNode[] nodes = node.getElseIfNodes();
+ if (nodes.length > 0)
+ {
+ for (int i = 0; i < nodes.length; i++)
+ {
+ IConditionalNode enode = nodes[i];
+ IContainerNode snode = (IContainerNode) enode
+ .getStatementContentsNode();
+
+ final boolean isImplicit = isImplicit(snode);
+ if (isImplicit)
+ write("\n");
+ else
+ write(" ");
+
+ write("else if");
+ write(" ");
+ write("(");
+ getWalker().walk(enode.getChild(0));
+ write(")");
+ if (!isImplicit)
+ write(" ");
+
+ getWalker().walk(enode.getChild(1)); // ConditionalNode
+ }
+ }
+
+ ITerminalNode elseNode = node.getElseNode();
+ if (elseNode != null)
+ {
+ IContainerNode cnode = (IContainerNode) elseNode.getChild(0);
+ // if an implicit if, add a newline with no space
+ final boolean isImplicit = isImplicit(cnode);
+ if (isImplicit)
+ write("\n");
+ else
+ write(" ");
+ write("else");
+ if (!isImplicit)
+ write(" ");
+
+ getWalker().walk(elseNode); // TerminalNode
+ }
+ }
+
+ @Override
public void emitForEachLoop(IForLoopNode node)
{
IContainerNode xnode = (IContainerNode) node.getChild(1);
@@ -781,6 +853,142 @@ public class ASEmitter implements IASEmi
getWalker().walk(node.getStatementContentsNode());
}
+ @Override
+ public void emitSwitch(ISwitchNode node)
+ {
+ write("switch");
+ write(" ");
+ write("(");
+ getWalker().walk(node.getChild(0));
+ write(")");
+ write(" {");
+ indentPush();
+ write("\n");
+
+ IConditionalNode[] cnodes = getCaseNodes(node);
+ ITerminalNode dnode = getDefaultNode(node);
+
+ for (int i = 0; i < cnodes.length; i++)
+ {
+ IConditionalNode casen = cnodes[i];
+ IContainerNode cnode = (IContainerNode) casen.getChild(1);
+ write("case");
+ write(" ");
+ getWalker().walk(casen.getConditionalExpressionNode());
+ write(":");
+ if (!isImplicit(cnode))
+ write(" ");
+ getWalker().walk(casen.getStatementContentsNode());
+ if (i == cnodes.length - 1 && dnode == null)
+ {
+ indentPop();
+ write("\n");
+ }
+ else
+ write("\n");
+ }
+ if (dnode != null)
+ {
+ IContainerNode cnode = (IContainerNode) dnode.getChild(0);
+ write("default");
+ write(":");
+ if (!isImplicit(cnode))
+ write(" ");
+ getWalker().walk(dnode);
+ indentPop();
+ write("\n");
+ }
+ write("}");
+ }
+
+ @Override
+ public void emitWhileLoop(IWhileLoopNode node)
+ {
+ IContainerNode cnode = (IContainerNode) node.getChild(1);
+ write("while");
+ write(" ");
+ write("(");
+ getWalker().walk(node.getConditionalExpressionNode());
+ write(")");
+ if (!isImplicit(cnode))
+ write(" ");
+ getWalker().walk(node.getStatementContentsNode());
+ }
+
+ @Override
+ public void emitDoLoop(IWhileLoopNode node)
+ {
+ IContainerNode cnode = (IContainerNode) node.getChild(0);
+ write("do");
+ if (!isImplicit(cnode))
+ write(" ");
+ getWalker().walk(node.getStatementContentsNode());
+ if (!isImplicit(cnode))
+ write(" ");
+ else
+ write("\n"); // TODO (mschmalle) there is something wrong here, block should NL
+ write("while");
+ write(" ");
+ write("(");
+ getWalker().walk(node.getConditionalExpressionNode());
+ write(");");
+ }
+
+ @Override
+ public void emitWith(IWithNode node)
+ {
+ IContainerNode cnode = (IContainerNode) node.getChild(1);
+ write("with");
+ write(" ");
+ write("(");
+ getWalker().walk(node.getTargetNode());
+ write(")");
+ if (!isImplicit(cnode))
+ write(" ");
+ getWalker().walk(node.getStatementContentsNode());
+ }
+
+ @Override
+ public void emitThrow(IThrowNode node)
+ {
+ write("throw");
+ write(" ");
+ getWalker().walk(node.getThrownExpressionNode());
+ }
+
+ @Override
+ public void emitTry(ITryNode node)
+ {
+ write("try");
+ write(" ");
+ getWalker().walk(node.getStatementContentsNode());
+ for (int i = 0; i < node.getCatchNodeCount(); i++)
+ {
+ getWalker().walk(node.getCatchNode(i));
+ }
+ ITerminalNode fnode = node.getFinallyNode();
+ if (fnode != null)
+ {
+ write(" ");
+ write("finally");
+ write(" ");
+ getWalker().walk(fnode);
+ }
+ }
+
+ @Override
+ public void emitCatch(ICatchNode node)
+ {
+ write(" ");
+ write("catch");
+ write(" ");
+ write("(");
+ getWalker().walk(node.getCatchParameterNode());
+ write(")");
+ write(" ");
+ getWalker().walk(node.getStatementContentsNode());
+ }
+
//--------------------------------------------------------------------------
// Expressions
//--------------------------------------------------------------------------
@@ -914,4 +1122,41 @@ public class ASEmitter implements IASEmi
getWalker().walk(node2);
}
}
+
+ //--------------------------------------------------------------------------
+ // Temp: These need JIRA tickets
+ //--------------------------------------------------------------------------
+
+ // there seems to be a bug in the ISwitchNode.getCaseNodes(), need to file a bug
+ public IConditionalNode[] getCaseNodes(ISwitchNode node)
+ {
+ IBlockNode block = (IBlockNode) node.getChild(1);
+ int childCount = block.getChildCount();
+ ArrayList<IConditionalNode> retVal = new ArrayList<IConditionalNode>(
+ childCount);
+
+ for (int i = 0; i < childCount; i++)
+ {
+ IASNode child = block.getChild(i);
+ if (child instanceof IConditionalNode)
+ retVal.add((IConditionalNode) child);
+ }
+
+ return retVal.toArray(new IConditionalNode[0]);
+ }
+
+ // there seems to be a bug in the ISwitchNode.getDefaultNode(), need to file a bug
+ public ITerminalNode getDefaultNode(ISwitchNode node)
+ {
+ IBlockNode block = (IBlockNode) node.getChild(1);
+ int childCount = block.getChildCount();
+ for (int i = childCount - 1; i >= 0; i--)
+ {
+ IASNode child = block.getChild(i);
+ if (child instanceof ITerminalNode)
+ return (ITerminalNode) child;
+ }
+
+ return null;
+ }
}