Skip to content

[checks_codegen] Skip private fields and fields referencing private types - #2782

Merged
natebosch merged 6 commits into
masterfrom
checks-codegen-private-fields
Nov 6, 2026
Merged

natebosch merged 6 commits into
masterfrom
checks-codegen-private-fields

Conversation

@natebosch

@natebosch natebosch commented Oct 8, 2026 •

Copy link
Copy Markdown
Member

The generated extension is written to a separate .checks.dart library, so it
cannot access private members or private types from other libraries. Generating
a getter for a private member or for a public member whose type mentions a
private type produced code which failed to compile, for example:

_i1.Subject<int> get _privateField =>
    has2('_privateField', (v) => v._privateField);

or a return type referencing _i2._Private.

Skip private fields and fields whose getter return type references any private
interface element—including in type arguments, function return/parameter/bound
types, record fields, and instantiated class type parameter bounds—before
collecting referenced elements for import resolution.

Also fail with InvalidGenerationSourceError when @CheckExtensions directly
lists a private class.

The generated extension is written to a separate `.checks.dart` library,
so it cannot access private members of the checked class. Generating a
getter for a private field or getter produced code which failed to
compile, for example:

    _i1.Subject<int> get _privateField =>
        has((v) => v._privateField, '_privateField');

When the private member has a private type it also referenced the
inaccessible type, such as `_i2._Private`.

Omit private fields from the generated extension, and add a test and
CHANGELOG entry.
@github-actions

github-actions Bot commented Oct 8, 2026 •

Copy link
Copy Markdown

PR Health

Publish ✔️
Package Version Status Publish tag (post-merge)
package:checks_codegen ⭐ 0.1.1-wip WIP (no publish necessary)
  • 4 already published.
  • 4 WIP (no publish necessary).

Documentation at https://github.com/dart-lang/ecosystem/wiki/Publishing-automation.

This check can be disabled by tagging the PR with skip-publish-check.

Changelog Entry ✔️
Package Changed Files

Changes to files need to be accounted for in their respective changelogs.

This check can be disabled by tagging the PR with skip-changelog-check (for example, for non-user-visible changes when the package version is already at -wip).

@natebosch
natebosch marked this pull request as ready for review October 8, 2026 19:39
@natebosch
natebosch requested a review from davidmorgan October 8, 2026 19:39
bool _isCheckableField(FieldElement field) =>
field.name != 'hashCode' &&
!field.isStatic &&
!field.isPrivate &&

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

A public member with a private type still generates code that doesn't compile: _Private get publicGetter; (with abstract class _Private {}) emits _i1.Subject<_i2._Private> get publicGetter => .... The PR description mentions the private type symptom, but this only skips private members. Fine to leave for a follow-up if out of scope.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Done — public members whose getter type references a private interface element anywhere (including type arguments, function types, records, and class type parameter bounds) are now skipped too, and listing a private class directly in @CheckExtensions reports an error.


/// Whether [field] should get a `has` getter.
///
/// Checks whether the field can be referenced on an instance of the class

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Optional: this contract doesn't hold for setter-only members. set x(int v); gets a synthetic field with getter == null, so this returns true and the generated has((v) => v.x, 'x') doesn't compile. Pre-existing, but the new comment makes the gap visible.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Setter-only members are now omitted by the rawType.getGetter check from #2781, and I inlined _isCheckableField into _CheckTarget so the field filter and its doc comment cover all of the conditions together.

…ate-fields

# Conflicts:
#	pkgs/checks_codegen/CHANGELOG.md
#	pkgs/checks_codegen/lib/src/builder.dart
The generated .checks.dart file is a separate library, so any reference to
a private interface type fails to compile. Filter out fields whose getter
return type references a private interface element anywhere—including in
type arguments, function return/parameter/bound types, record fields, and
instantiated class type parameter bounds—before collecting referenced
elements for import resolution.

Also fail with InvalidGenerationSourceError when @CheckExtensions itself
lists a private class.
_isCheckableField only checked name, static, and privacy, while getter
existence (excluding setter-only fields) and private-type references were
checked separately in _CheckTarget. Inline the field checks into the
_CheckTarget.fields comprehension and document the full criteria on fields.
@natebosch natebosch changed the title [checks_codegen] Skip private fields [checks_codegen] Skip private fields and fields referencing private types Nov 6, 2026
@natebosch
natebosch merged commit b8dc888 into master Nov 6, 2026
70 checks passed
@natebosch
natebosch deleted the checks-codegen-private-fields branch November 6, 2026 02:11
copybara-service Bot pushed a commit to dart-lang/sdk that referenced this pull request Nov 12, 2026
Revisions updated by `dart tools/rev_sdk_deps.dart`.

