Skip to content

feat(resolver): resolve this-dispatch inside Object.defineProperty accessor functions (JS)#1346

Merged
carlos-alm merged 9 commits into
mainfrom
feat/define-property-accessor-this-dispatch-1335
Jun 7, 2026
Merged

feat(resolver): resolve this-dispatch inside Object.defineProperty accessor functions (JS)#1346
carlos-alm merged 9 commits into
mainfrom
feat/define-property-accessor-this-dispatch-1335

Conversation

@carlos-alm

Copy link
Copy Markdown
Contributor

Summary

  • Extracts Object.defineProperty(obj, "bar", { get: getter }) patterns during AST walking, recording that getter has obj as its this receiver
  • In buildFileCallEdges (WASM path): when this.method() has no targets and the caller function is a defineProperty-registered accessor, resolves through the receiver object
  • In buildDefinePropertyPostPass (native path): post-pass that adds the same edges for the Rust engine
  • Wires definePropertyReceivers through the WASM worker protocol (SerializedExtractorOutput) so it survives the worker-thread boundary
  • Adds getter → baz test edge to the JS benchmark fixture via the define-property mode

Closes #1335

Test evidence

Resolution benchmark: define-property: 1/1 (100% recall)getter → baz now resolves via this.baz() with this === accessorTarget

All 171 benchmark tests pass.

…cessor functions (JS)

When a function is registered as a getter or setter via
Object.defineProperty(obj, "bar", { get: getter }), `this` inside that
function refers to the target object. This commit tracks that binding and
resolves this.method() calls against the registered object's type.

Closes #1335
@claude

claude Bot commented Jun 6, 2026

Copy link
Copy Markdown

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


PR Review: feat(resolver): resolve this-dispatch inside Object.defineProperty accessor functions (JS)

  • Read all changed files
  • Phase 1: Root cause analysis
  • Phase 2: Configuration change detection
  • Phase 3: Test integrity
  • Phase 4: Code quality
  • Phase 5: Backlog compliance
  • Final assessment

Root Cause Analysis

Problem Being Solved: When a function is registered as a get/set accessor via Object.defineProperty(obj, "bar", { get: getter }), this inside getter refers to obj. The resolver previously had no way to know this, so this.baz() inside getter produced an unresolved call edge. Issue #1335 was a genuine false-negative in the graph.

Why This Approach: The approach is correct and consistent with existing patterns — it mirrors buildParamFlowPtsPostPass and buildFnRefBindingsPtsPostPass by adding a new JS post-pass for the native engine and inlining the fallback inside buildFileCallEdges for the WASM/JS engine. The two-pass design (extractor records the binding, edge builder acts on it) is well-established in this codebase.

Risk Assessment: Low. The feature is additive; the new definePropertyReceivers map is only populated when the relevant AST patterns appear, and all paths have early-exit guards when the map is empty or absent.


Phase 2: Configuration Change Detection

No configuration, linting, TypeScript, or test threshold changes. ✓


Phase 3: Test Integrity

The test fixture and expected-edges are correctly updated — a new fixture block is added to define-property.js (lines 34–47) alongside the existing define-property test cases, and one new getter → baz edge is added to expected-edges.json with mode: "define-property". Test assertion count goes up, not down. No assertions weakened. ✓

The benchmark test file adds 'define-property' to the mode map (resolution-benchmark.test.ts) — additive only.


Phase 4: Code Quality

src/extractors/javascript.tsextractDefinePropertyReceiversWalk (javascript.ts:1420):

The function is clean, but there is one subtle concern: the inner walk is defined as a closure that captures out and calls itself recursively, but passes node.child(i)! with a non-null assertion at line 1473 without checking for null. TreeSitterNode.child(index) can return null — the loop guard only checks childCount, not that the child is non-null. This is a latent crash if the grammar emits a null child for a non-null index (rare but possible with some grammars).

// line 1473-1475
for (let i = 0; i < node.childCount; i++) {
  walk(node.child(i)!, depth + 1);  // ← ! on potentially null child
}

Existing walks throughout javascript.ts handle this correctly with null checks — e.g., the argChildren loop at line 1441 explicitly guards if (!c) continue. The same guard is absent in the outer walk loop.

