realm / jazzy

Soulful docs for Swift & Objective-C
https://realm.io
MIT License
7.35k stars 413 forks source link

Xcode 15: Unknown symbol kind swift.extension #1368

Closed esteluk closed 1 year ago

esteluk commented 1 year ago

With some code that offers an extension to a public (Foundation?) class, such as this:

public etension Bundle {
  static var myBundle: Bundle? {
    // ...
    return nil
  }
}

The following gets generated as in my symbol graph build/symbolgraph/target/Target@Foundation.symbols.json:

{
    "kind": {
        "identifier": "swift.extension",
        "displayName": "Extension"
    },
    "identifier": {
        "precise": "s:e:s:So8NSBundleC29TargetE04selfD0ABSgvpZ",
        "interfaceLanguage": "swift"
    },
    "pathComponents": [
        "Bundle"
    ],
    "names": {
        "title": "Bundle",
        "navigator": [
            {
                "kind": "identifier",
                "spelling": "Bundle"
            }
        ],
        "subHeading": [
            {
                "kind": "keyword",
                "spelling": "extension"
            },
            {
                "kind": "text",
                "spelling": " "
            },
            {
                "kind": "typeIdentifier",
                "spelling": "Bundle",
                "preciseIdentifier": "c:objc(cs)NSBundle"
            }
        ]
    },
    "swiftExtension": {
        "extendedModule": "Foundation",
        "typeKind": "swift.class"
    },
    "declarationFragments": [
        {
            "kind": "keyword",
            "spelling": "extension"
        },
        {
            "kind": "text",
            "spelling": " "
        },
        {
            "kind": "typeIdentifier",
            "spelling": "Bundle",
            "preciseIdentifier": "c:objc(cs)NSBundle"
        }
    ],
    "accessLevel": "public",
    "location": {
        "uri": "...",
        "position": {
            "line": 6,
            "character": 7
        }
    }
}

Then when I run Jazzy with the config:

swift_build_tool: symbolgraph
symbolgraph_directory: build/symbol-graph/target/

The following error occurs:

/Users/nathanw/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/fastlane-2.213.0/fastlane_core/lib/fastlane_core/ui/interface.rb:153:in `shell_error!': [!] Exit status of command 'jazzy' was 1 instead of 0. (FastlaneCore::Interface::FastlaneShellError)
/Users/nathanw/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/jazzy-0.14.4/lib/jazzy/symbol_graph/symbol.rb:120:in `init_kind': Unknown symbol kind 'swift.extension' (RuntimeError)
    from /Users/nathanw/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/jazzy-0.14.4/lib/jazzy/symbol_graph/symbol.rb:29:in `initialize'
    from /Users/nathanw/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/jazzy-0.14.4/lib/jazzy/symbol_graph/graph.rb:22:in `new'
    from /Users/nathanw/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/jazzy-0.14.4/lib/jazzy/symbol_graph/graph.rb:22:in `block in initialize'
    from /Users/nathanw/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/jazzy-0.14.4/lib/jazzy/symbol_graph/graph.rb:21:in `each'
    from /Users/nathanw/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/jazzy-0.14.4/lib/jazzy/symbol_graph/graph.rb:21:in `initialize'
    from /Users/nathanw/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/jazzy-0.14.4/lib/jazzy/symbol_graph.rb:78:in `new'
    from /Users/nathanw/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/jazzy-0.14.4/lib/jazzy/symbol_graph.rb:78:in `block in parse_symbols'
    from /Users/nathanw/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/jazzy-0.14.4/lib/jazzy/symbol_graph.rb:71:in `map'
    from /Users/nathanw/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/jazzy-0.14.4/lib/jazzy/symbol_graph.rb:71:in `parse_symbols'
    from /Users/nathanw/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/jazzy-0.14.4/lib/jazzy/symbol_graph.rb:34:in `build'
    from /Users/nathanw/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/jazzy-0.14.4/lib/jazzy/doc_builder.rb:78:in `build'
    from /Users/nathanw/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/jazzy-0.14.4/bin/jazzy:16:in `<top (required)>'
    from /Users/nathanw/.rbenv/versions/3.2.2/bin/jazzy:25:in `load'
    from /Users/nathanw/.rbenv/versions/3.2.2/bin/jazzy:25:in `<main>'
Using config file .jazzy.yaml

Tested with Jazzy 0.14.4. Before moving to Xcode 15, the same code was compiling as expected, so I guess the symbol kind may have changed between releases. Will try to check the symbol kind in Xcode 14 when I get a chance.

esteluk commented 1 year ago

The Xcode 14 output is very different:

{
    "kind": {
        "identifier": "swift.type.property",
        "displayName": "Type Property"
    },
    "identifier": {
        "precise": "s:So8NSBundleC29TargetE04selfD0ABSgvpZ",
        "interfaceLanguage": "swift"
    },
    "pathComponents": [
        "Bundle",
        "myBundle"
    ],
    "names": {
        "title": "myBundle",
        "subHeading": [
            {
                "kind": "keyword",
                "spelling": "static"
            },
            {
                "kind": "text",
                "spelling": " "
            },
            {
                "kind": "keyword",
                "spelling": "var"
            },
            {
                "kind": "text",
                "spelling": " "
            },
            {
                "kind": "identifier",
                "spelling": "myBundle"
            },
            {
                "kind": "text",
                "spelling": ": "
            },
            {
                "kind": "typeIdentifier",
                "spelling": "Bundle",
                "preciseIdentifier": "c:objc(cs)NSBundle"
            },
            {
                "kind": "text",
                "spelling": "?"
            }
        ]
    },
    "docComment": {
        "uri": "...",
        "module": "Target",
        "lines": [
            {
                "range": {
                    "start": {
                        "line": 7,
                        "character": 8
                    },
                    "end": {
                        "line": 7,
                        "character": 38
                    }
                },
                "text": "My comment"
            }
        ]
    },
    "swiftExtension": {
        "extendedModule": "Foundation",
        "typeKind": "swift.class"
    },
    "declarationFragments": [
        {
            "kind": "keyword",
            "spelling": "static"
        },
        {
            "kind": "text",
            "spelling": " "
        },
        {
            "kind": "keyword",
            "spelling": "var"
        },
        {
            "kind": "text",
            "spelling": " "
        },
        {
            "kind": "identifier",
            "spelling": "myBundle"
        },
        {
            "kind": "text",
            "spelling": ": "
        },
        {
            "kind": "typeIdentifier",
            "spelling": "Bundle",
            "preciseIdentifier": "c:objc(cs)NSBundle"
        },
        {
            "kind": "text",
            "spelling": "? { "
        },
        {
            "kind": "keyword",
            "spelling": "get"
        },
        {
            "kind": "text",
            "spelling": " }"
        }
    ],
    "accessLevel": "public",
    "location": {
        "uri": "...",
        "position": {
            "line": 8,
            "character": 15
        }
    }
}

From searching I saw https://forums.swift.org/t/symbol-graph-adaptions-for-documenting-extensions-to-external-types-in-docc/56684/2 on which @johnfairh replied last year, which probably has all the context for this change.

johnfairh commented 1 year ago

Oh right - I had thought we could ignore this stuff because it's opt-in (-emit-extension-block-symbols), didn't think about users supplying opted-in symbolgraph files. Will take a look. Thanks for reporting it.

esteluk commented 1 year ago

It looks like the default behaviour of Swift 5.9 didn't change: I guess Xcode 15 might be opting in to emit-extension-block-symbols now

johnfairh commented 1 year ago

Fixed in master via #1372.