/src/org/ooc/frontend/model/RangeLiteral.java

http://github.com/nddrylliog/ooc · Java · 95 lines · 72 code · 23 blank · 0 comment · 5 complexity · aa0099db962ca299463762d7e395cdb6 MD5 · raw file

  1. package org.ooc.frontend.model;
  2. import java.io.IOException;
  3. import org.ooc.frontend.Visitor;
  4. import org.ooc.frontend.model.tokens.Token;
  5. import org.ooc.middle.hobgoblins.Resolver;
  6. public class RangeLiteral extends Literal {
  7. protected Expression lower;
  8. protected Expression upper;
  9. protected static Type type = new Type("Range", Token.defaultToken);
  10. public RangeLiteral(Expression lower, Expression upper, Token startToken) {
  11. super(startToken);
  12. this.lower = lower;
  13. this.upper = upper;
  14. }
  15. public Expression getLower() {
  16. return lower;
  17. }
  18. public void setLower(Expression lower) {
  19. this.lower = lower;
  20. }
  21. public Expression getUpper() {
  22. return upper;
  23. }
  24. public void setUpper(Expression upper) {
  25. this.upper = upper;
  26. }
  27. public Type getType() {
  28. return type;
  29. }
  30. public void accept(Visitor visitor) throws IOException {
  31. visitor.visit(this);
  32. }
  33. public boolean hasChildren() {
  34. return true;
  35. }
  36. public void acceptChildren(Visitor visitor) throws IOException {
  37. lower.accept(visitor);
  38. upper.accept(visitor);
  39. }
  40. @Override
  41. public boolean replace(Node oldie, Node kiddo) {
  42. if(oldie == lower) {
  43. lower = (Expression) kiddo;
  44. return true;
  45. }
  46. if(oldie == upper) {
  47. upper = (Expression) kiddo;
  48. return true;
  49. }
  50. return false;
  51. }
  52. @Override
  53. public boolean isResolved() {
  54. return false;
  55. }
  56. @Override
  57. public Response resolve(NodeList<Node> stack, Resolver res, boolean fatal) {
  58. Node parent = stack.peek();
  59. if(!(parent instanceof Foreach)) {
  60. MemberCall newCall = new MemberCall(new VariableAccess("Range", startToken), "new", null, startToken);
  61. newCall.getArguments().add(lower);
  62. newCall.getArguments().add(upper);
  63. parent.replace(this, newCall);
  64. return Response.RESTART;
  65. }
  66. return Response.OK;
  67. }
  68. @Override
  69. public String toString() {
  70. return getClass().getSimpleName()+":"+lower+".."+upper;
  71. }
  72. }