ArrayElementNode.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import Node from '../core/Node.js';
  2. /**
  3. * Base class for representing element access on an array-like
  4. * node data structures.
  5. *
  6. * @augments Node
  7. */
  8. class ArrayElementNode extends Node { // @TODO: If extending from TempNode it breaks webgpu_compute
  9. static get type() {
  10. return 'ArrayElementNode';
  11. }
  12. /**
  13. * Constructs an array element node.
  14. *
  15. * @param {Node} node - The array-like node.
  16. * @param {Node} indexNode - The index node that defines the element access.
  17. */
  18. constructor( node, indexNode ) {
  19. super();
  20. /**
  21. * The array-like node.
  22. *
  23. * @type {Node}
  24. */
  25. this.node = node;
  26. /**
  27. * The index node that defines the element access.
  28. *
  29. * @type {Node}
  30. */
  31. this.indexNode = indexNode;
  32. /**
  33. * This flag can be used for type testing.
  34. *
  35. * @type {boolean}
  36. * @readonly
  37. * @default true
  38. */
  39. this.isArrayElementNode = true;
  40. }
  41. /**
  42. * This method is overwritten since the node type is inferred from the array-like node.
  43. *
  44. * @param {NodeBuilder} builder - The current node builder.
  45. * @return {string} The node type.
  46. */
  47. getNodeType( builder ) {
  48. return this.node.getElementType( builder );
  49. }
  50. /**
  51. * This method is overwritten since the member type is inferred from the array-like node.
  52. *
  53. * @param {NodeBuilder} builder - The current node builder.
  54. * @param {string} name - The member name.
  55. * @return {string} The member type.
  56. */
  57. getMemberType( builder, name ) {
  58. return this.node.getMemberType( builder, name );
  59. }
  60. generate( builder ) {
  61. const indexType = this.indexNode.getNodeType( builder );
  62. const nodeSnippet = this.node.build( builder );
  63. const indexSnippet = this.indexNode.build( builder, ! builder.isVector( indexType ) && builder.isInteger( indexType ) ? indexType : 'uint' );
  64. return `${ nodeSnippet }[ ${ indexSnippet } ]`;
  65. }
  66. }
  67. export default ArrayElementNode;
粤ICP备19079148号