language-server icon indicating copy to clipboard operation
language-server copied to clipboard

MTC: Tag variable inside a for-loop causes value is never read

Open AngusMorton opened this issue 11 months ago • 0 comments

@marko/type-check: 1.3.19

Repro:

<div>
  <for of=[]>
    <const/foo=true/>
  </for>
</div>

Error:

src/components/repro.marko - error TS6133
'__marko_internal_rendered_2' is declared but its value is never read.

Generates:

export interface Input {}
abstract class Component extends Marko.Component<Input> {}
export { type Component };
(function (this: void) {
  const input = Marko._.any as Input;
  const component = Marko._.any as Component;
  const state = Marko._.state(component);
  const out = Marko._.out;
  const $signal = Marko._.any as AbortSignal;
  const $global = Marko._.getGlobal(
    // @ts-expect-error We expect the compiler to error because we are checking if the MarkoRun.Context is defined.
    (Marko._.error, Marko._.any as MarkoRun.Context),
  );
  Marko._.noop({ component, state, out, input, $global, $signal });
  const __marko_internal_rendered_1 = Marko._.renderNativeTag("div")()()({
    ["renderBody" /*div*/]: (() => {
      const __marko_internal_rendered_2 = Marko._.forOfTag(
        {
          /*for*/ of: [],
        },
        () => {
          const __marko_internal_tag_1 = Marko._.resolveTemplate(
            import(
              "@marko/tags-api-preview/dist/components/const/index.d.marko"
            ),
          );
          const __marko_internal_rendered_3 = Marko._.renderTemplate(
            __marko_internal_tag_1,
          )()()({
            value: true,
          });
          const foo = __marko_internal_rendered_3.return.value;
          return new (class MarkoReturn<Return = void> {
            [Marko._.scope] = { foo };
            declare return: Return;
            constructor(_?: Return) {}
          })();
        },
      );
      return () => {
        return Marko._.voidReturn;
      };
    })(),
  });
  const { foo } = Marko._.readScopes({ __marko_internal_rendered_1 });
  Marko._.noop({ foo });
  return;
})();
export default new (class Template extends Marko._.Template<{
  render(
    input: Marko.TemplateInput<Input>,
    stream?: {
      write: (chunk: string) => void;
      end: (chunk?: string) => void;
    },
  ): Marko.Out<Component>;

  render(
    input: Marko.TemplateInput<Input>,
    cb?: (err: Error | null, result: Marko.RenderResult<Component>) => void,
  ): Marko.Out<Component>;

  renderSync(input: Marko.TemplateInput<Input>): Marko.RenderResult<Component>;

  renderToString(input: Marko.TemplateInput<Input>): string;

  stream(
    input: Marko.TemplateInput<Input>,
  ): ReadableStream<string> & NodeJS.ReadableStream;

  api: "class";
  _(): () => <__marko_internal_input extends unknown>(
    input: Marko.Directives &
      Input &
      Marko._.Relate<__marko_internal_input, Marko.Directives & Input>,
  ) => Marko._.ReturnWithScope<__marko_internal_input, void>;
}> {})();

AngusMorton avatar Mar 07 '25 09:03 AngusMorton