Skip to content

fix(formatter): treat PrivateFieldExpression as simple call argument#19348

Merged
graphite-app[bot] merged 1 commit intomainfrom
02-13-fix_formatter_private_field_simple_argument_19330
Feb 13, 2026
Merged

fix(formatter): treat PrivateFieldExpression as simple call argument#19348
graphite-app[bot] merged 1 commit intomainfrom
02-13-fix_formatter_private_field_simple_argument_19330

Conversation

@Dunqing
Copy link
Member

@Dunqing Dunqing commented Feb 13, 2026

Summary

  • Treat PrivateFieldExpression (this.#v) as a simple call argument, matching Prettier's behavior where it's a MemberExpression with a PrivateIdentifier
  • Without this fix, this.#v as a call argument causes the formatter to break arguments into multiple lines unnecessarily

Before:

this.#t = setInterval(
  () => {
    console.log();
  },
  this.#v,
);

After (matches Prettier):

this.#t = setInterval(() => {
  console.log();
}, this.#v);

Closes #19330

Test plan

  • Added test fixture private-field-call-args.ts reproducing the issue
  • All 171 formatter tests pass
  • Prettier conformance unchanged: JS 746/753 (99.07%), TS 591/601 (98.34%)
  • Clippy clean

🤖 Generated with Claude Code

@github-actions github-actions bot added A-formatter Area - Formatter C-bug Category - Bug labels Feb 13, 2026
@codspeed-hq
Copy link

codspeed-hq bot commented Feb 13, 2026

Merging this PR will not alter performance

✅ 47 untouched benchmarks
⏩ 3 skipped benchmarks1


Comparing 02-13-fix_formatter_private_field_simple_argument_19330 (fb4377a) with main (81f0039)

Open in CodSpeed

Footnotes

  1. 3 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@leaysgur leaysgur added the 0-merge Merge with Graphite Merge Queue label Feb 13, 2026
Copy link
Member

leaysgur commented Feb 13, 2026

Merge activity

#19348)

## Summary

- Treat `PrivateFieldExpression` (`this.#v`) as a simple call argument, matching Prettier's behavior where it's a `MemberExpression` with a `PrivateIdentifier`
- Without this fix, `this.#v` as a call argument causes the formatter to break arguments into multiple lines unnecessarily

**Before:**
```ts
this.#t = setInterval(
  () => {
    console.log();
  },
  this.#v,
);
```

**After (matches Prettier):**
```ts
this.#t = setInterval(() => {
  console.log();
}, this.#v);
```

Closes #19330

## Test plan

- [x] Added test fixture `private-field-call-args.ts` reproducing the issue
- [x] All 171 formatter tests pass
- [x] Prettier conformance unchanged: JS 746/753 (99.07%), TS 591/601 (98.34%)
- [x] Clippy clean

