@directive is dropped on @this functions

未關閉
#9,197 0 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

維護者通常 1 天內回覆

還沒有人認領這個 Issue。

評估

難度
4/5
預估耗時
3-5 天
新手友好度
55/100
Issue 類型
缺陷
描述清晰度
描述清楚
活躍度
活躍
技術堆疊
javascript, ocaml
領域
compilers

研究方向

Start with the Pjs_fn_method case in compiler/core/lam_compile.ml, then follow how E.method_ builds functions in compiler/core/js_exp_make.ml and how the method branch prints them in Js_dump.pp_function. Check the frontend @this rewrite to confirm the directive stays on the inner function; printlambda does not show directives. Done means @directive appears first in the generated method body, before let self = this, for both examples while preserving async.

由索引模型根據 Issue 內容生成。

描述

A @this function loses its @directive. Nothing is reported, and async on the same function is kept.

let plain = @this @directive("'use cache'") (self, x) => self + x
let action = @this @directive("'use server'") async (self, x) => self + x

compiles to

function plain(x) {
  let self = this ;
  return self + x | 0;
}

async function action(x) {
  let self = this ;
  return self + x | 0;
}

Neither directive appears in the output. Without @this, the directive is kept (function d(n) { 'use cache'; … }).

Cause

@this compiles through %unsafe_to_method to Pjs_fn_method, and that path drops the directive:

  • compiler/core/lam_compile.ml: the Pjs_fn_method case matches attr = {return_unit; async} and never reads directive.
  • compiler/core/js_exp_make.ml: E.method_ has no directive parameter and builds the function with directive = None.

Fixing it

Passing the directive through is not enough. In Js_dump.pp_function, the method branch prints let self = this before function_body ?directive. The directive would then not be the first statement in the body, so JavaScript would treat it as a plain string expression. The method branch has to print the directive before let self = this.

printlambda does not show directives, so check that the @this rewrite in the frontend keeps the attribute on the inner function.

Found while reviewing #9176, which fixes the related #9174 (forwarding async/directive functions reduced away). This bug was there before that PR.

主要語言
OCaml
星號
7.5k
分支
485
平均合併
16 小時 51 分鐘
30 天內合併 PR
268

環境準備

在 Codespaces 中開啟

在瀏覽器裡用你自己的 GitHub 帳號啟動這個專案的開發容器。

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

rescript-lang/rescript 的其他 Issue

查看 rescript-lang/rescript 的全部 Issue

相似的 Issue

更多 Compilers Issue

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。