Index: src/main/java/uk/co/badgersinfoil/metaas/dom/ASExpressionStatement.java =================================================================== --- src/main/java/uk/co/badgersinfoil/metaas/dom/ASExpressionStatement.java (revision 575) +++ src/main/java/uk/co/badgersinfoil/metaas/dom/ASExpressionStatement.java (working copy) @@ -17,6 +17,11 @@ public interface ASExpressionStatement extends Statement { /** + * Returns the expression this statement would evaluate when run. + */ + public ASExpression getExpression(); + + /** * Returns a string representation of the expression this statement * would evaluate when run. */ Index: src/main/java/uk/co/badgersinfoil/metaas/dom/ASAssignmentExpression.java =================================================================== --- src/main/java/uk/co/badgersinfoil/metaas/dom/ASAssignmentExpression.java (revision 0) +++ src/main/java/uk/co/badgersinfoil/metaas/dom/ASAssignmentExpression.java (revision 0) @@ -0,0 +1,46 @@ +package uk.co.badgersinfoil.metaas.dom; + +public interface ASAssignmentExpression extends ASExpression { + public Op getOperator(); + public void setOperator(Op operator); + public ASExpression getLeftSubexpression(); + public void setLeftSubexpression(ASExpression left); + public ASExpression getRightSubexpression(); + public void setRightSubexpression(ASExpression right); + + public static class Op { + private String name; + private Op(String name) { + this.name = name; + } + + /** '+=' */ + public static final Op ADD_ASSIGN = new Op("ADD_ASSIGN"); + /** Assignment '=' */ + public static final Op ASSIGN = new Op("ASSIGN"); + /** '&=' */ + public static final Op BITAND_ASSIGN = new Op("BITAND_ASSIGN"); + /** '|=' */ + public static final Op BITOR_ASSIGN = new Op("BITOR_ASSIGN"); + /** '^=' */ + public static final Op BITXOR_ASSIGN = new Op("BITXOR_ASSIGN"); + /** '/=' */ + public static final Op DIV_ASSIGN = new Op("DIV_ASSIGN"); + /** '%=' */ + public static final Op MOD_ASSIGN = new Op("MOD_ASSIGN"); + /** '*=' */ + public static final Op MUL_ASSIGN = new Op("MUL_ASSIGN"); + /** Left Shift Assigment '<<=' */ + public static final Op SL_ASSIGN = new Op("SL_ASSIGN"); + /** Right Shift Assigment '>>=' */ + public static final Op SR_ASSIGN = new Op("SR_ASSIGN"); + /** Unsigned Right Shift Assigment '>>>=' */ + public static final Op SRU_ASSIGN = new Op("SRU_ASSIGN"); + /** '-=' */ + public static final Op SUB_ASSIGN = new Op("SUB_ASSIGN"); + + public String toString() { + return name; + } + } +} \ No newline at end of file Index: src/main/java/uk/co/badgersinfoil/metaas/impl/ExpressionBuilder.java =================================================================== --- src/main/java/uk/co/badgersinfoil/metaas/impl/ExpressionBuilder.java (revision 575) +++ src/main/java/uk/co/badgersinfoil/metaas/impl/ExpressionBuilder.java (working copy) @@ -18,6 +18,19 @@ case AS3Parser.TRUE: case AS3Parser.FALSE: return new ASTASBooleanLiteral(ast); + case AS3Parser.PLUS_ASSIGN: + case AS3Parser.ASSIGN: + case AS3Parser.BAND_ASSIGN: + case AS3Parser.BOR_ASSIGN: + case AS3Parser.BXOR_ASSIGN: + case AS3Parser.DIV_ASSIGN: + case AS3Parser.MOD_ASSIGN: + case AS3Parser.STAR_ASSIGN: + case AS3Parser.SL_ASSIGN: + case AS3Parser.SR_ASSIGN: + case AS3Parser.BSR_ASSIGN: + case AS3Parser.MINUS_ASSIGN: + return new ASTASAssignmentExpression(ast); case AS3Parser.PLUS: case AS3Parser.LAND: case AS3Parser.BAND: Index: src/main/java/uk/co/badgersinfoil/metaas/impl/ASTASAssignmentExpression.java =================================================================== --- src/main/java/uk/co/badgersinfoil/metaas/impl/ASTASAssignmentExpression.java (revision 0) +++ src/main/java/uk/co/badgersinfoil/metaas/impl/ASTASAssignmentExpression.java (revision 0) @@ -0,0 +1,45 @@ +package uk.co.badgersinfoil.metaas.impl; + +import uk.co.badgersinfoil.metaas.dom.ASAssignmentExpression; +import uk.co.badgersinfoil.metaas.dom.ASExpression; +import uk.co.badgersinfoil.metaas.impl.antlr.LinkedListTree; + +public class ASTASAssignmentExpression extends ASTASExpression + implements ASAssignmentExpression +{ + public ASTASAssignmentExpression(LinkedListTree ast) { + super(ast); + } + + public ASExpression getLeftSubexpression() { + return ExpressionBuilder.build(ast.getFirstChild()); + } + + public Op getOperator() { + return AssignmentOperatorMap.opFromType(ast.getType()); + } + + public ASExpression getRightSubexpression() { + return ExpressionBuilder.build(ast.getLastChild()); + } + + public void setLeftSubexpression(ASExpression left) { + setSubexpression(0, left); + } + + public void setOperator(Op operator) { + AssignmentOperatorMap.initialiseFromOp(operator, ast.getToken()); + } + + public void setRightSubexpression(ASExpression right) { + setSubexpression(1, right); + } + + private void setSubexpression(int index, ASExpression subexpression) { + ASTASExpression sub = (ASTASExpression)subexpression; + LinkedListTree subExpr = sub.getAST(); + ASTBuilder.assertNoParent("expression", subExpr); + // TODO: handle operator precedence issues + ast.setChildWithTokens(index, subExpr); + } +} \ No newline at end of file Index: src/main/java/uk/co/badgersinfoil/metaas/impl/ASTASExpressionStatement.java =================================================================== --- src/main/java/uk/co/badgersinfoil/metaas/impl/ASTASExpressionStatement.java (revision 575) +++ src/main/java/uk/co/badgersinfoil/metaas/impl/ASTASExpressionStatement.java (working copy) @@ -1,5 +1,6 @@ package uk.co.badgersinfoil.metaas.impl; +import uk.co.badgersinfoil.metaas.dom.ASExpression; import uk.co.badgersinfoil.metaas.dom.ASExpressionStatement; import uk.co.badgersinfoil.metaas.impl.antlr.LinkedListTree; @@ -11,6 +12,10 @@ this.ast = ast; } + public ASExpression getExpression() { + return ExpressionBuilder.build(ast.getFirstChild()); + } + public String getExpressionString() { return ASTUtils.stringifyNode(ast.getFirstChild()); } Index: src/main/java/uk/co/badgersinfoil/metaas/impl/AssignmentOperatorMap.java =================================================================== --- src/main/java/uk/co/badgersinfoil/metaas/impl/AssignmentOperatorMap.java (revision 0) +++ src/main/java/uk/co/badgersinfoil/metaas/impl/AssignmentOperatorMap.java (revision 0) @@ -0,0 +1,51 @@ +package uk.co.badgersinfoil.metaas.impl; + +import java.util.HashMap; +import java.util.Map; +import org.antlr.runtime.Token; +import org.asdt.core.internal.antlr.AS3Parser; +import uk.co.badgersinfoil.metaas.dom.ASAssignmentExpression; +import uk.co.badgersinfoil.metaas.impl.antlr.LinkedListToken; + +public class AssignmentOperatorMap { + + private static final Map OPERATORS_BY_TYPE = new HashMap(); + private static final Map TYPES_BY_OPERATOR = new HashMap(); + + private static void mapOp(int type, String text, ASAssignmentExpression.Op operator) { + OPERATORS_BY_TYPE.put(new Integer(type), operator); + TYPES_BY_OPERATOR.put(operator, new LinkedListToken(type, text)); + } + + static { + mapOp(AS3Parser.PLUS_ASSIGN, "+=", ASAssignmentExpression.Op.ADD_ASSIGN); + mapOp(AS3Parser.ASSIGN, "=", ASAssignmentExpression.Op.ASSIGN); + mapOp(AS3Parser.BAND_ASSIGN, "&=", ASAssignmentExpression.Op.BITAND_ASSIGN); + mapOp(AS3Parser.BOR_ASSIGN, "|=", ASAssignmentExpression.Op.BITOR_ASSIGN); + mapOp(AS3Parser.BXOR_ASSIGN, "^=", ASAssignmentExpression.Op.BITXOR_ASSIGN); + mapOp(AS3Parser.DIV_ASSIGN, "/=", ASAssignmentExpression.Op.DIV_ASSIGN); + mapOp(AS3Parser.MOD_ASSIGN, "%=", ASAssignmentExpression.Op.MOD_ASSIGN); + mapOp(AS3Parser.STAR_ASSIGN, "*=", ASAssignmentExpression.Op.MUL_ASSIGN); + mapOp(AS3Parser.SL_ASSIGN, "<<=", ASAssignmentExpression.Op.SL_ASSIGN); + mapOp(AS3Parser.SR_ASSIGN, ">>=", ASAssignmentExpression.Op.SR_ASSIGN); + mapOp(AS3Parser.BSR_ASSIGN, ">>=", ASAssignmentExpression.Op.SRU_ASSIGN); + mapOp(AS3Parser.MINUS_ASSIGN, "-=", ASAssignmentExpression.Op.SUB_ASSIGN); + } + + public static ASAssignmentExpression.Op opFromType(int type) { + ASAssignmentExpression.Op op = (ASAssignmentExpression.Op)OPERATORS_BY_TYPE.get(new Integer(type)); + if (op == null) { + throw new IllegalArgumentException("No operator for token-type "+ASTUtils.tokenName(type)); + } + return op; + } + + public static void initialiseFromOp(ASAssignmentExpression.Op operator, Token tok) { + LinkedListToken type = (LinkedListToken)TYPES_BY_OPERATOR.get(operator); + if (type == null) { + throw new IllegalArgumentException("No operator for Op "+operator); + } + tok.setType(type.getType()); + tok.setText(type.getText()); + } +} \ No newline at end of file