Repository navigation
[checks_codegen] Skip private fields and fields referencing private types - #2782
Conversation
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.
PR HealthPublish ✔️
Documentation at https://github.com/dart-lang/ecosystem/wiki/Publishing-automation. This check can be disabled by tagging the PR with Changelog Entry ✔️
Changes to files need to be accounted for in their respective changelogs. This check can be disabled by tagging the PR with |
| bool _isCheckableField(FieldElement field) => | ||
| field.name != 'hashCode' && | ||
| !field.isStatic && | ||
| !field.isPrivate && |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
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]>
The generated extension is written to a separate
.checks.dartlibrary, so itcannot 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:
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
InvalidGenerationSourceErrorwhen@CheckExtensionsdirectlylists a private class.