Optional JSDoc rejects mandatory JavaScript setter parameters

未关闭
#3,355 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

@MathurAditya724 已经在做这个了。

开始于 2026年11月7日。

  • #3359 来自 @MathurAditya724 —— 未关闭

评估

难度
4/5
预计耗时
3-5 天
新手友好度
35/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
停滞
领域
compilers, testing

调研方向

Start at the setter-parameter preflight gate and the parser representation of optional JSDoc tokens; the issue does not name source files or test paths. Add regression coverage for class and object setters, checked JavaScript, syntax negatives, many setters, and same-filename JSX snapshots, then compare assignments, stored values, descriptors, and side effects with Node. Done means comment-only optional annotations pass while executable setter restrictions and caller checks remain intact.

由索引模型根据 Issue 内容生成。

描述

The generated Symbolic bindings used by the full Sentry CLI document several JavaScript setter parameters as optional in JSDoc. The executable parameters themselves are mandatory. Node accepts these setters, but scriptc rejects them before lowering.

This follows up on #3036 and #3044. They were closed as fixed by #3112, but that merged diff contains the regex change; current main still rejects this example:

class Store {
  constructor() { this.stored = null; }
  /** @param {string | null} [next] */
  set value(next) { this.stored = next; }
}
const store = new Store();
store.value = "kept";
console.log(store.stored);

Node prints kept. scriptc reports SC0001: A 'set' accessor cannot have an optional parameter. The diagnostic points into the JSDoc comment, not an executable ? parameter. The same problem occurs for object-literal setters and with // @ts-check.

The parser represents the optional JSDoc annotation with a synthetic optional token, and the preflight gate treats it as executable setter syntax. The full CLI currently has five instances of this diagnostic in Symbolic's generated bindings.

The requested fix should admit this comment-only JavaScript case while preserving errors for real optional, default, rest, or multiple setter parameters and keeping caller type checks and reflective argument-count restrictions intact.

A dependency can contain many documented setters, so eligibility should not rescan the whole file for every diagnostic. A per-preflight index keyed by SourceFile identity can collect attached comment spans once and find a containing span with binary search. SourceFile identity matters because original and rewritten JSX snapshots can share a filename but have different offsets.

Regression coverage should include class and object setters, checked JavaScript, the real syntax negatives, many setters, and JSX snapshots sharing a filename. Native differential coverage should check assignments, stored values, descriptor behavior, and observable side effects against Node.

Reproduced with scriptc 0.4.9 built from current main and Node 24.22.1. The current-main positive setter tests fail with TS1051 before any production change. Related earlier work: #3036, #3044, #3112.

主要语言
TypeScript
星标
6.5k
派生
212
平均合并
13 小时 2 分钟
30 天内合并 PR
798

环境准备

  • 没有 Dockerfile 或 Docker Compose 文件
  • 没有 Pull Request 模板
  • 阅读贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

vercel-labs/scriptc 的其他 Issue

查看 vercel-labs/scriptc 的全部 Issue

相似的 Issue

更多 TypeScript Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。