Skip to content

Commit 3dab3b9

Browse files
committed
Enable external link support by default
1 parent 8bc4631 commit 3dab3b9

File tree

11 files changed

+59
-28
lines changed

11 files changed

+59
-28
lines changed

Sources/SwiftDocC/Infrastructure/ConvertActionConverter.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ package enum ConvertActionConverter {
147147
linkSummaries.append(contentsOf: nodeLinkSummaries)
148148
indexingRecords.append(contentsOf: nodeIndexingRecords)
149149
}
150-
} else if FeatureFlags.current.isExperimentalLinkHierarchySerializationEnabled {
150+
} else if FeatureFlags.current.isLinkHierarchySerializationEnabled {
151151
let nodeLinkSummaries = entity.externallyLinkableElementSummaries(context: context, renderNode: renderNode, includeTaskGroups: false)
152152

153153
resultsGroup.async(queue: resultsSyncQueue) {
@@ -180,7 +180,7 @@ package enum ConvertActionConverter {
180180
}
181181
}
182182

183-
if FeatureFlags.current.isExperimentalLinkHierarchySerializationEnabled {
183+
if FeatureFlags.current.isLinkHierarchySerializationEnabled {
184184
signposter.withIntervalSignpost("Serialize link hierarchy", id: signposter.makeSignpostID()) {
185185
do {
186186
let serializableLinkInformation = try context.linkResolver.localResolver.prepareForSerialization(bundleID: bundle.id)

Sources/SwiftDocC/Infrastructure/Link Resolution/PathHierarchy+Find.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ extension PathHierarchy {
113113
}
114114
let topLevelNames = Set(modules.map(\.name) + (onlyFindSymbols ? [] : [articlesContainer.name, tutorialContainer.name]))
115115

116-
if isAbsolute, FeatureFlags.current.isExperimentalLinkHierarchySerializationEnabled {
116+
if isAbsolute, FeatureFlags.current.isLinkHierarchySerializationEnabled {
117117
throw Error.moduleNotFound(
118118
pathPrefix: pathForError(of: rawPath, droppingLast: remaining.count),
119119
remaining: Array(remaining),

Sources/SwiftDocC/Utility/FeatureFlags.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,14 @@ public struct FeatureFlags: Codable {
1717
/// Whether or not experimental support for device frames on images and video is enabled.
1818
public var isExperimentalDeviceFrameSupportEnabled = false
1919

20-
/// Whether or not experimental support for emitting a serialized version of the local link resolution information is enabled.
21-
public var isExperimentalLinkHierarchySerializationEnabled = false
20+
/// Whether or not support for emitting a serialized version of the local link resolution information is enabled.
21+
public var isLinkHierarchySerializationEnabled = true
22+
23+
@available(*, deprecated, renamed: "isLinkHierarchySerializationEnabled", message: "Use 'isLinkHierarchySerializationEnabled' instead. This deprecated API will be removed after 6.2 is released")
24+
public var isExperimentalLinkHierarchySerializationEnabled: Bool {
25+
get { isLinkHierarchySerializationEnabled }
26+
set { isLinkHierarchySerializationEnabled = newValue }
27+
}
2228

2329
/// Whether or not experimental support for combining overloaded symbol pages is enabled.
2430
public var isExperimentalOverloadedSymbolPresentationEnabled = false

Sources/SwiftDocCUtilities/ArgumentParsing/ActionExtensions/ConvertAction+CommandInitialization.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ extension ConvertAction {
2121
let outOfProcessResolver: OutOfProcessReferenceResolver?
2222

2323
FeatureFlags.current.isExperimentalDeviceFrameSupportEnabled = convert.enableExperimentalDeviceFrameSupport
24-
FeatureFlags.current.isExperimentalLinkHierarchySerializationEnabled = convert.enableExperimentalLinkHierarchySerialization
24+
FeatureFlags.current.isLinkHierarchySerializationEnabled = convert.enableLinkHierarchySerialization
2525
FeatureFlags.current.isExperimentalOverloadedSymbolPresentationEnabled = convert.enableExperimentalOverloadedSymbolPresentation
2626
FeatureFlags.current.isExperimentalMentionedInEnabled = convert.enableExperimentalMentionedIn
2727
FeatureFlags.current.isParametersAndReturnsValidationEnabled = convert.enableParametersAndReturnsValidation

Sources/SwiftDocCUtilities/ArgumentParsing/Subcommands/Convert.swift

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -486,13 +486,19 @@ extension Docc {
486486
var allowArbitraryCatalogDirectories = false
487487

488488
@Flag(
489-
name: .customLong("enable-experimental-external-link-support"),
489+
name: .customLong("external-link-support"),
490+
inversion: .prefixedEnableDisable,
490491
help: ArgumentHelp("Support external links to this documentation output.", discussion: """
491492
Write additional link metadata files to the output directory to support resolving documentation links to the documentation in that output directory.
492493
""")
493494
)
495+
var enableLinkHierarchySerialization = true
496+
497+
// This flag only exist to allow developers to pass the previous '--enable-experimental-...' flag without errors.
498+
@Flag(name: .customLong("enable-experimental-external-link-support"), help: .hidden)
499+
@available(*, deprecated, message: "This deprecated API will be removed after 6.2 is released")
494500
var enableExperimentalLinkHierarchySerialization = false
495-
501+
496502
@Flag(help: .hidden)
497503
var experimentalModifyCatalogWithGeneratedCuration = false
498504

@@ -536,6 +542,7 @@ extension Docc {
536542
Convert.warnAboutDeprecatedOptionIfNeeded("enable-experimental-json-index", message: "This flag has no effect. The JSON render is emitted by default.")
537543
Convert.warnAboutDeprecatedOptionIfNeeded("experimental-parse-doxygen-commands", message: "This flag has no effect. Doxygen support is enabled by default.")
538544
Convert.warnAboutDeprecatedOptionIfNeeded("enable-experimental-parameters-and-returns-validation", message: "This flag has no effect. Parameter and return value validation is enabled by default.")
545+
Convert.warnAboutDeprecatedOptionIfNeeded("enable-experimental-external-link-support", message: "This flag has no effect. External link support is enabled by default.")
539546
Convert.warnAboutDeprecatedOptionIfNeeded("index", message: "Use '--emit-lmdb-index' indead.")
540547
emitLMDBIndex = emitLMDBIndex
541548
}
@@ -575,9 +582,15 @@ extension Docc {
575582
}
576583

577584
/// A user-provided value that is true if the user enables experimental serialization of the local link resolution information.
585+
public var enableLinkHierarchySerialization: Bool {
586+
get { featureFlags.enableLinkHierarchySerialization }
587+
set { featureFlags.enableLinkHierarchySerialization = newValue }
588+
}
589+
590+
@available(*, deprecated, renamed: "enableLinkHierarchySerialization", message: "Use 'enableLinkHierarchySerialization' instead. This deprecated API will be removed after 6.2 is released")
578591
public var enableExperimentalLinkHierarchySerialization: Bool {
579-
get { featureFlags.enableExperimentalLinkHierarchySerialization }
580-
set { featureFlags.enableExperimentalLinkHierarchySerialization = newValue }
592+
get { enableLinkHierarchySerialization }
593+
set { enableLinkHierarchySerialization = newValue }
581594
}
582595

583596
/// A user-provided value that is true if the user wants to in-place modify the provided documentation catalog to write generated curation to documentation extension files.

Tests/SwiftDocCTests/Infrastructure/DocumentationContext/DocumentationContextTests.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5261,8 +5261,6 @@ let expected = """
52615261
}
52625262

52635263
func testResolveExternalLinkFromTechnologyRoot() throws {
5264-
enableFeatureFlag(\.isExperimentalLinkHierarchySerializationEnabled)
5265-
52665264
let externalModuleName = "ExternalModuleName"
52675265

52685266
func makeExternalDependencyFiles() throws -> (SerializableLinkResolutionInformation, [LinkDestinationSummary]) {

Tests/SwiftDocCTests/Infrastructure/ExternalPathHierarchyResolverTests.swift

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,6 @@ import SwiftDocCTestUtilities
1616

1717
class ExternalPathHierarchyResolverTests: XCTestCase {
1818

19-
override func setUp() {
20-
super.setUp()
21-
enableFeatureFlag(\.isExperimentalLinkHierarchySerializationEnabled)
22-
}
23-
2419
// These tests resolve absolute symbol links in both a local and external context to verify that external links work the same local links.
2520

2621
func testUnambiguousAbsolutePaths() throws {

Tests/SwiftDocCTests/Infrastructure/PathHierarchyTests.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -287,8 +287,6 @@ class PathHierarchyTests: XCTestCase {
287287
}
288288

289289
func testAmbiguousPaths() throws {
290-
enableFeatureFlag(\.isExperimentalLinkHierarchySerializationEnabled)
291-
292290
let (_, context) = try testBundleAndContext(named: "MixedLanguageFrameworkWithLanguageRefinements")
293291
let tree = context.linkResolver.localResolver.pathHierarchy
294292

@@ -3559,8 +3557,6 @@ class PathHierarchyTests: XCTestCase {
35593557
}
35603558

35613559
func testResolveExternalLinkFromTechnologyRoot() throws {
3562-
enableFeatureFlag(\.isExperimentalLinkHierarchySerializationEnabled)
3563-
35643560
let catalog = Folder(name: "unit-test.docc", content: [
35653561
TextFile(name: "Root.md", utf8Content: """
35663562
# Some root page

Tests/SwiftDocCUtilitiesTests/ArgumentParsing/ConvertSubcommandTests.swift

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -367,16 +367,16 @@ class ConvertSubcommandTests: XCTestCase {
367367

368368
let commandWithoutFlag = try Docc.Convert.parse([testBundleURL.path])
369369
_ = try ConvertAction(fromConvertCommand: commandWithoutFlag)
370-
XCTAssertFalse(commandWithoutFlag.enableExperimentalLinkHierarchySerialization)
371-
XCTAssertFalse(FeatureFlags.current.isExperimentalLinkHierarchySerializationEnabled)
370+
XCTAssertTrue(commandWithoutFlag.enableLinkHierarchySerialization)
371+
XCTAssertTrue(FeatureFlags.current.isLinkHierarchySerializationEnabled)
372372

373373
let commandWithFlag = try Docc.Convert.parse([
374-
"--enable-experimental-external-link-support",
374+
"--disable-external-link-support",
375375
testBundleURL.path,
376376
])
377377
_ = try ConvertAction(fromConvertCommand: commandWithFlag)
378-
XCTAssertTrue(commandWithFlag.enableExperimentalLinkHierarchySerialization)
379-
XCTAssertTrue(FeatureFlags.current.isExperimentalLinkHierarchySerializationEnabled)
378+
XCTAssertFalse(commandWithFlag.enableLinkHierarchySerialization)
379+
XCTAssertFalse(FeatureFlags.current.isLinkHierarchySerializationEnabled)
380380
}
381381

382382
func testExperimentalEnableOverloadedSymbolPresentation() throws {
@@ -578,6 +578,24 @@ class ConvertSubcommandTests: XCTestCase {
578578
let disabledFlagConvert = try Docc.Convert.parse(["--disable-parameters-and-returns-validation"])
579579
XCTAssertEqual(disabledFlagConvert.enableParametersAndReturnsValidation, false)
580580
}
581+
582+
func testExternalLinkSupportFlag() throws {
583+
// The feature is enabled when no flag is passed.
584+
let noFlagConvert = try Docc.Convert.parse([])
585+
XCTAssertEqual(noFlagConvert.enableLinkHierarchySerialization, true)
586+
587+
// It's allowed to pass the previous "--enable-experimental-..." flag.
588+
let oldFlagConvert = try Docc.Convert.parse(["--enable-experimental-external-link-support"])
589+
XCTAssertEqual(oldFlagConvert.enableLinkHierarchySerialization, true)
590+
591+
// It's allowed to pass the redundant "--enable-..." flag.
592+
let enabledFlagConvert = try Docc.Convert.parse(["--enable-external-link-support"])
593+
XCTAssertEqual(enabledFlagConvert.enableLinkHierarchySerialization, true)
594+
595+
// Passing the "--disable-..." flag turns of the feature.
596+
let disabledFlagConvert = try Docc.Convert.parse(["--disable-external-link-support"])
597+
XCTAssertEqual(disabledFlagConvert.enableLinkHierarchySerialization, false)
598+
}
581599

582600
// This test calls ``ConvertOptions.infoPlistFallbacks._unusedVersionForBackwardsCompatibility`` which is deprecated.
583601
// Deprecating the test silences the deprecation warning when running the tests. It doesn't skip the test.

Tests/SwiftDocCUtilitiesTests/ConvertActionStaticHostableTests.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,11 @@ class ConvertActionStaticHostableTests: StaticHostingBaseTests {
4747
_ = try await action.perform(logHandle: .none)
4848

4949
// Test the content of the output folder.
50-
var expectedContent = ["data", "documentation", "tutorials", "downloads", "images", "metadata.json" ,"videos", "index.html", "index"]
50+
var expectedContent = [
51+
"data", "documentation", "tutorials", "downloads", "images", "videos",
52+
"index.html", "index",
53+
"metadata.json", "link-hierarchy.json", "linkable-entities.json"
54+
]
5155
expectedContent += templateFolder.content.filter { $0 is Folder }.map{ $0.name }
5256

5357
let output = try fileManager.contentsOfDirectory(atPath: targetBundleURL.path)

0 commit comments

Comments
 (0)