Skip to content
CodePecker is a tool to detect unused Swift code.
Swift Other
  1. Swift 98.4%
  2. Other 1.6%
Branch: master
Clone or download
Latest commit b563370 Jan 15, 2020
Type Name Latest commit message Commit time
Failed to load latest commit information.
.swiftpm/xcode/package.xcworkspace first commit Dec 3, 2019
Sources Bump version to 0.1.0 Jan 15, 2020
assets update README Dec 17, 2019
.gitignore update gitignore Dec 16, 2019
.swift-version support Cocopods Dec 16, 2019
.version Bump version to 0.1.0 Jan 15, 2020
LICENSE support Cocopods Dec 16, 2019
Makefile fix makefile Dec 17, 2019
Package.swift use swift-tools-support-core instead of SPM Jan 15, 2020
Pecker.podspec fix podspec Dec 17, 2019 update README Dec 23, 2019 update README Dec 23, 2019


Note: Current same users may encounter some problems,such as "dyld: Library not loaded: @rpath/lib_InternalSwiftSyntaxParser.dylib" or not show warning. This is SwiftSyntax issue, SwiftSyntax with Swift 5.1, pls check it.

pecker is a tool to automatically detect unused code. It based on IndexStoreDB and SwiftSyntax.

If you have questions, feel free to connect me, my Twitter Roy, Email:

Language Switch: 中文.

Why use this?

During the project development process, you may write a lot of code. Over time, a lot of code is no longer used, but it is difficult to find. pecker can help you locate these unused code conveniently and accurately.


pecker can detect the following kinds of unused Swift code.

  1. class
  2. struct
  3. enum
  4. protocol
  5. function
  6. typealias
  7. operator


Using Homebrew

$ brew install woshiccm/homebrew-tap/pecker

Using CocoaPods:

pod 'Pecker'

This will download the Pecker binaries and dependencies in Pods/ during your next pod install execution and will allow you to invoke it via ${PODS_ROOT}/Pecker/bin/pecker in your Script Build Phases.

This is the recommended way to install a specific version of Pecker since it supports installing a pinned version rather than simply the latest.

Using Mint:

mint install woshiccm/Pecker


$ git clone
$ cd Pecker
$ make install

With that installed and on our bin folder, now we can use it.



Integrate Pecker into an Xcode scheme to get warnings and errors displayed in the IDE. Just add a new "Run Script Phase" with:

if which pecker >/dev/null; then
  echo "warning: Pecker not installed, download from"

Alternatively, if you've installed Pecker via CocoaPods the script should look like this:




  1. In terminal, can't get project index path automatically, so you need to set index path through -i/--index-store-path
  2. Need to set set report as json and set output_file, the path should be absolute path, if not specified output_file, the default is your project directory path.

For example:

.pecker.yml configuration:

reporter: "json"

output_file: "/Users/ming/Desktop/PeckerResultDirectory"

terminal input

pecker /Users/ming/Desktop/Testttt -i /Users/ming/Library/Developer/Xcode/DerivedData/Testttt-aohluxvofrwtfagozexmpeifvryf/Index/DataStore

Command Line Usage

pecker [OPTIONS]

  • -v/--version: Prints the pecker version and exits.
  • -i/--index-store-path: The Index path of your project, if unspecified, the default is ~Library/Developer/Xcode/DerivedData/{your project}/Index/DataStore.

Run pecker in the project target to detect. Project will be searched Swift files recursively.


Current only 5 rules are included in Pecker, They are skip_public, xctest, attributes, xml, comment. You can add them to disabled_rules if you don't need it. You can also check Source/PeckerKit/Rules directory to see their implementation.


This rule means skip detect public class, struct, function, etc. Usually the public code is provided for other users, so it is difficult to determine whether it is used. So we don't detect it by default. But in some cases, such as using submodule to organize code, you need to detect public code, you can add it to disabled_rules.


XCTest is special, we stipulate that ignore classes inherited from XCTestCase and functions of this class that hasPrefix "test" and do not contain parameters.

class ExampleUITests: XCTestCase {

    func testExample() { //used

    func test(name: String) { // unused
    func get() { // unused


If a Declaration contains the attribute in BlackListAttribute, skip. Such as IBAction, we are continuously collecting, if you find new cases, please let us know.

@IBAction func buttonTap(_ sender: Any) { // used


If code is used in xib or storyboard, it also means used.


Code can be ignore with a comment inside a source file with the following format:

  • Ignore specified code
// pecker:ignore 

For example:

// pecker:ignore
class TestCommentObject { // skip
    // pecker:ignore
    func test1() { // skip
    func test2() { // unused
  • Ignore all symbols under scope
// pecker:ignore all

For example:

// pecker:ignore all
class TestCommentObject { // skip
    func test1() { // skip
    struct SubClass { // skip
        func test2() { // skip

Other rules

These rules are used by default, you cannot configure them.


Skip declarations that override another. This works for both subclass overrides & protocol extension overrides.

protocol ExampleProtocol {
	func test() // used

class Example: ExampleProtocol {
    func test() { // used

class Animal {
    func run() {  // used

class Dog: Animal {
    override func run() { // used


Referenced elsewhere means used, except for extensions.

class UnusedExample { // unused

extension UnusedExample {


This is optinal, will use default, if unspecified. Configure pecker by adding a .pecker.yml file from the directory you'll run pecker from. The following parameters can be configured:

Rule inclusion:

  • disabled_rules: Disable rules from the default enabled set.

Reporter inclusion:

  • xcode: Warnings displayed in the IDE.

  • json: Generate a json file named pecker.result.json, you can set path by output_file, and the path should be absolute path, if unspecified, the default is current project directory path.

reporter: "xcode"

  - skip_public

included: # paths to include during detecting. `--path` is ignored if present.
  - ./
excluded: # paths to ignore during detecting. Takes precedence over `included`.
  - Carthage
  - Pods

blacklist_files: # files to ignore during detecting, only need to add file name, the file extension default is swift.
  - HomeViewController

blacklist_symbols: # symbols to ignore during detecting, contains class, struct, enum, etc.
  - AppDelegate
  - viewDidLoad

blacklist_superclass: # all the class inherit from class specified in the list will ignore
    - UITableViewCell

output_file: "/Users/ming/Desktop/PeckerResultDirectory"

Contributions and support

pecker is developed completely in the open.

Any contributing and pull requests are warmly welcome. If you are interested in developing pecker, submit ideas and submit pull requests!



pecker is released under the MIT License.

You can’t perform that action at this time.