Skip to content

test(bench): add JS fixture for bare-call class-scoped lookup regression guard#1422

Merged
carlos-alm merged 9 commits into
mainfrom
test/class-scope-bare-call-1407
Jun 10, 2026
Merged

test(bench): add JS fixture for bare-call class-scoped lookup regression guard#1422
carlos-alm merged 9 commits into
mainfrom
test/class-scope-bare-call-1407

Conversation

@carlos-alm

@carlos-alm carlos-alm commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Adds class-scope.js fixture to the JS resolution benchmark
  • Adds Processor.run → processData to expected-edges.json as the positive recall case
  • Updates the expected-edge count comment in the benchmark test (35 → 42 after multi-class.js +4, feat(resolver): resolve .call()/.apply() this-rebinding and add fun fixture (JS) #1405 +2, this fixture +1)
  • Gates the same-class fallback in resolveByMethodOrGlobal on language (JS/TS bare calls no longer fall through to class-method lookup)

What this guards

In JS/TS, a bare foo() call inside a class method is lexically scoped to the module, not the class — there is no implicit this binding. If the call.receiver guard in resolveByMethodOrGlobal (call-resolver.ts:229) were ever removed, the resolver would incorrectly emit Processor.run → Processor.flush (a false positive).

The fixture:

export function processData(x) { return x * 2; }

export class Processor {
  run(x) {
    processData(x); // same-file module-level — resolves correctly
    flush();        // bare call; no module-level 'flush' — must NOT → Processor.flush
  }
  flush() {}
}

The 1.0 precision floor on the JS fixture acts as the enforcement mechanism: any regression producing Processor.run → Processor.flush fails CI immediately.

Test plan

  • npx vitest run -t "javascript" tests/benchmarks/resolution/resolution-benchmark.test.ts — JS precision 100%, recall 100% (42/42 edges), all 10 tests pass

Closes #1407

…ion guard (#1407)

Adds class-scope.js to the JS resolution benchmark. The fixture contains
a class with a bare flush() call inside run() and a Processor.flush method
that must NOT be the target of that call — JS bare calls are lexically
scoped to the module, never the class.

The 1.0 precision floor for the JS fixture acts as the enforcement
mechanism: if the call.receiver guard in resolveByMethodOrGlobal is ever
removed, the resolver would emit Processor.run → Processor.flush as a
false positive, immediately failing CI.

Closes #1407
@claude

claude Bot commented Jun 8, 2026

Copy link
Copy Markdown

Claude finished @carlos-alm's task —— View job


PR Review

  • Read changed files
  • Analyze fixture and expected edges
  • Check test modifications
  • Apply review phases
  • Post final review

Root Cause Analysis

Problem Being Solved: Guards against a future regression where the call.receiver guard in resolveByMethodOrGlobal (call-resolver.ts:198) is removed, which would cause bare function calls inside class methods (e.g., flush() in Processor.run) to incorrectly resolve to same-named class methods (Processor.flush). The fixture encodes the precise JS scoping rule: bare calls are module-scoped, not class-scoped.

Why This Approach: A precision-1.0 floor on the JS fixture acts as an automated regression wire. Any future resolver change that emits Processor.run → Processor.flush would produce a false positive, immediately failing the precision meets threshold CI gate. This is the correct mechanism — encoding the constraint as a benchmark expectation rather than a code comment or unit test that could be accidentally bypassed.

Risk Assessment: Low. Pure test additions with no production code changes. The fixture is minimal and unambiguous.


Phase 1: Root Cause Analysis ✓

The PR addresses a real, specific regression risk rather than hiding a symptom. The guard is justified by the JS language spec (no implicit this on bare calls), and the enforcement mechanism (precision floor) is already wired into CI.

Phase 2: Configuration Change Detection ✓

No configuration changes. No linting rules relaxed. No thresholds lowered — the JS precision threshold remains 1.0 and recall remains 0.9. The test file modification only updates a comment explaining the edge count history (35 → 40), and adds the same-file mode to TECHNIQUE_MAP already handled at line 79 of resolution-benchmark.test.ts. No relaxations.

Phase 3: Test Integrity ✓

No assertions weakened. The benchmark test file change at resolution-benchmark.test.ts:129 is a comment update documenting the evolving expected-edge count — this is accurate bookkeeping. The defineProperty-accessor mode added to the TECHNIQUE_MAP in the diff is actually a new 'defineProperty-accessor': 'ts-native' entry, which correctly categorizes the new expected edge mode.

One observation: The notes field in expected-edges.json:284 doubles as a regression assertion explanation in plain text, which is excellent for future reviewers. However, the note says "must NOT resolve to Processor.flush (class-scoped lookup must be receiver-gated)" — this is accurate and helpful, not documentation of a bug as expected behavior.

Phase 4: Code Quality ✓

class-scope.js (tests/benchmarks/resolution/fixtures/javascript/class-scope.js):

  • The fixture is clear and minimal. Lines 16–17 have inline comments that precisely describe the expected semantics — appropriate for a regression fixture.
  • The inline comments (// same-file module-level function — resolves correctly, // bare call; no module-level 'flush' in scope) are test fixture documentation, not CLAUDE.md-prohibited comments on production code.
  • The header block comment (lines 1–8) in the fixture is well-justified: it directly explains what property is being guarded and where the guard lives, reducing the cost of future debugging.

expected-edges.json (line 280–285):

  • The single added edge Processor.run → processData with mode: "same-file" is correct. processData is a module-level export in the same file, and the call is a bare call without a receiver, so same-file resolution is the right mode.
  • Notably, Processor.run → flush() is correctly absent from expected-edges — this is the whole point of the fixture. The precision floor ensures that if the resolver ever adds this spurious edge, it fails CI.

resolution-benchmark.test.ts (lines 122–129):

  • The comment update accurately reflects the cumulative edge count history. This is good bookkeeping but could get stale as more fixtures are added. Acceptable given the existing pattern.
  • No assertion changes; the THRESHOLDS object is unchanged.

Minor nit: The notes field on the added edge (line 284) is slightly long and mixes two concerns — the positive case description and the negative regression description. This is fine, but future fixture entries may want to separate positive and negative expectations more clearly.

Phase 5: Backlog Compliance

  • Zero-dep: ✓ — No new runtime or dev dependencies. Pure JS fixture file + JSON manifest update.
  • Foundation-aligned: ✓ — No cloud calls, no Docker, no code generation. Purely improves the correctness guarantee of the local resolution engine.
  • Problem-fit: 4 — Directly prevents a hallucinated dependency edge (Processor.run → Processor.flush) that would mislead AI agents about call graphs. False positive edges in codegraph are precisely the "hallucinated dependencies" problem the tool exists to prevent.
  • Breaking: No — Purely additive test fixture. No CLI, API, DB schema, or MCP contract changes.
  • Tier: 1 (zero-dep ✓ + foundation-aligned ✓)

Final Recommendation

  • Rating: ⭐⭐⭐⭐ (4/5)
  • Action: APPROVE
  • Reasoning: This is a well-targeted regression guard. The fixture correctly encodes the JS bare-call scoping rule, the enforcement mechanism (precision-1.0 floor on JS) is already in place and works, and no thresholds are relaxed. The test plan (100% precision + recall on the JS fixture) is the right verification. The -1 from 5/5 is that the fixture doesn't include a negative test that explicitly verifies the Processor.run → Processor.flush edge is absent from resolved edges — it relies indirectly on the precision floor. This is acceptable given the existing benchmark structure, but a future improvement could add an explicit forbidden-edges array to the manifest schema for stronger negative assertions.

@greptile-apps

greptile-apps Bot commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds a regression guard for the JS/TS bare-call class-scoped lookup bug (#1407): a new class-scope.js fixture, its expected edge, and a language-gated guard in resolveByMethodOrGlobal that prevents bare foo() calls inside JS/TS class methods from falling through to the same-class method lookup.

  • call-resolver.ts: introduces MODULE_SCOPED_BARE_CALL_EXTENSIONS and isModuleScopedLanguage(); the same-class fallback is now skipped for bare (no-receiver) calls in JS/TS files, while this.method(), self.method(), and non-JS/TS languages are unaffected. A computeConfidence >= 0.5 filter is also applied to the direct qualified method lookup path.
  • Fixture + test: class-scope.js deliberately exposes Processor.flush as a class method with no module-level counterpart; the single expected edge (Processor.run → processData) combined with the precision: 1.0 floor enforces the guard in CI.
  • src/extractors/csharp.ts / csharp.rs: cosmetic-only — reorders handleCSharpVarDecl after its callee and adds explanatory comments; no logic changes.

Confidence Score: 5/5

Safe to merge — the change is a targeted, well-tested guard on the bare-call resolution path with no impact on existing C#/Java class-method dispatch or JS/TS this-receiver calls.

The logic change in call-resolver.ts is minimal and precisely scoped: it adds one boolean check (isBareCall && isModuleScopedLanguage) before the same-class fallback. The new unit tests cover all four critical cases (bare .ts, bare .js, this-receiver .ts, bare .cs), and the benchmark fixture enforces the guard at precision 1.0 in CI. No existing resolution paths are altered; the C# extractor changes are documentation-only.

No files require special attention.

Important Files Changed

Filename Overview
src/domain/graph/builder/call-resolver.ts Adds MODULE_SCOPED_BARE_CALL_EXTENSIONS set + isModuleScopedLanguage helper; gates the same-class method fallback on language to prevent false-positive edges from bare JS/TS calls; adds confidence filter to the direct qualified method lookup
tests/unit/call-resolver.test.ts Adds three new describe blocks: static-receiver confidence filter (#1398) with near/far target tests, and bare-call JS/TS module-scope guard (#1407) covering .ts, .js, this-receiver, and C# counterexample — thorough and well-structured
tests/benchmarks/resolution/fixtures/javascript/class-scope.js New regression-guard fixture exposing processData (module-level, expected to resolve) and Processor.flush (class method, must NOT resolve from bare flush() call); correctly scoped as a precision enforcement device
tests/benchmarks/resolution/fixtures/javascript/expected-edges.json Adds exactly one new edge (Processor.run → processData, same-file mode); the intentional absence of a Processor.run → Processor.flush edge is the precision enforcement mechanism
tests/benchmarks/resolution/resolution-benchmark.test.ts Updates the edge-count history comment (35→42) inserting previously undocumented multi-class.js +4 (#1382) and this fixture +1 (#1407); thresholds themselves are unchanged
src/extractors/csharp.ts Reorders handleCSharpVarDecl to appear after extractVarInitType (its callee) and adds explanatory comments; no logic changes
crates/codegraph-core/src/extractors/csharp.rs Adds doc comment to extract_var_init_type and an inline comment explaining the belt-and-suspenders object_creation_expression guard; documentation only

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A["resolveByMethodOrGlobal(call, relPath)"] --> B{Has explicit receiver?}
    B -- "receiver is class/type name" --> C[Direct qualified lookup\nClassName.method\n+ confidence >= 0.5]
    C --> D{Found?}
    D -- Yes --> E[Return targets]
    D -- No --> F[typeMap / protoMap lookups]
    B -- "no receiver / this / self / super" --> G[Exact name lookup\nlookup.byName call.name]
    G --> H{Exact match found?}
    H -- Yes --> E
    H -- No --> I{isBareCall &&\nisModuleScopedLanguage?}
    I -- "Yes (JS/TS bare call)" --> J[Skip same-class fallback\nReturn empty]
    I -- "No (this/self/super\nor non-JS/TS)" --> K[Same-class fallback\nCallerClass.method\n+ confidence >= 0.5]
    K --> L{Found?}
    L -- Yes --> E
    L -- No --> J
Loading

Reviews (10): Last reviewed commit: "fix(csharp): remove duplicate extract_va..." | Re-trigger Greptile

@github-actions

github-actions Bot commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

Codegraph Impact Analysis

9 functions changed22 callers affected across 8 files

  • extract_var_init_type in crates/codegraph-core/src/extractors/csharp.rs:442 (1 transitive callers)
  • isModuleScopedLanguage in src/domain/graph/builder/call-resolver.ts:43 (11 transitive callers)
  • resolveByMethodOrGlobal in src/domain/graph/builder/call-resolver.ts:84 (15 transitive callers)
  • extractVarInitType in src/extractors/csharp.ts:333 (3 transitive callers)
  • handleCSharpVarDecl in src/extractors/csharp.ts:357 (3 transitive callers)
  • processData in tests/benchmarks/resolution/fixtures/javascript/class-scope.js:10 (1 transitive callers)
  • Processor in tests/benchmarks/resolution/fixtures/javascript/class-scope.js:14 (0 transitive callers)
  • Processor.run in tests/benchmarks/resolution/fixtures/javascript/class-scope.js:15 (0 transitive callers)
  • Processor.flush in tests/benchmarks/resolution/fixtures/javascript/class-scope.js:20 (0 transitive callers)

…alizers in C#

Both the WASM and native C# extractors were skipping variable declarations
with `var`/`implicit_type` type nodes entirely, so `var service = new
UserService(repo)` never added `service → UserService` to the typeMap.  The
call-edge resolver therefore could not resolve `service.AddUser()` or
`service.GetUser()` to the qualified methods on `UserService`.

The dist copy of the WASM extractor already had the fix (extractVarInitType),
but the source had drifted out of sync.  This commit re-introduces the logic
in both engines:

WASM (TypeScript): add `extractVarInitType(declarator)` that walks the
variable_declarator children looking for an `object_creation_expression` (or
one inside an `equals_value_clause`), then reads the `type` field via
`extractCSharpTypeName`.  `handleCSharpVarDecl` now sets `isVar` for
`implicit_type | var_keyword` and calls `extractVarInitType` in that branch.

Native (Rust): mirror the same logic in `extract_var_init_type` and update
`match_csharp_type_map` to drive it when the type node is `var_keyword` or
`implicit_type`.

Infrastructure: add CODEGRAPH_NATIVE_ADDON_PATH env-var override to
`loadNative()` for local development workflows where the published npm binary
can't be loaded (its dylib install-name points to the CI build path).  Tests
now pass with CODEGRAPH_NATIVE_ADDON_PATH set to the locally rebuilt binary.

Fixes: #1418 (build-parity test failure — native vs WASM C# edge/role
divergence on `var`-typed local variables instantiated with `new`).
@carlos-alm

Copy link
Copy Markdown
Contributor Author

@greptileai

@carlos-alm

Copy link
Copy Markdown
Contributor Author

Merged origin/main into this branch. Resolved two conflicts:

Note: Local test runs show the fixture is detecting real bugs in the resolver:

These bugs are masked in CI's pre-publish benchmark gate because it runs in artifact mode (pre-computed results). Once the fixtures are rebuilt locally or the artifact is regenerated, the precision gate will fail. The fixture PR is working as designed — it added the guard, and the guard found bugs.

@carlos-alm

Copy link
Copy Markdown
Contributor Author

@claude

@claude

claude Bot commented Jun 9, 2026

Copy link
Copy Markdown

Claude finished @carlos-alm's task —— View job


PR Review — Post-Merge Analysis

  • Acknowledge trigger
  • Read changed files
  • Analyze current state post-merge
  • Provide review feedback

Current State

After the merge of origin/main, this PR now contains two distinct concerns across 3 commits:

Commit Concern
1b98e7f JS bare-call fixture (original PR scope)
85ec995 C# var-init typeMap fix (parity fix for #1418)
f1f7de7 Merge conflict resolution (picked up a large batch of main changes)

Scope Issue: C# Extractor Changes Don't Belong Here

The files crates/codegraph-core/src/extractors/csharp.rs (+44/-15) and src/extractors/csharp.ts (+29/-7) are changes from commit 85ec995 fix(parity): infer var-declared local types from new-expression initializers in C#. This is a separate production fix unrelated to the stated PR purpose.

Per the repo's own guideline: One PR = one concern. The C# fix should be in its own PR. That said, if carlos-alm deliberately bundled this because it was blocking the class-scope fixture (it doesn't appear to be — the JS fixture is independent), then it should be explicitly noted.

The C# Fix Itself (commit 85ec995)

WASM (src/extractors/csharp.ts:329-369) — Adds extractVarInitType() that walks variable_declarator children for object_creation_expression to infer the type of var x = new Foo(). handleCSharpVarDecl now calls this for implicit_type | var_keyword nodes instead of early-returning.

Native (crates/codegraph-core/src/extractors/csharp.rs:452-499) — Mirrors the same logic in extract_var_init_type() and updates match_csharp_type_map to drive it.

The logic is correct and the parity between engines is maintained. Both engines now handle:

var service = new UserService(repo);
service.AddUser(...); // was unresolved; now resolves to UserService.AddUser

One concern: The commit message says "The dist copy of the WASM extractor already had the fix (extractVarInitType), but the source had drifted out of sync." If the built dist had this but the source didn't, that's a source/dist drift — verify the build was re-run after this commit to keep them in sync.

The JS Fixture (commit 1b98e7f) — Confirmed Correct

  • class-scope.js: minimal, unambiguous fixture. The fixture correctly represents the JS scoping rule (bare calls are module-scoped, not class-scoped). Inline comments are appropriate for a regression fixture.
  • expected-edges.json: only Processor.run → processData is listed; Processor.run → Processor.flush is correctly absent. The precision-1.0 floor is the enforcement mechanism.
  • resolution-benchmark.test.ts: comment-only update with accurate edge count history (35 → 39 → 41 → 42). No thresholds changed.

Known Live Bugs (noted by carlos-alm)

Two false positives found by the fixture during local testing — both correctly filed as issues:

  • #1425: Processor.run → Processor.flush false positive (bare-call same-class fallback not gated by language)
  • #1426: runCallThis → handler false positive from bind-call-apply resolution

These bugs are masked in CI (artifact mode). The comment notes these correctly: "the fixture is working as designed."

Recommendation

The JS fixture portion is ready to merge. The C# fix is correct but violates the one-PR-one-concern rule. Options:

  1. Merge as-is if the C# parity fix is considered a prerequisite or closely related fix that was stacked here intentionally
  2. Extract the C# fix to its own PR before merging (preferred per repo conventions)

If merging as-is, the PR title and description should be updated to reflect both changes.


View job

In JS/TS, bare foo() calls inside a class method are module-scoped — there
is no implicit class binding. The same-class fallback in
resolveByMethodOrGlobal was incorrectly emitting class-scoped edges for
bare calls with no module-level match (e.g. flush() inside Processor.run
resolving to Processor.flush).

Gate the fallback: skip for bare calls in JS/TS, keep for this.method()
calls and for C#/Java where bare calls are class-scoped. Closes #1425.
@carlos-alm

Copy link
Copy Markdown
Contributor Author

Resolver fix committed (290008d): gated the same-class fallback in resolveByMethodOrGlobal on language to prevent JS/TS bare-call false positives. Both #1425 (Processor.run → Processor.flush) and #1426 (runCallThis → handler) are now fixed. Both issues closed.

The class-scope.js fixture worked as designed — it found the exact regression it was intended to guard against.

@carlos-alm

Copy link
Copy Markdown
Contributor Author

@greptileai

@carlos-alm

Copy link
Copy Markdown
Contributor Author

@claude

@claude

claude Bot commented Jun 9, 2026

Copy link
Copy Markdown

Claude finished @carlos-alm's task —— View job


PR Review — Final Pass


Current State

This PR now includes three distinct changes across 4 commits:

Change Files Status
JS bare-call fixture (original scope) class-scope.js, expected-edges.json, resolution-benchmark.test.ts ✅ Correct
Resolver fix (#1425 + #1426) call-resolver.ts ✅ Correct
C# var-init type inference csharp.ts, csharp.rs ✅ Correct (scope concern remains)

Resolver Fix — call-resolver.ts:32-46, 228-229

The fix is clean and well-targeted. Key elements:

MODULE_SCOPED_BARE_CALL_EXTENSIONS (lines 32–41): An explicit allowlist of JS/TS extensions. This is the right approach — opting in languages that have module-scoped bare calls, rather than blocking all languages. The set covers all JS/TS variants (.js, .mjs, .cjs, .jsx, .ts, .tsx, .mts, .cts).

isModuleScopedLanguage (lines 43–46): Simple, correct extension extraction. No path-normalization edge cases since relPath.lastIndexOf('.') correctly handles dotfiles and multi-extension paths like foo.test.ts.

Guard at line 229: !(isBareCall && isModuleScopedLanguage(relPath)) — correctly gates only bare calls (no receiver) in module-scoped languages. this.method(), self.method(), and super.method() calls are unaffected since they have a receiver. The inline comment accurately describes the behavior.

#1426 coverage: The runCallThis → handler false positive from bind-call-apply resolution is referenced in the test comment history (line 129) as having been fixed in #1405. The current fix in 290008d specifically addresses #1425 (bare-call same-class) and #1426 was already closed from a prior fix.

One note on the comment at line 219: The comment says "Also covers no-receiver calls inside class methods, e.g. IsValidEmail(x) inside Validators.ValidateUser → try Validators.IsValidEmail (C#/Java static siblings)." This is now only partially true — C# still gets this behavior, but JS/TS bare calls no longer reach the same-class fallback. The comment could be more precise about which languages this applies to, but this is minor since the language-gating comment immediately below explains the exclusion.


JS Fixture — Confirmed Correct

  • class-scope.js: minimal, unambiguous. Header comment precisely identifies the guard contract and the resolver function line.
  • expected-edges.json:294–299: Processor.run → processData is the sole expected edge; Processor.run → Processor.flush is correctly absent. The notes field doubles as a regression assertion for human reviewers.
  • resolution-benchmark.test.ts:131: edge count history is accurate (35 → 39 → 41 → 42).

C# Extractor — csharp.ts:333–368 / csharp.rs:454–508

Correctness: Both extractVarInitType (TS) and extract_var_init_type (Rust) correctly handle two syntactic forms of var x = new Foo():

  1. Direct: variable_declaratorobject_creation_expression
  2. Wrapped: variable_declaratorequals_value_clauseobject_creation_expression

The implicit_type | var_keyword check in handleCSharpVarDecl:357 and the Rust match_csharp_type_map:481 are now aligned — this fixes a pre-existing discrepancy.

Target-typed new() (e.g., Foo x = new()): Both implementations gracefully return null when object_creation_expression has no type field, which is correct.

Engine parity: Both engines now handle the same cases at confidence 0.9. ✅

Scope concern: These changes are unrelated to the PR's stated purpose. Per repo conventions, they belong in a separate PR. However, they are correct and well-guarded, so this is a process concern rather than a correctness concern.


Summary

The PR is ready to merge. All three components are correct:

  1. The JS fixture correctly encodes the bare-call scoping rule.
  2. The resolver fix correctly gates same-class fallback on language via an explicit module-scoped extension set.
  3. The C# var-init inference is correct and maintains engine parity.

The only remaining process note is that the C# changes and the resolver fix are both out of the stated PR scope — ideally they'd be separate PRs per the repo's one-concern rule. Since both are additive and correct, this is a judgment call for the author.

@carlos-alm

Copy link
Copy Markdown
Contributor Author

Fixed PR description edge count discrepancy (40 → 42) and updated the resolver line reference (189 → 229). Also merged origin/main (commit 906a8b0).

@carlos-alm

Copy link
Copy Markdown
Contributor Author

@greptileai

The direct qualified-name fallback in resolveByMethodOrGlobal was the only
resolution path that did not apply computeConfidence >= 0.5, risking false
edges from distant files in polyglot projects with name collisions.

Closes #1398
@carlos-alm

Copy link
Copy Markdown
Contributor Author

Addressed Greptile's two review issues:

Issue 1 — Missing unit test for bare-call JS/TS guard: Added 4 new unit tests to tests/unit/call-resolver.test.ts in commit a3288058 covering: (a) bare call in .ts file does NOT resolve to same-class method, (b) bare call in .js file does NOT resolve to same-class method, (c) this.flush() in .ts DOES resolve (receiver present, not bare call), (d) bare call in .cs DOES resolve (C# is not module-scoped). All 10 unit tests pass.

Issue 2 — Redundant object_creation_expression check: Added a comment to both src/extractors/csharp.ts and crates/codegraph-core/src/extractors/csharp.rs explaining that the direct-child check is kept as a belt-and-suspenders fallback. The standard grammar wraps it in equals_value_clause, but removing the guard could break parsing on edge cases or future grammar versions. The comment makes the intent clear for future maintainers.

Merge conflicts with origin/main also resolved — the 3 new main commits (pts-param TECHNIQUE_MAP, per-fixture recall floors, inline-new receiver fix) are now merged in.

@carlos-alm

Copy link
Copy Markdown
Contributor Author

@greptileai

@carlos-alm carlos-alm merged commit 5a06fa2 into main Jun 10, 2026
28 checks passed
@carlos-alm carlos-alm deleted the test/class-scope-bare-call-1407 branch June 10, 2026 00:31
@github-actions github-actions Bot locked and limited conversation to collaborators Jun 10, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

test(resolver): add JS fixture for bare-call class-scoped lookup to prevent false-positive regression

1 participant