Fix false positives for SPM packages using custom path: argument#1
Merged
michaelversus merged 1 commit intomichaelversus:mainfrom Dec 18, 2025
Merged
Conversation
Problem:
The tool produced false positives for SPM packages that use custom
path: arguments in their target definitions. When Sources/TargetName
didn't exist, it fell back to scanning ALL of Sources/ and attributed
every file to that target.
Example: A package with:
.target(name: "MyModule", path: "Sources/Core")
.target(name: "MyModuleUI", path: "Sources/UI")
Would look for Sources/MyModule, not find it, fall back to Sources/,
scan all files, and report UI code as violations for MyModule.
Solution:
1. Added `path: String?` property to SwiftPackageTarget to store
custom paths from target definitions
2. Updated PackageSwiftFileVisitor to parse the path: argument from
SPM target function calls using SwiftSyntax
3. Modified PackagesParser to:
- Use the explicit path from Package.swift when available
- Normalize paths (strip leading/trailing slashes) to prevent
double-slash issues
- Throw `customPathNotFound` error if custom path doesn't exist
(prevents silent false positives from scanning zero files)
- Only fall back to convention (Sources/TargetName) when no
custom path is specified
Tests:
- Added CustomPathPackage fixture with path: "Sources/Core" for target
- Added Sources/UI/ with undeclared import to verify files outside
custom path are NOT scanned (negative test case)
- Added testTarget with custom path (CustomTests/) to verify
.testTarget() works correctly with path: argument
- Added InvalidCustomPathPackage fixture to test customPathNotFound error
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Owner
|
Thank you for your contribution @swizzlr ! |
Welcome to Codecov 🎉Once you merge this PR into your default branch, you're all set! Codecov will compare coverage reports and display results in all future pull requests. Thanks for integrating Codecov - We've got you covered ☂️ |
Author
|
No worries, thanks for taking the time to review! |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem:
The tool produced false positives for SPM packages that use custom path: arguments in their target definitions. When Sources/TargetName didn't exist, it fell back to scanning ALL of Sources/ and attributed every file to that target.
Example: A package with:
.target(name: "MyModule", path: "Sources/Core")
.target(name: "MyModuleUI", path: "Sources/UI")
Would look for Sources/MyModule, not find it, fall back to Sources/, scan all files, and report UI code as violations for MyModule.
Solution:
Added
path: String?property to SwiftPackageTarget to store custom paths from target definitionsUpdated PackageSwiftFileVisitor to parse the path: argument from SPM target function calls using SwiftSyntax
Modified PackagesParser to:
customPathNotFounderror if custom path doesn't exist (prevents silent false positives from scanning zero files)Tests:
🤖 Generated with Claude Code