Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Sources/SwiftDocC/Infrastructure/ConvertActionConverter.swift
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ package enum ConvertActionConverter {
}

if emitDigest {
let nodeLinkSummaries = entity.externallyLinkableElementSummaries(context: context, renderNode: renderNode, includeTaskGroups: true)
let nodeLinkSummaries = entity.externallyLinkableElementSummaries(context: context, renderNode: renderNode)
let nodeIndexingRecords = try renderNode.indexingRecords(onPage: identifier)

resultsGroup.async(queue: resultsSyncQueue) {
Expand All @@ -157,7 +157,7 @@ package enum ConvertActionConverter {
indexingRecords.append(contentsOf: nodeIndexingRecords)
}
} else if FeatureFlags.current.isExperimentalLinkHierarchySerializationEnabled {
let nodeLinkSummaries = entity.externallyLinkableElementSummaries(context: context, renderNode: renderNode, includeTaskGroups: false)
let nodeLinkSummaries = entity.externallyLinkableElementSummaries(context: context, renderNode: renderNode)

resultsGroup.async(queue: resultsSyncQueue) {
linkSummaries.append(contentsOf: nodeLinkSummaries)
Expand Down
123 changes: 75 additions & 48 deletions Sources/SwiftDocC/LinkTargets/LinkDestinationSummary.swift

Large diffs are not rendered by default.

32 changes: 1 addition & 31 deletions Sources/SwiftDocC/SwiftDocC.docc/Resources/LinkableEntities.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"openapi": "3.0.0",
"info": {
"description": "Specification of the DocC linkable-entities.json digest file.",
"version": "0.3.0",
"version": "0.3.1",
"title": "Linkable Entities"
},
"paths": { },
Expand Down Expand Up @@ -59,12 +59,6 @@
"$ref": "#/components/schemas/PlatformAvailability"
}
},
"taskGroups": {
"type": "array",
"items": {
"$ref": "#/components/schemas/TaskGroup"
}
},
"usr": {
"type": "string"
},
Expand Down Expand Up @@ -184,13 +178,6 @@
"$ref": "#/components/schemas/DeclarationToken"
},
"nullable": true
},
"taskGroups": {
"type": "array",
"items": {
"$ref": "#/components/schemas/TaskGroup"
},
"nullable": true
}
}
},
Expand Down Expand Up @@ -517,23 +504,6 @@
}
}
},
"TaskGroup": {
"type": "object",
"required": [
"identifiers"
],
"properties": {
"title": {
"type": "string"
},
"identifiers": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"DeclarationToken": {
"required": [
"text",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5497,7 +5497,7 @@ let expected = """
let entity = try context.entity(with: reference)
let renderNode = try XCTUnwrap(converter.convert(entity))

return entity.externallyLinkableElementSummaries(context: context, renderNode: renderNode, includeTaskGroups: false)
return entity.externallyLinkableElementSummaries(context: context, renderNode: renderNode)
}
let linkResolutionInformation = try context.linkResolver.localResolver.prepareForSerialization(bundleID: bundle.id)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -713,7 +713,7 @@ class ExternalPathHierarchyResolverTests: XCTestCase {
let entity = try dependencyContext.entity(with: reference)
let renderNode = try XCTUnwrap(dependencyConverter.renderNode(for: entity))

return entity.externallyLinkableElementSummaries(context: dependencyContext, renderNode: renderNode, includeTaskGroups: false)
return entity.externallyLinkableElementSummaries(context: dependencyContext, renderNode: renderNode)
}
let linkResolutionInformation = try dependencyContext.linkResolver.localResolver.prepareForSerialization(bundleID: dependencyBundle.id)

Expand Down Expand Up @@ -1004,7 +1004,7 @@ class ExternalPathHierarchyResolverTests: XCTestCase {
for reference in context.knownPages {
let node = try context.entity(with: reference)
let renderNode = converter.convert(node)
entitySummaries.append(contentsOf: node.externallyLinkableElementSummaries(context: context, renderNode: renderNode, includeTaskGroups: false))
entitySummaries.append(contentsOf: node.externallyLinkableElementSummaries(context: context, renderNode: renderNode))
}

let externalResolver = ExternalPathHierarchyResolver(
Expand Down
174 changes: 0 additions & 174 deletions Tests/SwiftDocCTests/LinkTargets/LinkDestinationSummaryTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -104,11 +104,6 @@ class LinkDestinationSummaryTests: XCTestCase {
XCTAssertEqual(pageSummary.referenceURL.absoluteString, "doc://com.test.example/tutorials/TestBundle/Tutorial")
XCTAssertEqual(pageSummary.language, .swift)
XCTAssertEqual(pageSummary.kind, .tutorial)
XCTAssertEqual(pageSummary.taskGroups, [
.init(title: nil,
identifiers: ["doc://com.test.example/tutorials/TestBundle/Tutorial#Create-a-New-AR-Project-%F0%9F%92%BB"]
),
])
XCTAssertEqual(pageSummary.availableLanguages, [.swift])
XCTAssertEqual(pageSummary.platforms, renderNode.metadata.platforms)
XCTAssertEqual(pageSummary.redirects, nil)
Expand All @@ -126,7 +121,6 @@ class LinkDestinationSummaryTests: XCTestCase {
XCTAssertEqual(sectionSummary.referenceURL.absoluteString, "doc://com.test.example/tutorials/TestBundle/Tutorial#Create-a-New-AR-Project-%F0%9F%92%BB")
XCTAssertEqual(sectionSummary.language, .swift)
XCTAssertEqual(sectionSummary.kind, .onPageLandmark)
XCTAssertEqual(sectionSummary.taskGroups, [])
XCTAssertEqual(sectionSummary.availableLanguages, [.swift])
XCTAssertEqual(sectionSummary.platforms, nil)
XCTAssertEqual(sectionSummary.redirects, [
Expand Down Expand Up @@ -165,22 +159,6 @@ class LinkDestinationSummaryTests: XCTestCase {
XCTAssertEqual(summary.language, .swift)
XCTAssertEqual(summary.kind, .class)
XCTAssertEqual(summary.abstract, [.text("MyClass abstract.")])
XCTAssertEqual(summary.taskGroups?.map { $0.title }, [
"MyClass members (relative)",
"MyClass members (module level)",
"MyClass members (absolute)",
"MyClass members (topic relative)",
"MyClass members (topic module level)",
"MyClass members (topic absolute)",
])
for group in summary.taskGroups ?? [] {
// All 6 topic sections curate the same 3 symbols using different syntax and different specificity
XCTAssertEqual(group.identifiers, [
summary.referenceURL.appendingPathComponent("init()-33vaw").absoluteString,
summary.referenceURL.appendingPathComponent("init()-3743d").absoluteString,
summary.referenceURL.appendingPathComponent("myFunction()").absoluteString,
])
}
XCTAssertEqual(summary.availableLanguages, [.swift])
XCTAssertEqual(summary.platforms, renderNode.metadata.platforms)
XCTAssertEqual(summary.usr, "s:5MyKit0A5ClassC")
Expand Down Expand Up @@ -213,17 +191,6 @@ class LinkDestinationSummaryTests: XCTestCase {
XCTAssertEqual(summary.language, .swift)
XCTAssertEqual(summary.kind, .protocol)
XCTAssertEqual(summary.abstract, [.text("An abstract of a protocol using a "), .codeVoice(code: "String"), .text(" id value.")])
XCTAssertEqual(summary.taskGroups, [
.init(
title: "Task Group Exercising Symbol Links",
identifiers: [
// MyClass is curated 3 times using different syntax.
summary.referenceURL.deletingLastPathComponent().appendingPathComponent("MyClass").absoluteString,
summary.referenceURL.deletingLastPathComponent().appendingPathComponent("MyClass").absoluteString,
summary.referenceURL.deletingLastPathComponent().appendingPathComponent("MyClass").absoluteString,
]
),
])
XCTAssertEqual(summary.availableLanguages, [.swift])
XCTAssertEqual(summary.platforms, renderNode.metadata.platforms)
XCTAssertEqual(summary.usr, "s:5MyKit0A5ProtocolP")
Expand Down Expand Up @@ -258,7 +225,6 @@ class LinkDestinationSummaryTests: XCTestCase {
XCTAssertEqual(summary.language, .swift)
XCTAssertEqual(summary.kind, .instanceMethod)
XCTAssertEqual(summary.abstract, [.text("A cool API to call.")])
XCTAssertEqual(summary.taskGroups, [])
XCTAssertEqual(summary.availableLanguages, [.swift])
XCTAssertEqual(summary.platforms, renderNode.metadata.platforms)
XCTAssertEqual(summary.usr, "s:5MyKit0A5ClassC10myFunctionyyF")
Expand Down Expand Up @@ -295,7 +261,6 @@ class LinkDestinationSummaryTests: XCTestCase {
XCTAssertEqual(summary.language, .swift)
XCTAssertEqual(summary.kind, .function)
XCTAssertEqual(summary.abstract, nil)
XCTAssertEqual(summary.taskGroups, [])
XCTAssertEqual(summary.availableLanguages, [.swift])
XCTAssertEqual(summary.platforms, renderNode.metadata.platforms)
XCTAssertEqual(summary.usr, "s:5MyKit14globalFunction_11consideringy10Foundation4DataV_SitF")
Expand Down Expand Up @@ -363,7 +328,6 @@ class LinkDestinationSummaryTests: XCTestCase {
XCTAssertEqual(summary.language, .swift)
XCTAssertEqual(summary.kind, .instanceMethod)
XCTAssertEqual(summary.abstract, [.text("A cool API to call.")])
XCTAssertEqual(summary.taskGroups, [])
XCTAssertEqual(summary.availableLanguages, [.swift])
XCTAssertEqual(summary.platforms, renderNode.metadata.platforms)
XCTAssertEqual(summary.usr, "s:5MyKit0A5ClassC10myFunctionyyF")
Expand Down Expand Up @@ -470,14 +434,6 @@ class LinkDestinationSummaryTests: XCTestCase {
XCTAssertEqual(summary.language, .swift)
XCTAssertEqual(summary.kind, .class)
XCTAssertEqual(summary.abstract, [.text("A bar.")])
XCTAssertEqual(summary.taskGroups, [
.init(
title: "Type Methods",
identifiers: [
summary.referenceURL.appendingPathComponent("myStringFunction(_:)").absoluteString,
]
),
])
XCTAssertEqual(summary.availableLanguages.sorted(), [.swift, .objectiveC])
XCTAssertEqual(summary.platforms, renderNode.metadata.platforms)
XCTAssertEqual(summary.usr, "c:objc(cs)Bar")
Expand Down Expand Up @@ -515,7 +471,6 @@ class LinkDestinationSummaryTests: XCTestCase {
XCTAssertEqual(variant.abstract, nil)
XCTAssertEqual(variant.usr, nil)
XCTAssertEqual(variant.kind, nil)
XCTAssertEqual(variant.taskGroups, nil)

let encoded = try JSONEncoder().encode(summary)
let decoded = try JSONDecoder().decode(LinkDestinationSummary.self, from: encoded)
Expand All @@ -536,15 +491,6 @@ class LinkDestinationSummaryTests: XCTestCase {
XCTAssertEqual(summary.kind, .typeMethod)

XCTAssertEqual(summary.abstract, [.text("Does a string function.")])
XCTAssertEqual(
summary.taskGroups,
[],
"""
Expected no task groups for the Swift documentation because the symbol \
it curates (``Foo-c.typealias``) is available in Objective-C only.
"""
)

XCTAssertEqual(summary.availableLanguages.sorted(), [.swift, .objectiveC])
XCTAssertEqual(summary.platforms, renderNode.metadata.platforms)
XCTAssertEqual(summary.usr, "c:objc(cs)Bar(cm)myStringFunction:error:")
Expand Down Expand Up @@ -585,20 +531,6 @@ class LinkDestinationSummaryTests: XCTestCase {
XCTAssertEqual(variant.abstract, nil)
XCTAssertEqual(variant.usr, nil)
XCTAssertEqual(variant.kind, nil)
XCTAssertEqual(
variant.taskGroups,
[
.init(
title: "Custom",
identifiers: [
summary.referenceURL
.deletingLastPathComponent() // myStringFunction:error:
.deletingLastPathComponent() // Bar
.appendingPathComponent("Foo-c.typealias").absoluteString,
]
)
]
)

let encoded = try JSONEncoder().encode(summary)
let decoded = try JSONDecoder().decode(LinkDestinationSummary.self, from: encoded)
Expand Down Expand Up @@ -723,110 +655,4 @@ class LinkDestinationSummaryTests: XCTestCase {

XCTAssert(decoded.variants.isEmpty)
}

/// Ensure that the task group link summary for overload group pages doesn't overwrite any manual curation.
func testOverloadSymbolsWithManualCuration() async throws {
enableFeatureFlag(\.isExperimentalOverloadedSymbolPresentationEnabled)

let symbolGraph = SymbolGraph.init(
metadata: .init(formatVersion: .init(string: "1.0.0")!, generator: "unit-test"),
module: .init(name: "MyModule", platform: .init()),
symbols: [
.init(
identifier: .init(precise: "s:MyClass", interfaceLanguage: "swift"),
names: .init(title: "MyClass", navigator: nil, subHeading: nil, prose: nil),
pathComponents: ["MyClass"],
docComment: nil,
accessLevel: .public,
kind: .init(parsedIdentifier: .class, displayName: "Class"),
mixins: [:]
),
.init(
identifier: .init(precise: "s:MyClass:myFunc-1", interfaceLanguage: "swift"),
names: .init(title: "myFunc()", navigator: nil, subHeading: nil, prose: nil),
pathComponents: ["MyClass", "myFunc()"],
docComment: .init([
.init(
text: """
A wonderful overloaded function.

## Topics

### Other Cool Symbols

- ``MyStruct``
""",
range: nil)
]),
accessLevel: .public,
kind: .init(parsedIdentifier: .method, displayName: "Instance Method"),
mixins: [:]
),
.init(
identifier: .init(precise: "s:MyClass:myFunc-2", interfaceLanguage: "swift"),
names: .init(title: "myFunc()", navigator: nil, subHeading: nil, prose: nil),
pathComponents: ["MyClass", "myFunc()"],
docComment: nil,
accessLevel: .public,
kind: .init(parsedIdentifier: .method, displayName: "Instance Method"),
mixins: [:]
),
.init(
identifier: .init(precise: "s:MyStruct", interfaceLanguage: "swift"),
names: .init(title: "MyStruct", navigator: nil, subHeading: nil, prose: nil),
pathComponents: ["MyStruct"],
docComment: nil,
accessLevel: .public,
kind: .init(parsedIdentifier: .struct, displayName: "Structure"),
mixins: [:]
),
],
relationships: [
.init(
source: "s:MyClass:myFunc-1",
target: "s:MyClass",
kind: .memberOf,
targetFallback: nil
),
.init(
source: "s:MyClass:myFunc-2",
target: "s:MyClass",
kind: .memberOf,
targetFallback: nil
),
]
)

let catalogHierarchy = Folder(name: "unit-test.docc", content: [
JSONFile(name: "MyModule.symbols.json", content: symbolGraph),
InfoPlist(displayName: "MyModule", identifier: "com.example.mymodule")
])
let (bundle, context) = try await loadBundle(catalog: catalogHierarchy)

let converter = DocumentationNodeConverter(bundle: bundle, context: context)

let node = try context.entity(with: ResolvedTopicReference(bundleID: bundle.id, path: "/documentation/MyModule/MyClass/myFunc()", sourceLanguage: .swift))
let renderNode = converter.convert(node)

let summaries = node.externallyLinkableElementSummaries(context: context, renderNode: renderNode)
let pageSummary = summaries[0]

let taskGroups = try XCTUnwrap(pageSummary.taskGroups)

guard taskGroups.count == 2 else {
XCTFail("Expected 2 task groups, found \(taskGroups.count): \(taskGroups.map(\.title))")
return
}

XCTAssertEqual(taskGroups[0].title, "Other Cool Symbols")
XCTAssertEqual(taskGroups[0].identifiers, [
"doc://com.example.mymodule/documentation/MyModule/MyStruct"
])

XCTAssertEqual(taskGroups[1].title, "Overloads")
XCTAssertEqual(Set(taskGroups[1].identifiers), [
"doc://com.example.mymodule/documentation/MyModule/MyClass/myFunc()-9a7pr",
"doc://com.example.mymodule/documentation/MyModule/MyClass/myFunc()-9a7po",
])
}
}
Loading