AssignNode.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import TempNode from '../core/TempNode.js';
  2. import { addMethodChaining, nodeProxy } from '../tsl/TSLCore.js';
  3. import { vectorComponents } from '../core/constants.js';
  4. class AssignNode extends TempNode {
  5. static get type() {
  6. return 'AssignNode';
  7. }
  8. constructor( targetNode, sourceNode ) {
  9. super();
  10. this.targetNode = targetNode;
  11. this.sourceNode = sourceNode;
  12. }
  13. hasDependencies() {
  14. return false;
  15. }
  16. getNodeType( builder, output ) {
  17. return output !== 'void' ? this.targetNode.getNodeType( builder ) : 'void';
  18. }
  19. needsSplitAssign( builder ) {
  20. const { targetNode } = this;
  21. if ( builder.isAvailable( 'swizzleAssign' ) === false && targetNode.isSplitNode && targetNode.components.length > 1 ) {
  22. const targetLength = builder.getTypeLength( targetNode.node.getNodeType( builder ) );
  23. const assignDiferentVector = vectorComponents.join( '' ).slice( 0, targetLength ) !== targetNode.components;
  24. return assignDiferentVector;
  25. }
  26. return false;
  27. }
  28. generate( builder, output ) {
  29. const { targetNode, sourceNode } = this;
  30. const needsSplitAssign = this.needsSplitAssign( builder );
  31. const targetType = targetNode.getNodeType( builder );
  32. const target = targetNode.context( { assign: true } ).build( builder );
  33. const source = sourceNode.build( builder, targetType );
  34. const sourceType = sourceNode.getNodeType( builder );
  35. const nodeData = builder.getDataFromNode( this );
  36. //
  37. let snippet;
  38. if ( nodeData.initialized === true ) {
  39. if ( output !== 'void' ) {
  40. snippet = target;
  41. }
  42. } else if ( needsSplitAssign ) {
  43. const sourceVar = builder.getVarFromNode( this, null, targetType );
  44. const sourceProperty = builder.getPropertyName( sourceVar );
  45. builder.addLineFlowCode( `${ sourceProperty } = ${ source }` );
  46. const targetRoot = targetNode.node.context( { assign: true } ).build( builder );
  47. for ( let i = 0; i < targetNode.components.length; i ++ ) {
  48. const component = targetNode.components[ i ];
  49. builder.addLineFlowCode( `${ targetRoot }.${ component } = ${ sourceProperty }[ ${ i } ]` );
  50. }
  51. if ( output !== 'void' ) {
  52. snippet = target;
  53. }
  54. } else {
  55. snippet = `${ target } = ${ source }`;
  56. if ( output === 'void' || sourceType === 'void' ) {
  57. builder.addLineFlowCode( snippet );
  58. if ( output !== 'void' ) {
  59. snippet = target;
  60. }
  61. }
  62. }
  63. nodeData.initialized = true;
  64. return builder.format( snippet, targetType, output );
  65. }
  66. }
  67. export default AssignNode;
  68. export const assign = /*@__PURE__*/ nodeProxy( AssignNode );
  69. addMethodChaining( 'assign', assign );
粤ICP备19079148号