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);