diff --git a/src/__tests__/fixtures/misc/self-reference-fn/__snapshots__/misc-self-reference/with-default/node.render.expected.html b/src/__tests__/fixtures/misc/self-reference-fn/__snapshots__/misc-self-reference/with-default/node.render.expected.html new file mode 100644 index 0000000..e69de29 diff --git a/src/__tests__/fixtures/misc/self-reference-fn/__snapshots__/misc-self-reference/with-default/web.render.expected.html b/src/__tests__/fixtures/misc/self-reference-fn/__snapshots__/misc-self-reference/with-default/web.render.expected.html new file mode 100644 index 0000000..e69de29 diff --git a/src/__tests__/fixtures/misc/self-reference-fn/index.test.ts b/src/__tests__/fixtures/misc/self-reference-fn/index.test.ts new file mode 100644 index 0000000..ca29577 --- /dev/null +++ b/src/__tests__/fixtures/misc/self-reference-fn/index.test.ts @@ -0,0 +1,5 @@ +import fixture from "../../../fixture"; + +describe("misc self reference", () => { + describe("with default", fixture("./templates/self-reference.marko")); +}); diff --git a/src/__tests__/fixtures/misc/self-reference-fn/templates/self-reference.marko b/src/__tests__/fixtures/misc/self-reference-fn/templates/self-reference.marko new file mode 100644 index 0000000..8677ef2 --- /dev/null +++ b/src/__tests__/fixtures/misc/self-reference-fn/templates/self-reference.marko @@ -0,0 +1,3 @@ + diff --git a/src/transform/cached-function/transform.ts b/src/transform/cached-function/transform.ts index 05f585e..40d5b58 100644 --- a/src/transform/cached-function/transform.ts +++ b/src/transform/cached-function/transform.ts @@ -6,10 +6,13 @@ import isCoreTag from "../../util/is-core-tag"; import getAttr from "../../util/get-attr"; import isApi from "../../util/is-api"; type DepsVisitorState = - | { shallow?: undefined; deps?: Set } - | { shallow: true; deps?: true }; + | { root: t.NodePath; shallow?: undefined; deps?: Set } + | { root: t.NodePath; shallow: true; deps?: true }; const depsVisitor = { + Function(fn, state) { + if (fn === state.root) fn.skip(); + }, ReferencedIdentifier: ((identifier, state) => { const { name } = identifier.node; const binding = identifier.scope.getBinding(name); @@ -26,7 +29,7 @@ const depsVisitor = { // Const tag reflects the default value as dependencies. const nestedState: DepsVisitorState = state.shallow ? state - : { shallow: true }; + : { root: state.root, shallow: true }; getAttr(bindingTag, "default")!.traverse(depsVisitor, nestedState); isDep = !!nestedState.deps; } else { @@ -60,7 +63,7 @@ export default { return; } - const state: DepsVisitorState & { deps?: Set } = {}; + const state: DepsVisitorState & { deps?: Set } = { root: fn }; fn.skip(); fn.traverse(depsVisitor, state);