feat(parsers): replace Swift regex parser with swift-symbolgraph-extract#38
Conversation
7cb1a77 to
5f182e3
Compare
Replaces the regex-based swift-parser with swift-symbolgraph-extract, the Swift compiler's own tool for public API surface extraction.
ca944df to
4471c55
Compare
spydon
left a comment
There was a problem hiding this comment.
Can't we use the swift package dump-symbol-graph instead of going as low-level as we do in this PR?
swift package dump-symbol-graph \
--minimum-access-level public \
--skip-synthesized-members \
--output-directory ./symbolgraph
…raph Replaces the manual swift build + module-discovery loop + swift-symbolgraph-extract invocation with a single `swift package dump-symbol-graph` call, which handles build, module discovery, and extraction internally.
|
Good call — replaced the manual 🤖 Addressed by Claude Code |
…e dump-symbol-graph) swift package dump-symbol-graph always writes to .build/<triple>/symbolgraph. Locate it with `find .build -maxdepth 3 -type d -name "symbolgraph"` instead.
swift package dump-symbol-graph tries all targets including test targets. Test modules can't be loaded in CI SDK search paths. Library target files land before the test-target attempt, so || true lets the step continue. Guard ensures the step still fails if zero files were produced.
spydon
left a comment
There was a problem hiding this comment.
The symbol graph should be regenerated with swift package dump-symbol-graph --minimum-access-level public --skip-synthesized-members I think?
If you do that the the access-filter assertions can be dropped.
…filter assertions Regenerate symbolgraph-sample.json with swift package dump-symbol-graph --minimum-access-level public --skip-synthesized-members. The fixture now reflects actual CI output: only public/open symbols, no InternalClass. Remove the access-filter test block and the "excludes InternalClass" smoke test — with --minimum-access-level public enforced upstream, those inputs can never arrive at the normalizer.
|
Done in commit a88c801 — fixture regenerated with 🤖 Addressed by Claude Code |
--minimum-access-level public on dump-symbol-graph ensures only public/open symbols reach the normalizer. Remove the accessLevel field from SymbolGraphSymbol and the redundant filter loop in normalizeSymbolGraph.
…icts Merge origin/main (PRs #37–#40) into this branch: - #37: sdk-parse-ignore → .sdk-parse-ignore (already synced) - #38: Dart symbol extractor - #39: Swift symbolgraph parser (replaces regex parser, deletes swift-parser.test.ts) - #40: CODEOWNERS, README, CLAUDE.md updates Conflict resolutions: - package.json: keep both normalize-griffe (ours) and normalize-symbolgraph (main) - validate-sdk-compliance.yml: add Python steps alongside Dart/Swift symbolgraph steps; conditions on Resolve/Parse steps now exclude python, swift, and dart
Summary
Replaces the handrolled
swift-parser.ts(a ~170-line regex scanner with brace-depth tracking) withswift package dump-symbol-graph— the Swift compiler's own tool for public API surface extraction — and a thin TypeScript normalizer.Why
The regex parser had known blind spots: multi-line declarations,
#ifconditional compilation, attributes spanning lines, and could not model access control semantics (@_spi,@usableFromInline, re-exports). Root cause: regex cannot reliably parse Swift.swift package dump-symbol-graphuses the Swift compiler and gets it right by construction.Approach
Changes
Added
src/normalize-symbolgraph.ts— core normalizer:SymbolGraphSymbol[]→ParseResultsrc/normalize-symbolgraph-cli.ts— CLI entry point (npm run normalize-symbolgraph)test/normalize-symbolgraph.test.ts— 103 tests (kind mapping, name construction, file path, fixture smoke tests)test/fixtures/symbolgraph-sample.json— realdump-symbol-graphoutput (17 symbols, public/open only)Removed
src/swift-parser.ts,src/parse-swift.ts— regex parsertest/swift-parser.test.ts— regex parser testsModified
.github/workflows/validate-sdk-compliance.yml— Swift-conditional steps:macos-latestrunner,swift package dump-symbol-graph,jqmerge, normalizer dispatch; existing parse steps guarded for onlyjavascript;actions/cacheSHA-pinned; Dart steps from feat(parsers): add Dart public API parser via package:analyzer (alternative to #35) #41 integratedpackage.json—normalize-symbolgraphreplacesparse-swiftKey decisions
--minimum-access-level public: filters at source, so the normalizer needs no access-level check of its own--skip-synthesized-members: prevents_Concurrencyprotocol conformance methods (e.g.withSerialExecutor) from generating false-positive "new symbol" CI failures when a PR adds a newpublic actor|| trueon extraction:dump-symbol-graphalso tries test targets, which can fail to load on CI runners; library targets land before the test-target attempt, so|| true+ a file-count guard lets the step continue correctlymacos-latestrunner: Swift is pre-installed; avoidsswift-actions/setup-swiftoverhead on ubuntuTest plan
npm test— 11 files)npm run typecheck)dump-symbol-graph --minimum-access-level publicoutput (not hand-authored)validateandcheckjobs)