arrayLiteral.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import { Literal } from './literal';
  2. export class ArrayLiteral extends Literal {
  3. /**
  4. *
  5. * @param {import('../../typeSystem/itype').IType} type
  6. * @param {import('./expression').Expression[]} value
  7. */
  8. constructor(type, value) {
  9. super(type);
  10. this.value = value;
  11. }
  12. get subtype () {
  13. const element = this.value[0];
  14. if (element instanceof ArrayLiteral) {
  15. return element.value[0].type;
  16. } else {
  17. return element.type;
  18. }
  19. }
  20. get lines () {
  21. return this.value.length;
  22. }
  23. get columns () {
  24. const element = this.value[0];
  25. if (!(element instanceof ArrayLiteral)){
  26. return null;
  27. } else {
  28. return element.value.length;
  29. }
  30. }
  31. get isVector () {
  32. return this.columns === null;
  33. }
  34. get isValid () {
  35. return this.validateSize() && this.validateType();
  36. }
  37. validateType () {
  38. const valid = true;
  39. // const subtype = this.subtype;
  40. // if(this.columns !== null) {
  41. // const len = this.lines;
  42. // const len2 = this.columns;
  43. // for (let i = len - 1; i >= 0 && valid; --i) {
  44. // for (let j = len2 - 1; j >= 0 && valid; --j) {
  45. // if(!this.value[i].value[j].type.isCompatilbe(subtype)) {
  46. // valid = false;
  47. // break;
  48. // }
  49. // }
  50. // }
  51. // } else {
  52. // const len = this.lines;
  53. // for (var i = len - 1; i >= 0 && valid; i--) {
  54. // if(!this.value[i].type.isCompatilbe(subtype)) {
  55. // valid = false;
  56. // break;
  57. // }
  58. // }
  59. // }
  60. // Cannot validate type since no information on variables literals are available
  61. return valid;
  62. }
  63. validateSize () {
  64. const valid = true;
  65. // if(this.columns !== null) {
  66. // const equalityTest = this.value.map(v => v.value.length)
  67. // .reduce((old, next) => {
  68. // console.log(next);
  69. // if (old == null) {
  70. // return next;
  71. // } else if (old === next) {
  72. // return old
  73. // } else {
  74. // return -1;
  75. // }
  76. // }, null);
  77. // valid = equalityTest !== -1;
  78. // }
  79. // check is now made inside IVProgParser.parseVectorList(...)
  80. return valid;
  81. }
  82. toString () {
  83. const strList = this.value.map(arrayLiteral => arrayLiteral.toString());
  84. const text = "{" + strList.join(',') + "}";
  85. if(this.parenthesis) {
  86. return `(${text})`;
  87. } else {
  88. return text;
  89. }
  90. }
  91. }