Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

TypeScript: a local that shadows a project import is ignored from a nested arrow; the call links to the import

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

维护者通常 1 天内回复

还没有人认领这个 Issue。

评估

难度
3/5
预计耗时
1-2 天
新手友好度
68/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
活跃
技术栈
typescript
领域
tooling

调研方向

Start in src/resolution/frameworks/react.ts around lines 391-401, where the nested skipValue arrow calls a local skipString but the edge lands on the import from object-literal.ts; the same shape repeats around lines 432-441. Compare that project-import path with the package-import path fixed in #2855, then reproduce with the use.ts sample to see the lexical shadow check only inspects the call node's own scope. Done means enclosing-function bindings win for project imports too, with tests covering both nested-arrow const and function shadows.

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

描述

If a function declares a local that shadows a name the file imports from a project file, a call to that name from a nested arrow links to the import instead of the local. The same code importing from a package resolves correctly in every shape, thanks to #2855.

// lib.ts
export function skipString(j: number): number { return j + 1; }

// use.ts
import { skipString } from './lib';
export function scanA(s: string) {
  const skipString = (j: number): number => j + 2;
  return skipString(0);                                          // line 4
}
export function scanB(s: string) {
  function skipString(j: number): number { return j + 3; }
  return skipString(0);                                          // line 8
}
export function scanC(s: string) { return skipString(0); }       // line 10
export function scanD(s: string) {
  const skipString = (j: number): number => j + 2;
  const skipValue = (j: number): number => skipString(j);        // line 13
  return skipValue(0);
}
export function scanE(s: string) {
  function skipString(j: number): number { return j + 3; }
  const skipValue = (j: number): number => skipString(j);        // line 18
  return skipValue(0);
}
call from './lib' (project) from 'some-pkg' (package) expected
line 4 (scanA, own local) no edge local at line 3 local
line 8 (scanB, own local function) no edge local at line 7 local
line 10 (scanC, no shadow) lib.ts skipString none (package) the import
line 13 (nested arrow, const shadow) lib.ts skipString (resolvedBy: import) ✗ local at line 12 local
line 18 (nested arrow, function shadow) lib.ts skipString (resolvedBy: import) ✗ local at line 17 local

The two marked rows are wrong edges. The two "no edge" rows for the project import are missing edges rather than wrong ones. The import resolver appears to check for a shadow only in the calling node's own scope, not in the functions around it, and only the package-import path (#2855) prefers the local.

Reproduced on main at 31ec9082 (6162d872 since then only touches the watcher), with CODEGRAPH_KERNEL=0. Linux/WSL2, Node 22.23.2.

In this repo. src/resolution/frameworks/react.ts has the same shape. readObjectValue declares const skipString (lines 392–396), and the nested skipValue arrow calls it at line 401. That call links to skipString in object-literal.ts, which react.ts imports. The same shape occurs again at line 441, against a second local skipString declared at line 432. I found these by checking every TS calls edge against the TypeScript checker.

Expected. Apply the same lexical shadow check to a name imported from a project file as to one imported from a package: the innermost binding in scope at the call wins, including bindings in enclosing functions.

Related: #2855, #1715.

主要语言
C
星标
73.2k
派生
4.7k
平均合并
3 小时 15 分钟
30 天内合并 PR
576

环境准备

这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。

从这里开始

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

colbymchenry/codegraph 的其他 Issue

查看 colbymchenry/codegraph 的全部 Issue

相似的 Issue

更多 C Issue

把新 issue 发到你的邮箱

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