in Sources/SwiftDocC/Model/DocumentationNode.swift [161:285]
init(reference: ResolvedTopicReference, unifiedSymbol: UnifiedSymbolGraph.Symbol, platformName: String?, moduleName: String, bystanderModules: [String]? = nil) {
self.reference = reference
guard reference.sourceLanguage == .swift || FeatureFlags.current.isExperimentalObjectiveCSupportEnabled else {
fatalError("""
Only Swift symbols are currently supported. \
This initializer is only called with symbols from the symbol graph, which currently only supports Swift.
"""
)
}
guard let defaultSymbol = unifiedSymbol.defaultSymbol else {
fatalError("Unexpectedly failed to get 'defaultSymbol' from 'unifiedSymbol'.")
}
self.kind = Self.kind(for: defaultSymbol)
self.sourceLanguage = reference.sourceLanguage
self.name = .symbol(declaration: .init([.plain(defaultSymbol.names.title)]))
self.symbol = defaultSymbol
self.unifiedSymbol = unifiedSymbol
self.markup = Document()
self.docChunks = []
self.tags = (returns: [], throws: [], parameters: [])
let symbolAvailabilityVariants = DocumentationDataVariants(
symbolData: unifiedSymbol.mixins,
platformName: platformName
) { mixins in
mixins[SymbolGraph.Symbol.Availability.mixinKey] as? SymbolGraph.Symbol.Availability
}
var languages = Set([reference.sourceLanguage])
var operatingSystemName = platformName.map({ Set([$0]) }) ?? []
for (_, symbolAvailability) in symbolAvailabilityVariants.allValues {
let (sourceLanguages, otherDomains) = symbolAvailability.availability
.compactMap({ $0.domain?.rawValue })
.categorize(where: SourceLanguage.init(knownLanguageName:))
languages.formUnion(sourceLanguages)
operatingSystemName.formUnion(otherDomains)
}
self.platformNames = Set(
operatingSystemName.map { name in
PlatformName(operatingSystemName: name).rawValue
}
)
self.availableSourceLanguages = reference.sourceLanguages
let extendedModuleVariants = DocumentationDataVariants(
symbolData: unifiedSymbol.mixins,
platformName: platformName
) { mixins in
return mixins.getValueIfPresent(
for: SymbolGraph.Symbol.Swift.Extension.self
)?.extendedModule
}
let semanticSymbol = Symbol(
kindVariants: DocumentationDataVariants(
symbolData: unifiedSymbol.kind,
platformName: platformName
),
titleVariants: DocumentationDataVariants(
symbolData: unifiedSymbol.names,
platformName: platformName,
keyPath: \.title
),
subHeadingVariants: DocumentationDataVariants(
symbolData: unifiedSymbol.names,
platformName: platformName,
keyPath: \.subHeading
),
navigatorVariants: DocumentationDataVariants(
symbolData: unifiedSymbol.names,
platformName: platformName,
keyPath: \.navigator
),
roleHeadingVariants: DocumentationDataVariants(
symbolData: unifiedSymbol.kind,
platformName: platformName,
keyPath: \.displayName
),
platformNameVariants: DocumentationDataVariants(
defaultVariantValue: platformName.map(PlatformName.init(operatingSystemName:))
),
moduleNameVariants: DocumentationDataVariants(defaultVariantValue: moduleName),
extendedModuleVariants: extendedModuleVariants,
externalIDVariants: DocumentationDataVariants(defaultVariantValue: unifiedSymbol.uniqueIdentifier),
accessLevelVariants: DocumentationDataVariants(
symbolData: unifiedSymbol.accessLevel,
platformName: platformName,
keyPath: \.rawValue
),
availabilityVariants: symbolAvailabilityVariants,
deprecatedSummaryVariants: .empty,
mixinsVariants: DocumentationDataVariants(
symbolData: unifiedSymbol.mixins,
platformName: platformName
),
relationshipsVariants: DocumentationDataVariants(
defaultVariantValue: RelationshipsSection()
),
abstractSectionVariants: DocumentationDataVariants(
defaultVariantValue: AbstractSection(
paragraph: .init([Text("Placeholder Abstract")])
)
),
discussionVariants: .empty,
topicsVariants: .empty,
seeAlsoVariants: .empty,
returnsSectionVariants: .empty,
parametersSectionVariants: .empty,
redirectsVariants: .empty,
bystanderModuleNamesVariants: DocumentationDataVariants(
defaultVariantValue: bystanderModules
)
)
try! semanticSymbol.mergeDeclarations(unifiedSymbol: unifiedSymbol)
self.semantic = semanticSymbol
}