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

http://github.com/nddrylliog/ooc · Java · 81 lines · 65 code · 16 blank · 0 comment · 13 complexity · b285985a1e86cbf9dce4cc17960bcc37 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. public class Dereference extends Access {
  6. Type type;
  7. Expression expression;
  8. public Dereference(Expression expression, Token startToken) {
  9. super(startToken);
  10. setExpression(expression);
  11. }
  12. @Override
  13. public Expression getGenericOperand() {
  14. if(expression.getType().isGeneric() && expression.getType().getPointerLevel() > 0) {
  15. return expression;
  16. }
  17. return super.getGenericOperand();
  18. }
  19. @Override
  20. public boolean replace(Node oldie, Node kiddo) {
  21. if(expression == oldie) {
  22. expression = (Expression) kiddo;
  23. return true;
  24. }
  25. return false;
  26. }
  27. public Type getType() {
  28. if(type == null) {
  29. Type exprType = expression.getType();
  30. if(exprType != null) {
  31. type = exprType.clone();
  32. type.setPointerLevel(type.getPointerLevel() - 1);
  33. if(type.getPointerLevel() < 0) {
  34. if(type.getRef() instanceof CoverDecl) {
  35. CoverDecl cover = (CoverDecl) type.getRef();
  36. if(cover.getFromType() != null && !cover.getFromType().isFlat()) {
  37. type = cover.getFromType().clone();
  38. type.setPointerLevel(type.getPointerLevel() - 1);
  39. }
  40. }
  41. }
  42. }
  43. }
  44. return type;
  45. }
  46. public Expression getExpression() {
  47. return expression;
  48. }
  49. public void setExpression(Expression expression) {
  50. this.expression = expression;
  51. }
  52. public void accept(Visitor visitor) throws IOException {
  53. visitor.visit(this);
  54. }
  55. public void acceptChildren(Visitor visitor) throws IOException {
  56. expression.accept(visitor);
  57. }
  58. public boolean hasChildren() {
  59. return true;
  60. }
  61. @Override
  62. public boolean canBeReferenced() {
  63. return true;
  64. }
  65. }