Skip to content

fix(dart-extractor): exclude @internal symbols from the public API surface#54

Merged
spydon merged 1 commit into
mainfrom
fix/dart-extractor-respect-internal
Jul 1, 2026
Merged

fix(dart-extractor): exclude @internal symbols from the public API surface#54
spydon merged 1 commit into
mainfrom
fix/dart-extractor-respect-internal

Conversation

@spydon

@spydon spydon commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

What

The Dart symbol extractor now skips declarations and members annotated with @internal (from package:meta), excluding them from the extracted public API surface.

Why

The extractor is purely syntactic and name-based: it treats every non-underscore declaration under lib/** as public API. But @internal is the canonical Dart marker for a symbol that is public by the underscore rule yet explicitly not part of the package's public API (typically a lib/src helper that is not exported from the package's public library).

Today those symbols are false positives. The only escape hatch is listing individual files in .sdk-parse-ignore by hand, which is easy to forget and drifts out of sync with the code. Honouring @internal lets the annotation on the declaration be the single source of truth.

This came up in supabase-flutter: a new internal helper RetryTimer.cancel in packages/realtime_client/lib/src/retry_timer.dart (a lib/src class that is not exported) tripped the capability-matrix check even though it is not public API.

What changed

  • extractFromSource skips any top-level declaration whose metadata contains @internal.
  • _emitContainer skips any member (method, field, constructor) annotated with @internal.
  • Matching is syntactic by annotation name, so both the bare @internal and a prefixed @meta.internal are recognised, consistent with the rest of the parser not resolving elements.

Tests

Added a test covering an @internal class, an @internal method, an @meta.internal field, and an @internal top-level function, asserting each is excluded while sibling public symbols are still captured. All existing extractor tests pass.

Note

Symbols marked @internal will now disappear from generated symbol sets. That is the intended effect, and it also means some entries in consumer .sdk-parse-ignore files can be replaced by an @internal annotation on the declaration over time.

…lic API surface

The Dart symbol extractor treats every non-underscore declaration under
lib/** as public API. Symbols annotated with @internal (from package:meta)
are public by Dart's underscore rule but are explicitly not part of the
package's public API, so they were false positives that had to be listed
by hand in .sdk-parse-ignore.

Skip any top-level declaration or member carrying @internal (bare or via
an import prefix such as @meta.internal), matched syntactically by name
since parsing does not resolve elements.
@spydon spydon requested a review from a team as a code owner July 1, 2026 16:29
@spydon spydon merged commit 9bd358e into main Jul 1, 2026
3 checks passed
@spydon spydon deleted the fix/dart-extractor-respect-internal branch July 1, 2026 16:43
spydon added a commit to supabase/supabase-flutter that referenced this pull request Jul 2, 2026
…arse-ignore (#1510)

## What

Replaces the three `.sdk-parse-ignore` entries for the clear-auth-url
helpers with `@internal` annotations on the declarations, and removes
those entries.

## Why

The SDK capability-matrix symbol extractor now honours `@internal` (from
`package:meta`), see supabase/sdk#54. Before that, the extractor treated
every non-underscore `lib/src` declaration as public API, so the
internal auth-url helpers had to be excluded by path in
`.sdk-parse-ignore`.

`@internal` on the declaration is a better source of truth than a
hand-maintained path list: it lives next to the code, travels with
refactors, and documents intent directly.

## What changed

- `removeAuthParametersFromUrl` (`clear_auth_url_parameters.dart`)
marked `@internal`.
- `clearAuthUrlParameters` in both conditional-import shims
(`clear_auth_url_parameters_web.dart`,
`clear_auth_url_parameters_stub.dart`) marked `@internal`.
- Removed the three entries from `.sdk-parse-ignore`; its header now
points to `@internal` as the preferred mechanism and reserves the file
for paths that cannot carry the annotation (for example generated
sources).

All three symbols are used only within `supabase_flutter`, so
`@internal` produces no cross-package analyzer warnings. Verified
against the updated extractor that the package no longer emits these
symbols while its other 466 public symbols are unchanged.
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