🤖 Generated with [Claude Code](https://claude.com/claude-code)
@graphite-app graphite-app bot force-pushed the 02-13-fix_formatter_private_field_simple_argument_19330 branch from fb4377a to e9c5b1e Compare February 13, 2026 03:10
@graphite-app graphite-app bot merged commit e9c5b1e into main Feb 13, 2026
21 checks passed
@graphite-app graphite-app bot deleted the 02-13-fix_formatter_private_field_simple_argument_19330 branch February 13, 2026 03:16
@graphite-app graphite-app bot removed the 0-merge Merge with Graphite Merge Queue label Feb 13, 2026
camc314 pushed a commit that referenced this pull request Feb 16, 2026
# Oxlint
### 💥 BREAKING CHANGES

- 7711821 oxlint: [**BREAKING**] `no-shadow-restricted-names` report
`globalThis` by default (#19407) (Sysix)

### 🚀 Features

- ce1baa0 linter: Implement eslint/no-shadow (#18979) (Víctor Fernández)
- 7a333c1 linter: Support dynamic configs via CLI arguments (#19384)
(camc314)
- 1bf569b linter: Implement typescript/unified-signatures (#19375)
(camc314)
- 6562a9b linter: Implement typescript/parameter-properties (#19374)
(camc314)
- 94d8d74 linter: Implement typescript/no-use-before-define (#19373)
(camc314)
- 80b002a linter: Implement fixer for unicorn/no-instanceof-builtins
(#19371) (camc314)
- 5c3784b linter: Implement eslint/no-unmodified-loop-condition (#19341)
(Vincent R)
- cc00a59 linter/const-comparisons: Improve diagnostics when mixing
logical/comparison operators (#19370) (camc314)
- ea2c401 linter: Add support for no constructed context values (#18067)
(Jovi De Croock)
- f2440eb linter: Mark eslint/no-return-assign as having no fixer
(#19327) (camc314)
- 8588670 linter/unicorn: Implement suggestion for
`unicorn/no-await-in-promise-methods` rule (#19359) (Mikhail Baev)
- f0af965 linter: Move `jsx-a11y/no-static-element-interactions` rule
out of the nursery. (#19355) (connorshea)
- be0ce50 linter/tsgolint: Add support for labeled ranges in tsgolint
diagnostics (#19201) (camchenry)
- b5bc900 linter: Implement fixer for unicorn/no-new-buffer (#19326)
(camc314)
- 1612932 linter: Add typescript/no-unnecessary-condition (#19130)
(camc314)
- 37dc6c5 linter: Implement fixer for unicorn/prefer-includes (#19323)
(camc314)

### 🐛 Bug Fixes

- c2b1870 linter: Enforce config options for `react/forbid-dom-props`
rule. (#19387) (connorshea)
- 3d24e44 linter: Honor no-empty-function allow getters/setters for
object literals (#19393) (camc314)
- bbced8d linter: Enforce config options for `eslint/no-empty-function`
rule, improve docs. (#19390) (connorshea)
- 6bc8aec linter: Fix the behavior of `import/extensions` rule for a
file that has multiple extensions. (#18919) (connorshea)
- c62a295 linter/img-redundant-alt: Enforce whole-word matching for
redundant alt text (#19367) (camc314)
- 98956fe linter/describe-function-title: Skip autofix for type-only
imports (#19329) (camc314)
- d96d26d linter/plugins: Provide `parser.version` (#19364)
(overlookmotel)
- 81f0039 linter_codegen: Compute rule IDs relative to previous rule
(#19350) (camchenry)
- b7ef0a8 linter/consistent-indexed-object-style: Avoid unsafe Record
conversions for mapped types (#19320) (camc314)

### 📚 Documentation

- 3a6059f linter: Improve docs for `eslint/require-await` rule. (#19361)
(connorshea)
- b069269 linter/plugins: Add comment about deprecated `ScopeManager`
methods (#19363) (overlookmotel)
- 2d8aaf9 linter: Disable formatting for `eslint/no-unsafe-negation`
examples. (#19347) (connorshea)
- fb87806 linter: Ensure that we do not auto-format the docs for
`unicorn/number-literal-case` rule. (#19346) (connorshea)
- 8d3ae27 linter/typescript: Skip docs for deprecated type aware rule
options (#19324) (camc314)
# Oxfmt
### 💥 BREAKING CHANGES

- 00135b5 formatter/sort_imports: [**BREAKING**] Change default `groups`
order (#19427) (leaysgur)
- 9c34f72 formatter/sort_imports: [**BREAKING**] Report invalid group
name with renaming `side-effect` > `side_effect` (#19416) (leaysgur)

### 🚀 Features

- 4baebef formatter/sort_imports: Support `{ newlinesBetween: bool }`
inside `groups` (#19358) (leaysgur)
- d1c2fb6 formatter/sort_imports: Support `customGroups`
attributes(`selector` and `modifiers`) (#19356) (leaysgur)

### 🐛 Bug Fixes

- f084ea6 oxfmt: Explicitly pass `process.env` for the forked process
(#19380) (Long Ho)
- 2bc7a14 formatter: Arrow function body incorrectly broken when return
type has comment (#19368) (Dunqing)
- 90ec3d2 oxfmt: Update tailwind plugin which fixes crash on non-js file
(#19353) (leaysgur)
- e9c5b1e formatter: Treat `PrivateFieldExpression` as simple call
argument (#19348) (Dunqing)
- 80643d5 formatter: Match Prettier union indentation with leading
comments (#19271) (Dunqing)

### ⚡ Performance

- c169c77 syntax: Optimize `is_identifier_name_patched` (#19386)
(sapphi-red)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-formatter Area - Formatter C-bug Category - Bug

Projects

None yet

Development

Successfully merging this pull request may close these issues.

formatter: TS this.#x forces multi-line (diff vs. Prettier)

2 participants