From ac32fe63c96fb54df8b7257f7791329b57d6a442 Mon Sep 17 00:00:00 2001 From: Dylan Piercey Date: Tue, 4 Jan 2022 15:44:45 -0700 Subject: [PATCH] fix: avoid infinite recursion on self reference dep --- .../with-default/node.render.expected.html | 0 .../with-default/web.render.expected.html | 0 .../fixtures/misc/self-reference-fn/index.test.ts | 5 +++++ .../self-reference-fn/templates/self-reference.marko | 3 +++ src/transform/cached-function/transform.ts | 11 +++++++---- 5 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 src/__tests__/fixtures/misc/self-reference-fn/__snapshots__/misc-self-reference/with-default/node.render.expected.html create mode 100644 src/__tests__/fixtures/misc/self-reference-fn/__snapshots__/misc-self-reference/with-default/web.render.expected.html create mode 100644 src/__tests__/fixtures/misc/self-reference-fn/index.test.ts create mode 100644 src/__tests__/fixtures/misc/self-reference-fn/templates/self-reference.marko 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);