reachableNamesOf function
What entryPoint links, named the way a rule names it: a package name for
package: URIs, the bare library for dart: ones (dart:io).
The two live in one set because a seam rule does not care which kind of
boundary it is guarding — dart:io and tom_github_api are both "something
this entry point must not reach", and splitting them would mean two rule
fields that are always written together.
Implementation
Set<String> reachableNamesOf(String entryPoint) => {
for (final uri in externalImportsOf(entryPoint))
uri.startsWith('dart:') ? uri.split('/')[0] : packageOf(uri),
};