core (https://github.com/dart-lang/core/compare/36f57a9..fa0c6b7):
  fa0c6b77  Fri Nov 6 12:56:58 2026 +0100  Michael Thomsen  Release os_detect 2.0.4 (dart-lang/core#1038)

dartdoc (https://github.com/dart-lang/dartdoc/compare/03ec6df..7e2508c):
  7e2508c6  Wed Nov 11 14:52:22 2026 +0200  Sergey G. Grekhov  Add constructor doc comment tests for enums and extension types (dart-lang/dartdoc#4316)
  03dfb467  Mon Nov 9 11:00:32 2026 +0200  Sergey G. Grekhov  `#3330`. Split test for parameters to separate tests (dart-lang/dartdoc#4314)
  23302d53  Mon Nov 9 10:56:34 2026 +0200  Sergey G. Grekhov  Add tests for primary constructors (dart-lang/dartdoc#4313)

ecosystem (https://github.com/dart-lang/ecosystem/compare/54e1673..1d2b5ff):
  1d2b5ff  Tue Nov 10 09:04:24 2026 -0800  Kevin Moore  feat(repo_manage): add --replace-pattern to report changelog (dart-lang/ecosystem#482)

http (https://github.com/dart-lang/http/compare/4646fe6..2bac218):
  2bac218  Fri Nov 6 17:49:23 2026 -0800  dart-ecosystem-bot[bot]  Tidy: package:cronet_http
  cdf967c  Fri Nov 6 15:40:49 2026 -0800  Brian Quinlan  chore(groundkeeper): use stable for flutter (dart-lang/http#2066)
  6582177  Thu Nov 5 13:04:35 2026 -0800  Brian Quinlan  doc: use timeout as an abort example (dart-lang/http#2062)

native (https://github.com/dart-lang/native/compare/6287745..b21ef2d):
  b21ef2da3  Wed Nov 11 16:07:34 2026 +0530  dhairya05  [json_syntax_generator] Pass the parameter name to ArgumentError.value (dart-lang/native#3787)
  20a607e48  Wed Nov 11 07:28:03 2026 -0300  Daco Harkes  [code_assets] [hooks] [hooks_runner] Adopt `.g.dart` for generated files (dart-lang/native#3790)
  cc974ddec  Wed Nov 11 19:59:39 2026 +1100  Liam Appelbe  [objective_c] Fix `isValidObject` bug on iOS simulator (dart-lang/native#3788)
  f7edbdee3  Sun Nov 8 13:18:25 2026 +1100  Liam Appelbe  [jni] Fix possible receiver NPEs (dart-lang/native#3784)
  0ca7d6745  Fri Nov 6 10:20:21 2026 -0300  Daco Harkes  [code_assets] [hooks_runner] [native_toolchain_c] Prepare for release (dart-lang/native#3781)
  baad15ab4  Fri Nov 6 02:56:52 2026 +0100  Kravchenko Igor  [objective_c] Link Foundation in the native support library (dart-lang/native#3782)

shelf (https://github.com/dart-lang/shelf/compare/9946de5..b175e9f):
  b175e9f  Tue Nov 10 09:14:31 2026 +0530  Muhammad Uvesh  shelf_static: ignore invalid If-Modified-Since headers (dart-lang/shelf#557)
  02b5f94  Sat Nov 7 23:09:28 2026 +0530  dhairya05  Fix typo in shelf_router docs (dart-lang/shelf#556)

test (https://github.com/dart-lang/test/compare/2a9e017..3533ae1):
  3533ae1e  Tue Nov 10 15:06:08 2026 -0800  Nate Bosch  Never retry tearDownAll (dart-lang/test#2815)
  5680b0b1  Fri Nov 6 12:52:11 2026 +0100  Sigurd Meldgaard  Add globalSetup and addGlobalTearDown APIs for cross-suite setup and teardown (dart-lang/test#2714)
  b8dc888a  Thu Nov 5 18:11:37 2026 -0800  Nate Bosch  [checks_codegen] Skip private fields and fields referencing private types (dart-lang/test#2782)
  66e062c4  Thu Nov 5 16:05:36 2026 -0800  Nate Bosch  [checks_codegen] Generate full field types with imports (dart-lang/test#2781)

tools (https://github.com/dart-lang/tools/compare/727fd9c..589d844):
  589d844c4  Wed Nov 11 20:27:32 2026 +0300  Hasan Armoush  fix(markdown): combine adjacent Text nodes when the element is last in its list (dart-lang/tools#2598)

Change-Id: I13acaa7378c86f2c33d88f3c4b163acf2b48ff08
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/576820
Commit-Queue: Nate Bosch <[email protected]>
Reviewed-by: Nicholas Shahan <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants