Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build/build.properties
Original file line number Diff line number Diff line change
@@ -1 +1 @@
compiler.version=0.2.6.2
compiler.version=0.2.6.4
2 changes: 1 addition & 1 deletion src/main/java/randori/compiler/common/VersionInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public class VersionInfo
public static final String RANDORI_BUILD = "1";
public static final String RANDORI_BUILD_VERSION = "1";

public static final String RANDORI_COMPILER_VERSION = "0.2.6.2";
public static final String RANDORI_COMPILER_VERSION = "0.2.6.5_renaun";
public static final String RANDORI_COMPILER_NAME = "randori";

public static final String LIB_VERSION_1_0 = "1.0";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -450,15 +450,15 @@ public void visitLiteral(ILiteralNode node)
|| node.getLiteralType() == LiteralType.NUMBER
|| node.getLiteralType() == LiteralType.REGEXP
|| node.getLiteralType() == LiteralType.STRING
|| node.getLiteralType() == LiteralType.VOID)
|| node.getLiteralType() == LiteralType.VOID
|| node.getLiteralType() == LiteralType.XML)
{
emitter.emitLiteral(node);
}
else if (node.getLiteralType() == LiteralType.ARRAY
|| node.getLiteralType() == LiteralType.OBJECT
|| node.getLiteralType() == LiteralType.VECTOR
|| node.getLiteralType() == LiteralType.XMLLIST
|| node.getLiteralType() == LiteralType.XML)
|| node.getLiteralType() == LiteralType.XMLLIST)
{
emitter.emitLiteralContainer((ILiteralContainerNode) node);
}
Expand Down Expand Up @@ -518,7 +518,7 @@ public void visitBinaryOperator(IBinaryOperatorNode node)
@Override
public void visitUnaryOperator(IUnaryOperatorNode node)
{
debug("visitUnaryOperator()");
debug("visitUnaryOperator()" + node.getOperator().getOperatorText());
emitter.emitUnaryOperator(node);
}

Expand Down Expand Up @@ -619,7 +619,7 @@ public void visitLanguageIdentifierNode(ILanguageIdentifierNode node)
//
//--------------------------------------------------------------------------

protected void debug(String message)
public void debug(String message)
{
if (isDebug)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@
import randori.compiler.internal.utils.MetaDataUtils.MetaData.Mode;
import randori.compiler.internal.utils.RandoriUtils;

import org.apache.flex.compiler.internal.tree.as.ExpressionNodeBase;
/**
* The base ship...
*
Expand Down Expand Up @@ -270,6 +271,7 @@ public void emitClass(IClassNode node)
}

writeNewline(";");
// REE footer.emitNewInherit(node);
}
}

Expand All @@ -282,7 +284,6 @@ public void emitClass(IClassNode node)
for (IDefinitionNode member : members)
{
IDefinition definition = member.getDefinition();

if (member.getNodeID() == ASTNodeID.FunctionID)
{
if (((IFunctionDefinition) definition).isConstructor())
Expand Down Expand Up @@ -642,6 +643,7 @@ public void emitMethodScope(IFunctionNode node)
@Override
public void emitUnaryOperator(IUnaryOperatorNode node)
{

if (node.getNodeID() == ASTNodeID.Op_PreIncrID
|| node.getNodeID() == ASTNodeID.Op_PreDecrID
|| node.getNodeID() == ASTNodeID.Op_BitwiseNotID
Expand Down Expand Up @@ -674,6 +676,26 @@ else if (node.getNodeID() == ASTNodeID.Op_TypeOfID)
getWalker().walk(node.getOperandNode());
write(")");
}
// E4X @name change to .attribute('name')
else if (node.getNodeID() == ASTNodeID.Op_AtID)
{
if (node instanceof ExpressionNodeBase )
{
// Ensure we're not in a with scope or part of a filter expression.
final ExpressionNodeBase expressionNode = (ExpressionNodeBase)node;
if (expressionNode.inFilter())
{
getWalker().walk(node.getOperandNode());
return;
}
}

write("attribute('");
getWalker().walk(node.getOperandNode());
write("')");

//write(node.getOperator().getOperatorText());
}
}

private void emitPostAssignment(IUnaryOperatorNode node, String operator)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,7 @@
import java.util.HashMap;
import java.util.List;

import org.apache.flex.compiler.definitions.IClassDefinition;
import org.apache.flex.compiler.definitions.IDefinition;
import org.apache.flex.compiler.definitions.IFunctionDefinition;
import org.apache.flex.compiler.definitions.IScopedDefinition;
import org.apache.flex.compiler.definitions.IVariableDefinition;
import org.apache.flex.compiler.definitions.*;
import org.apache.flex.compiler.definitions.metadata.IMetaTag;
import org.apache.flex.compiler.internal.scopes.TypeScope;
import org.apache.flex.compiler.tree.as.IASNode;
Expand All @@ -47,6 +43,8 @@
*/
public class SessionModel implements ISessionModel
{
private HashMap<String, IAccessorDefinition> getterSetterProperties = new HashMap<String, IAccessorDefinition>();

private HashMap<String, IScopedDefinition> runtimeDependencies = new HashMap<String, IScopedDefinition>();

private HashMap<String, IScopedDefinition> staticDependencies = new HashMap<String, IScopedDefinition>();
Expand Down Expand Up @@ -132,6 +130,20 @@ public void setInScope(boolean value)
// Dependencies
//--------------------------------------------------------------------------


public void addGetterSetter(IAccessorDefinition definition)
{
if (getterSetterProperties.containsKey(definition.getQualifiedName()))
return;

getterSetterProperties.put(definition.getQualifiedName(), definition);
}

public Collection<IAccessorDefinition> getGetterSetter()
{
return getterSetterProperties.values();
}

@Override
public void addDependency(IScopedDefinition definition, IASNode node)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,21 +22,18 @@
import org.apache.flex.compiler.definitions.IAccessorDefinition;
import org.apache.flex.compiler.definitions.IDefinition;
import org.apache.flex.compiler.definitions.IFunctionDefinition;
import org.apache.flex.compiler.definitions.ITypeDefinition;
import org.apache.flex.compiler.internal.tree.as.BinaryOperatorAssignmentNode;
import org.apache.flex.compiler.internal.tree.as.IdentifierNode;
import org.apache.flex.compiler.projects.ICompilerProject;
import org.apache.flex.compiler.tree.ASTNodeID;
import org.apache.flex.compiler.tree.as.IBinaryOperatorNode;
import org.apache.flex.compiler.tree.as.IExpressionNode;
import org.apache.flex.compiler.tree.as.IIdentifierNode;
import org.apache.flex.compiler.tree.as.IMemberAccessExpressionNode;
import org.apache.flex.compiler.tree.as.*;

import randori.compiler.codegen.js.IRandoriEmitter;
import randori.compiler.codegen.js.ISubEmitter;
import randori.compiler.internal.utils.ASNodeUtils;
import randori.compiler.internal.utils.DefinitionNameUtils;
import randori.compiler.internal.utils.ExpressionUtils;
import randori.compiler.internal.utils.MetaDataUtils;
import randori.compiler.internal.utils.RandoriUtils;
import randori.compiler.internal.utils.*;

import org.apache.flex.compiler.internal.tree.as.ExpressionNodeBase;
/**
* Handles the production of the {@link IBinaryOperatorNode}.
*
Expand All @@ -54,6 +51,20 @@ public BinaryOperatorEmitter(IRandoriEmitter emitter)
@Override
public void emit(IBinaryOperatorNode node)
{
// THIS IS HARD CODED "filter" but maybe needs to be dynamic at some point
// "filter" is applied to E4X expressions and is implemented in JXONTree
boolean isFilter = false;
if (node instanceof ExpressionNodeBase)
{
// Ensure we're not in a with scope or part of a filter expression.
final ExpressionNodeBase expressionNode = (ExpressionNodeBase)node;
if (expressionNode.inFilter() && expressionNode.hasParenthesis())
{
isFilter = true;
write("filter");
}
}

ICompilerProject project = getEmitter().getWalker().getProject();

IExpressionNode left = node.getLeftOperandNode();
Expand All @@ -62,6 +73,30 @@ public void emit(IBinaryOperatorNode node)
IExpressionNode right = node.getRightOperandNode();
IDefinition rhsDefinition = right.resolve(project);

// This is a special case for array assessor on flash.utils.ByteArray
// when an assignment is being made. Array assessor for retrieving data is separate
if (left.getNodeID() == ASTNodeID.ArrayIndexExpressionID
&& node.getOperator().getOperatorText() == "=")
{
IDynamicAccessNode arrayNode = (IDynamicAccessNode)left;
IDefinition definition = arrayNode.getLeftOperandNode().resolve(project);
if (definition != null && arrayNode.getLeftOperandNode() instanceof IdentifierNode && definition.getTypeReference() != null
&& definition.getTypeReference().getName().indexOf("ByteArray") > -1)
{
//System.out.println("**** ASSIGNMENT WITH ARRAY ASSESSOR ****");
// TODO Check for ByteArray builtin
getModel().setInAssignment(false);
getEmitter().getWalker().walk(arrayNode.getLeftOperandNode());
write(".setValueByPosition(");
getEmitter().getWalker().walk(arrayNode.getRightOperandNode());
write(",");
// TODO not sure if need to do same checks as below
getEmitter().getWalker().walk(right);
write(")");
return;
}
}

// Compound statements
if (ExpressionUtils.isCompoundAssignment(node, lhsDefinition))
{
Expand All @@ -71,11 +106,24 @@ public void emit(IBinaryOperatorNode node)

if (ASNodeUtils.hasParenOpen(node))
write("(");
if (isFilter)
write("'");

// if on the left side with '=' , we are in setter mode
getModel().setInAssignment(ExpressionUtils.isInAssignment(node));
getModel().setAssign(node);

// Case where right is another BinaryOperatorAssignment
if (right instanceof BinaryOperatorAssignmentNode)
{
emitBinaryRightAssignment(rhsDefinition, right);
writeNewline(";");

// Need to reset to this parent node
getModel().setInAssignment(ExpressionUtils.isInAssignment(node));
getModel().setAssign(node);
}

getEmitter().getWalker().walk(left);

if (!MetaDataUtils.isNative(lhsDefinition)
Expand All @@ -100,11 +148,34 @@ && getModel().isInAssignment()
boolean wasAssignment = getModel().isInAssignment();
getModel().setInAssignment(false);

// Right was another Binary Assignment so we just need the getter to set this left side
// TODO this is still potentially prone to side affects in the getter functions
if (right instanceof BinaryOperatorAssignmentNode)
getEmitter().getWalker().walk(((IBinaryOperatorNode)right).getLeftOperandNode());
else
emitBinaryRightAssignment(rhsDefinition, right);

if (!MetaDataUtils.isNative(lhsDefinition) && wasAssignment
&& lhsDefinition instanceof IAccessorDefinition)
{
writeIfNotNative(")", lhsDefinition);
}

if (isFilter)
write("'");
if (ASNodeUtils.hasParenClose(node))
write(")");
}

private void emitBinaryRightAssignment(IDefinition rhsDefinition, IExpressionNode right)
{

if (rhsDefinition instanceof IFunctionDefinition
&& right instanceof IIdentifierNode)
{

// this is not a right hand function call, just a reff to accessor or function
write(IRandoriEmitter.STATIC_DELEGATE_NAME);

String pre = "this";
String parentQName = DefinitionNameUtils.toExportQualifiedName(
rhsDefinition.getParent(), getProject());
Expand All @@ -113,23 +184,21 @@ && getModel().isInAssignment()
pre = parentQName;
}
String name = getEmitter().stringifyNode(right);
if (name.contains("get_"))
{
name = "get_";
}
else if (name.contains("set_"))
if (name.contains("get_")
|| name.contains("set_"))
{
name = "set_";
getEmitter().getWalker().walk(right);
}
else
{
name = "";
write(IRandoriEmitter.STATIC_DELEGATE_NAME);
write("(" + pre + ", ");
write(pre);
write(".");
write(name + rhsDefinition.getBaseName());
write(")");
}
write("(" + pre + ", ");
write(pre);
write(".");
write(name + rhsDefinition.getBaseName());
write(")");
}
// else if (rhsDefinition instanceof IVariableDefinition
// && right instanceof IIdentifierNode)
Expand All @@ -154,15 +223,6 @@ else if (name.contains("set_"))
}

RandoriUtils.addBinaryRightDependency(right, getModel(), getProject());

if (!MetaDataUtils.isNative(lhsDefinition) && wasAssignment
&& lhsDefinition instanceof IAccessorDefinition)
{
writeIfNotNative(")", lhsDefinition);
}

if (ASNodeUtils.hasParenClose(node))
write(")");
}

private void emitCompoundAssignment(IBinaryOperatorNode node,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,16 @@

package randori.compiler.internal.codegen.js.emitter;

import org.apache.flex.compiler.definitions.IDefinition;
import org.apache.flex.compiler.internal.scopes.ASScope;
import org.apache.flex.compiler.internal.tree.as.IdentifierNode;
import org.apache.flex.compiler.projects.ICompilerProject;
import org.apache.flex.compiler.tree.as.IDynamicAccessNode;

import randori.compiler.codegen.js.IRandoriEmitter;
import randori.compiler.codegen.js.ISubEmitter;
import randori.compiler.internal.utils.DefinitionNameUtils;
import randori.compiler.internal.utils.ExpressionUtils;

/**
* Handles the production of the {@link IDynamicAccessNode}.
Expand All @@ -42,7 +48,17 @@ public DynamicAccessEmitter(IRandoriEmitter emitter)
public void emit(IDynamicAccessNode node)
{
getModel().setInAssignment(false);

ICompilerProject project = getEmitter().getWalker().getProject();
IDefinition definition = node.getLeftOperandNode().resolve(project);
if (definition != null && node.getLeftOperandNode() instanceof IdentifierNode && definition.getTypeReference() != null
&& definition.getTypeReference().getName().indexOf("ByteArray") > -1)
{
getEmitter().getWalker().walk(node.getLeftOperandNode());
write(".getValueByPosition(");
getEmitter().getWalker().walk(node.getRightOperandNode());
write(")");
return;
}
getEmitter().getWalker().walk(node.getLeftOperandNode());
write("[");
getEmitter().getWalker().walk(node.getRightOperandNode());
Expand Down
Loading