build-edges.tsbuildDefinePropertyPostPass (build-edges.ts:721):

The lookup strategy at lines 778–784 tries a typeMap lookup first, then falls back to same-file name lookup. The same-file fallback (line 782–784) is quite broad: it returns any definition named call.name in the current file, regardless of whether it belongs to the receiver object. For files that happen to define a function with the same name as the accessor method, this produces a false-positive edge.

The WASM path in buildFileCallEdges (lines 1140–1149) has the identical fallback. This is a design choice consistent across both paths, but worth calling out explicitly.

build-edges.ts — technique tag (line 792):

The post-pass uses 'ts-native' as the technique tag for edges resolved through buildDefinePropertyPostPass. The other post-passes (buildParamFlowPtsPostPass, buildFnRefBindingsPtsPostPass) use 'points-to'. A new tag like 'define-property' or 'accessor-this' would make the resolution path traceable in debugging — though this is minor since the edges still show up correctly.

wasm-worker-pool.ts — deserialization (wasm-worker-pool.ts:111–115):

The guard if (ser.definePropertyReceivers?.length) is correct (array of tuples from the worker). ✓

wasm-worker-entry.ts — serialization (wasm-worker-entry.ts:807–809):

...(symbols.definePropertyReceivers?.size
  ? { definePropertyReceivers: Array.from(symbols.definePropertyReceivers.entries()) }
  : {}),

Correct — conditionally includes the tuple array only when non-empty. ✓

types.tsExtractorOutput.definePropertyReceivers (lines 604–613):

Well-documented JSDoc comment, consistent with other optional fields. ✓

wasm-worker-protocol.tsSerializedExtractorOutput (line 68):

Correct tuple-array wire format, consistent with other Maps (e.g. typeMap). ✓


Phase 5: Backlog Compliance

  • Zero-dep: ✓ — no new npm runtime dependencies
  • Foundation-aligned: ✓ — pure local AST analysis, no cloud, no file writes, purely observational
  • Problem-fit: 4/5 — directly reduces false-negative call edges for a real JS pattern, improving graph accuracy for AI agent navigation. this-dispatch resolution inside defineProperty accessors is a valid real-world pattern (used by some polyfill libraries and legacy codebases).
  • Breaking: No — purely additive. New optional field on ExtractorOutput/SerializedExtractorOutput, no API changes, no CLI output changes.
  • Tier: 1 (zero-dep ✓, foundation-aligned ✓)

Critical Concerns

  1. Non-null assertion on node.child(i) (javascript.ts:1473): The recursive walk body calls walk(node.child(i)!, depth + 1) without a null guard. All other walk loops in this file use const c = argsNode.child(i); if (!c) continue;. Should be:

    for (let i = 0; i < node.childCount; i++) {
      const child = node.child(i);
      if (child) walk(child, depth + 1);
    }
  2. Broad same-file fallback (build-edges.ts:1143–1148 and build-edges.ts:782–784): The fallback lookup.byNameAndFile(call.name, relPath) can match any same-file function that happens to share the name of the called method. If this produces noise, it would be worth filing an issue to track this — it's consistent with the existing WASM path design, but the native post-pass inherits the same characteristic. Given the test passes cleanly, this is not a blocker.

  3. Technique tag (build-edges.ts:792): Using 'ts-native' for buildDefinePropertyPostPass-resolved edges makes them indistinguishable from direct native edges in debug tooling. Minor, but tracking this under a distinct tag (e.g. 'define-property') would aid debugging. Not a blocker.


Final Recommendation

  • Rating: ⭐⭐⭐⭐ (4/5)
  • Action: APPROVE WITH CONDITIONS
  • Reasoning: The approach is correct and consistent with established patterns. All 171 benchmark tests pass and the new edge resolves a real false-negative. The single non-null assertion concern (item 1 above) is a pre-existing style inconsistency that should be fixed before merge — it's a one-line change. Items 2 and 3 are minor and could be tracked as separate issues rather than blocking this PR.

· Branch: feat/define-property-accessor-this-dispatch-1335

@greptile-apps

greptile-apps Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

Adds Object.defineProperty accessor this-dispatch resolution for JavaScript: when a function is registered as a getter/setter via Object.defineProperty(obj, \"bar\", { get: getter }), this.X() calls inside getter now resolve against obj's type rather than being dropped. The feature covers both the WASM path (inlined into buildFileCallEdges) and the native Rust path (new buildDefinePropertyPostPass post-pass), with the definePropertyReceivers map correctly threaded through the WASM worker serialization boundary.

  • New extractDefinePropertyReceiversWalk AST walker records funcName → receiverVarName bindings from Object.defineProperty calls; the map is conditionally included in ExtractorOutput and serialized as a [string, string][] tuple array through the worker protocol.
  • Both resolution paths share the same two-step strategy: try typeName.methodName via the typeMap first, then fall back to lookup.byNameAndFile(call.name, relPath) (intentionally broad, matching the existing same-class fallback pattern).
  • Benchmark fixture gains a getter → baz edge under the new define-property mode, all 171 benchmark tests pass at 100% precision and ≥90% JS recall.

Confidence Score: 5/5

Safe to merge — the change is additive, both resolution paths are gated on targets.length === 0 so they cannot override correctly-resolved edges, and the 1.0 JS precision floor in CI will catch any spurious edge introduced by the broad same-file fallback.

The WASM and native post-pass paths mirror each other correctly, serialization through the worker boundary is consistent with the existing returnTypeMap pattern, and the benchmark adds a concrete fixture that exercises the new code path under a 100% precision gate.

No files require special attention.

Important Files Changed

Filename Overview
src/extractors/javascript.ts Adds extractDefinePropertyReceiversWalk: correctly filters punctuation from arguments children, guards with BUILTIN_GLOBALS, and conditionally omits the map when empty. Known last-write-wins limitation for shared accessors is acknowledged via inline comment.
src/domain/graph/builder/stages/build-edges.ts Adds buildDefinePropertyPostPass (native path) and inlines the equivalent fallback in buildFileCallEdges (WASM path). Both paths correctly seed seenByPair/seenCallEdges before emitting, use resolveCallTargets as a guard against duplicating edges the engine already found, and share the same two-step type-then-file-fallback lookup strategy.
src/domain/wasm-worker-protocol.ts Adds definePropertyReceivers?: Array<[string, string]> to SerializedExtractorOutput; type matches serialization in wasm-worker-entry.ts and deserialization in wasm-worker-pool.ts.
src/domain/wasm-worker-entry.ts Serializes definePropertyReceivers via Array.from(map.entries()) with the standard conditional-omit pattern, consistent with how returnTypeMap and other maps are handled.
src/domain/wasm-worker-pool.ts Deserializes the tuple array back into Map<string, string> using the same pattern as returnTypeMap; guarded by .length check.
src/types.ts Adds definePropertyReceivers?: Map<string, string> to ExtractorOutput with a clear JSDoc example; optional field with no breaking change to existing consumers.
tests/benchmarks/resolution/fixtures/javascript/define-property.js Adds a minimal, self-contained fixture: getter registered on accessorTarget via Object.defineProperty, with this.baz() resolving to baz. Covers the happy path cleanly.
tests/benchmarks/resolution/fixtures/javascript/expected-edges.json Adds the getter → baz expected edge under "mode": "define-property", consistent with the TECHNIQUE_MAP entry mapping it to ts-native.
tests/benchmarks/resolution/resolution-benchmark.test.ts Adds 'define-property': 'ts-native' to TECHNIQUE_MAP and updates the JS total-expected comment to 34; threshold remains at { precision: 1.0, recall: 0.9 }.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A["AST Walk\nextractDefinePropertyReceiversWalk"] -->|"funcName → receiverVar\nMap<string,string>"| B["ExtractorOutput\n.definePropertyReceivers"]

    B -->|WASM path| C["serializeExtractorOutput\nMap → Array<[string,string]>"]
    C --> D["SerializedExtractorOutput\nwasm-worker-protocol"]
    D --> E["deserializeResult\nArray → Map<string,string>"]
    E --> F["buildFileCallEdges\nWASM path inline fallback"]

    B -->|Native path| G["buildDefinePropertyPostPass\nJS post-pass"]

    F -->|"this.X() with no prior target"| H{"typeMap has\nreceiverVar type?"}
    G -->|"this.X() with no prior target"| H

    H -->|Yes| I["lookup.byNameAndFile\ntypeName.methodName"]
    H -->|No| J["lookup.byNameAndFile\ncall.name same-file fallback"]
    I -->|found| K["Emit edge\ncaller → target"]
    I -->|not found| J
    J --> K
Loading

Reviews (9): Last reviewed commit: "Merge remote-tracking branch 'origin/mai..." | Re-trigger Greptile

Comment on lines +1133 to +1148
if (typeName) {
const qualifiedName = `${typeName}.${call.name}`;
const qualified = lookup.byNameAndFile(qualifiedName, relPath).filter(() => true);
if (qualified.length > 0) {
targets = qualified;
}
}
// If still no targets, search for any definition named `call.name` in
// the same file — handles plain object literals where the method isn't
// qualified (e.g. `const obj = { baz() {} }` defines `baz` directly).
if (targets.length === 0) {
const sameFile = lookup.byNameAndFile(call.name, relPath).filter(() => true);
if (sameFile.length > 0) {
targets = sameFile;
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 .filter(() => true) is a no-op — it always returns every element unchanged. It was likely copy-pasted from the same-class fallback above which uses .filter((n) => n.kind === 'method'). Leaving these in place makes the code misleading and could confuse a future reader into thinking an intentional filter criterion was meant to be here.

Suggested change
if (typeName) {
const qualifiedName = `${typeName}.${call.name}`;
const qualified = lookup.byNameAndFile(qualifiedName, relPath).filter(() => true);
if (qualified.length > 0) {
targets = qualified;
}
}
// If still no targets, search for any definition named `call.name` in
// the same file — handles plain object literals where the method isn't
// qualified (e.g. `const obj = { baz() {} }` defines `baz` directly).
if (targets.length === 0) {
const sameFile = lookup.byNameAndFile(call.name, relPath).filter(() => true);
if (sameFile.length > 0) {
targets = sameFile;
}
}
if (typeName) {
const qualifiedName = `${typeName}.${call.name}`;
const qualified = lookup.byNameAndFile(qualifiedName, relPath);
if (qualified.length > 0) {
targets = qualified;
}
}
// If still no targets, search for any definition named `call.name` in
// the same file — handles plain object literals where the method isn't
// qualified (e.g. `const obj = { baz() {} }` defines `baz` directly).
if (targets.length === 0) {
const sameFile = lookup.byNameAndFile(call.name, relPath);
if (sameFile.length > 0) {
targets = sameFile;
}
}

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Fix in Claude Code

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed — removed both .filter(() => true) no-ops from the defineProperty WASM path in buildFileCallEdges. The qualified-name lookup and same-file fallback now call lookup.byNameAndFile() directly without filtering.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed — but used spread syntax ([...qualified] and [...sameFile]) rather than direct assignment. The original no-op .filter() was inadvertently serving as a ReadonlyArray-to-mutable-Array conversion: .filter() on a ReadonlyArray returns a new mutable Array. Removing it caused TS4104 errors at both lines (ReadonlyArray cannot be assigned to the mutable targets). Spreading into a new array is the clean fix.

val?.type === 'identifier' &&
!BUILTIN_GLOBALS.has(val.text)
) {
out.set(val.text, targetName);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Last-write-wins for duplicate accessor names

out.set(val.text, targetName) silently overwrites a previous entry if the same function is passed as an accessor to multiple Object.defineProperty calls (e.g. Object.defineProperty(obj1, 'a', { get: getter }) followed by Object.defineProperty(obj2, 'b', { get: getter })). Only the last binding is remembered, so this-calls inside getter would be resolved against the wrong object for the earlier registration. This is an unusual pattern, but given no warning is emitted or comment acknowledging the limitation, it may produce silently wrong edges in production codebases.

Fix in Claude Code

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Acknowledged with a comment. A proper fix (allowing multiple receiver bindings per accessor function) would require changing Map<string, string> to Map<string, string[]> and updating all consumers. Since this is an unusual pattern (sharing one function across multiple Object.defineProperty calls), the trade-off isn't worth it for this PR. Added an inline comment documenting the limitation so future readers are aware.

Comment on lines +781 to +784
// Same-file fallback for plain object-literal methods
if (targets.length === 0) {
targets = lookup.byNameAndFile(call.name, relPath);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Overly broad same-file fallback may introduce false-positive edges

When the typeMap holds no type annotation for the receiver variable, both the WASM path (buildFileCallEdges) and the native post-pass (buildDefinePropertyPostPass) fall back to lookup.byNameAndFile(call.name, relPath), which returns every definition named call.name in the file — not just members of the receiver object. In a file that has a top-level function sharing a name with a method on the accessor target, both would be emitted as call targets. The test fixture avoids this collision, but the JavaScript benchmark precision floor is held at 1.0, so any future fixture that triggers this path would immediately break CI.

Fix in Claude Code

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is an intentional design decision consistent with the existing WASM path. Added a comment to buildFileCallEdges explicitly documenting that the same-file fallback is intentionally broad and mirrors the buildDefinePropertyPostPass behaviour. The JS benchmark precision floor at 1.0 will catch any future fixture regression caused by name collisions.

@github-actions

github-actions Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

Codegraph Impact Analysis

13 functions changed20 callers affected across 8 files

  • buildDefinePropertyPostPass in src/domain/graph/builder/stages/build-edges.ts:721 (3 transitive callers)
  • buildFileCallEdges in src/domain/graph/builder/stages/build-edges.ts:1050 (3 transitive callers)
  • buildEdges in src/domain/graph/builder/stages/build-edges.ts:1526 (4 transitive callers)
  • serializeExtractorOutput in src/domain/wasm-worker-entry.ts:790 (2 transitive callers)
  • deserializeResult in src/domain/wasm-worker-pool.ts:89 (1 transitive callers)
  • SerializedExtractorOutput.definePropertyReceivers in src/domain/wasm-worker-protocol.ts:70 (0 transitive callers)
  • extractSymbolsQuery in src/extractors/javascript.ts:316 (1 transitive callers)
  • extractSymbolsWalk in src/extractors/javascript.ts:604 (1 transitive callers)
  • extractDefinePropertyReceiversWalk in src/extractors/javascript.ts:1433 (3 transitive callers)
  • walk in src/extractors/javascript.ts:1437 (14 transitive callers)
  • ExtractorOutput.definePropertyReceivers in src/types.ts:613 (0 transitive callers)
  • baz in tests/benchmarks/resolution/fixtures/javascript/define-property.js:37 (1 transitive callers)
  • getter in tests/benchmarks/resolution/fixtures/javascript/define-property.js:43 (0 transitive callers)

@carlos-alm

Copy link
Copy Markdown
Contributor Author

Addressed all three items from the review:

  1. Non-null assertion on node.child(i) — Fixed. The walk loop in extractDefinePropertyReceiversWalk now guards with const child = node.child(i); if (child) walk(child, depth + 1);, consistent with all other walk loops in the file.

  2. Broad same-file fallback — Documented with an inline comment explaining the intentional design. Both paths (WASM and native post-pass) use the same broad fallback, and the JS precision floor at 1.0 will catch any regression if this produces false positives in future fixtures.

  3. Technique tag 'ts-native' for post-pass edges — Left as-is. The benchmark's TECHNIQUE_MAP explicitly maps 'define-property' mode to 'ts-native', so using a different tag would misalign with the benchmark expectations. Changing to a distinct tag would require coordinated benchmark updates and is out of scope for this PR.

@carlos-alm

Copy link
Copy Markdown
Contributor Author

@greptileai

@carlos-alm

Copy link
Copy Markdown
Contributor Author

@claude

@claude

claude Bot commented Jun 6, 2026

Copy link
Copy Markdown

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


Follow-up Review: Addressing Previous Feedback

  • Read changed files to verify fixes
  • Verify null guard fix in extractDefinePropertyReceiversWalk
  • Verify no-op .filter(() => true) removal
  • Verify last-write-wins comment
  • Verify same-file fallback comment
  • Final assessment

All three items from the previous review are addressed in commit cb58c4c. Here's the verification:

Item 1 — Null guard (javascript.ts:1479–1481): ✅ Fixed correctly.

for (let i = 0; i < node.childCount; i++) {
  const child = node.child(i);
  if (child) walk(child, depth + 1);
}

Matches the pattern used throughout the rest of the file.

Item 2 — No-op .filter(() => true) removed (build-edges.ts:1133–1151): ✅ Fixed correctly. The WASM path now directly calls lookup.byNameAndFile() without the spurious filter. The qualified-name lookup and same-file fallback are clean.

Item 3a — Last-write-wins comment (javascript.ts:1464–1469): ✅ Documented with a clear inline comment explaining the limitation and why a proper fix is out of scope for this PR. Acceptable for now.

Item 3b — Same-file fallback breadth comment (build-edges.ts:1140–1145): ✅ Documented with a comment that explains the intentional broad match and cross-references buildDefinePropertyPostPass. The comment also appears in the native post-pass path implicitly (the fallback at build-edges.ts:781–783 is identical).


Rating: ⭐⭐⭐⭐½ (4.5/5) — All critical items resolved. The one remaining minor item (technique tag 'ts-native' vs a dedicated tag) was correctly left as-is given the benchmark's TECHNIQUE_MAP dependency. No remaining blockers.

Recommendation: APPROVE — the code is clean, the fixes are correct, all 171 benchmark tests pass, and the review feedback was handled appropriately.


· Branch: feat/define-property-accessor-this-dispatch-1335

…y fallback (#1346)

Assigning lookup.byNameAndFile() result (ReadonlyArray) directly to the
mutable targets variable caused TS4104 type errors after the no-op .filter()
was removed. Spread into new arrays with [...qualified] and [...sameFile].
@carlos-alm

Copy link
Copy Markdown
Contributor Author

Fixed TypeScript type error introduced by removing the no-op .filter() calls:

  • The .filter(() => true) calls on ReadonlyArray results from lookup.byNameAndFile() were inadvertently acting as ReadonlyArray-to-mutable-Array converters (.filter() on a ReadonlyArray returns a new mutable Array). Removing them per Greptile's suggestion caused TS4104 errors at build-edges.ts:1137 and 1149.
  • Fix: replaced with spread syntax ([...qualified] and [...sameFile]) to explicitly create new mutable arrays.
  • Also merged origin/main (3 commits: generator extraction, Java bench, this-dispatch class-scope fix).

@carlos-alm

Copy link
Copy Markdown
Contributor Author

@greptileai

@carlos-alm

Copy link
Copy Markdown
Contributor Author

Fixed the edge count comment — updated the JS expected-edge count from 33 to 34 to account for the new getter → baz edge added by this PR (Phase 8.3g). The comment now reads: 'Phase 8.3g adds Object.defineProperty accessor this-dispatch (1 new edge in define-property.js), total expected now 34.'

@carlos-alm

Copy link
Copy Markdown
Contributor Author

@greptileai

@carlos-alm

Copy link
Copy Markdown
Contributor Author

Merged origin/main (docs/roadmap update from #1338) to bring the branch fully up to date. CI re-triggered.

Note on the duplicate: PR #1351 (feat/defineProperty-accessor-this-dispatch-1335) is a successor with additional fixes for object literal scope guards, Rust native extractor improvements, and jelly-micro fixture coverage. Both PRs target the same feature but #1351 has a broader implementation. The original functionality in this PR (#1346) is correct and all review concerns are addressed.

@carlos-alm carlos-alm merged commit 81ef6fa into main Jun 7, 2026
22 checks passed
@carlos-alm carlos-alm deleted the feat/define-property-accessor-this-dispatch-1335 branch June 7, 2026 00:23
@github-actions github-actions Bot locked and limited conversation to collaborators Jun 7, 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.

feat(resolver): resolve this-dispatch inside Object.defineProperty accessor functions (JS)

1 participant