@@ -181,6 +181,70 @@ describe('[BABEL] "use gpu" directive', () => {
181181 ` ) ;
182182 } ) ;
183183
184+ it ( 'makes plugin transpile marked object method' , ( ) => {
185+ const code = `\
186+ const obj = {
187+ mod: (a: number, b: number): number => {
188+ 'use gpu';
189+ return a % b;
190+ }
191+ }
192+
193+ const isPrime = (n: number): boolean => {
194+ 'use gpu';
195+ if (n <= 1) {
196+ return false;
197+ }
198+
199+ for (let i = 2; i < n; i++) {
200+ if (obj.mod(n, i) === 0) {
201+ return false;
202+ }
203+ }
204+ return true;
205+ }
206+ ` ;
207+
208+ expect ( babelTransform ( code ) ) . toMatchInlineSnapshot ( `
209+ "const obj = {
210+ mod: ($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = (a: number, b: number): number => {
211+ 'use gpu';
212+
213+ return a % b;
214+ }, {
215+ v: 1,
216+ name: void 0,
217+ ast: {"params":[{"type":"i","name":"a"},{"type":"i","name":"b"}],"body":[0,[[10,[1,"a","%","b"]]]],"externalNames":[]},
218+ externals: () => {
219+ return {};
220+ }
221+ }) && $.f)({})
222+ };
223+ const isPrime = ($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = (n: number): boolean => {
224+ 'use gpu';
225+
226+ if (n <= 1) {
227+ return false;
228+ }
229+ for (let i = 2; i < n; i++) {
230+ if (obj.mod(n, i) === 0) {
231+ return false;
232+ }
233+ }
234+ return true;
235+ }, {
236+ v: 1,
237+ name: "isPrime",
238+ ast: {"params":[{"type":"i","name":"n"}],"body":[0,[[11,[1,"n","<=",[5,"1"]],[0,[[10,false]]]],[14,[12,"i",[5,"2"]],[1,"i","<","n"],[102,"++","i"],[0,[[11,[1,[6,[7,"obj","mod"],["n","i"]],"==",[5,"0"]],[0,[[10,false]]]]]]],[10,true]]],"externalNames":["obj"]},
239+ externals: () => {
240+ return {
241+ obj
242+ };
243+ }
244+ }) && $.f)({});"
245+ ` ) ;
246+ } ) ;
247+
184248 it ( 'parses when no typegpu import' , ( ) => {
185249 const code = `\
186250 function add(a, b) {
@@ -430,6 +494,65 @@ describe('[ROLLUP] "use gpu" directive', () => {
430494 ` ) ;
431495 } ) ;
432496
497+ it ( 'makes plugin transpile marked object method' , async ( ) => {
498+ const code = `\
499+ const obj = {
500+ mod: (a, b) => {
501+ 'use gpu';
502+ return a % b;
503+ }
504+ }
505+
506+ const isPrime = (n) => {
507+ 'use gpu';
508+ if (n <= 1) {
509+ return false;
510+ }
511+
512+ for (let i = 2; i < n; i++) {
513+ if (obj.mod(n, i) === 0) {
514+ return false;
515+ }
516+ }
517+ return true;
518+ }
519+ ` ;
520+
521+ expect ( await rollupTransform ( code ) ) . toMatchInlineSnapshot ( `
522+ "const obj = {
523+ mod: (($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = ((a, b) => {
524+ 'use gpu';
525+ return a % b;
526+ }), {
527+ v: 1,
528+ name: undefined,
529+ ast: {"params":[{"type":"i","name":"a"},{"type":"i","name":"b"}],"body":[0,[[10,[1,"a","%","b"]]]],"externalNames":[]},
530+ externals: () => ({}),
531+ }) && $.f)({}))
532+ };
533+
534+ (($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = ((n) => {
535+ 'use gpu';
536+ if (n <= 1) {
537+ return false;
538+ }
539+
540+ for (let i = 2; i < n; i++) {
541+ if (obj.mod(n, i) === 0) {
542+ return false;
543+ }
544+ }
545+ return true;
546+ }), {
547+ v: 1,
548+ name: "isPrime",
549+ ast: {"params":[{"type":"i","name":"n"}],"body":[0,[[11,[1,"n","<=",[5,"1"]],[0,[[10,false]]]],[14,[12,"i",[5,"2"]],[1,"i","<","n"],[102,"++","i"],[0,[[11,[1,[6,[7,"obj","mod"],["n","i"]],"==",[5,"0"]],[0,[[10,false]]]]]]],[10,true]]],"externalNames":["obj"]},
550+ externals: () => ({obj}),
551+ }) && $.f)({}));
552+ "
553+ ` ) ;
554+ } ) ;
555+
433556 it ( 'throws when hoisting was meant to be used' , async ( ) => {
434557 const code = `\
435558 const sum = add(1, 2);
0 commit comments