Skip to content

Commit 7530dfe

Browse files
don't automatically transfer the child elements' ranges to the parent (#202)
this commit also adds methods to BasicBlockContainer and BasicInlineContainer that inherits the new element's source range from its children rdar://136218537
1 parent 2829eef commit 7530dfe

File tree

13 files changed

+147
-21
lines changed

13 files changed

+147
-21
lines changed

Sources/Markdown/Base/Document.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,14 @@ public extension Document {
6565
}
6666

6767
/// Create a document from a sequence of block markup elements.
68-
init<Children: Sequence>(_ children: Children) where Children.Element == BlockMarkup {
69-
try! self.init(.document(parsedRange: nil, children.map { $0.raw.markup }))
68+
init(_ children: some Sequence<BlockMarkup>) {
69+
self.init(children, inheritSourceRange: false)
70+
}
71+
72+
init(_ children: some Sequence<BlockMarkup>, inheritSourceRange: Bool) {
73+
let rawChildren = children.map { $0.raw.markup }
74+
let parsedRange = inheritSourceRange ? rawChildren.parsedRange : nil
75+
try! self.init(.document(parsedRange: parsedRange, rawChildren))
7076
}
7177

7278
// MARK: Visitation

Sources/Markdown/Base/RawMarkup.swift

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
This source file is part of the Swift.org open source project
33

4-
Copyright (c) 2021 Apple Inc. and the Swift project authors
4+
Copyright (c) 2021-2024 Apple Inc. and the Swift project authors
55
Licensed under Apache License v2.0 with Runtime Library Exception
66

77
See https://swift.org/LICENSE.txt for license information
@@ -196,7 +196,7 @@ final class RawMarkup: ManagedBuffer<RawMarkupHeader, RawMarkup> {
196196

197197
let parsedRange: SourceRange?
198198
if preserveRange {
199-
parsedRange = header.parsedRange ?? newChild.header.parsedRange
199+
parsedRange = header.parsedRange
200200
} else {
201201
parsedRange = newChild.header.parsedRange
202202
}
@@ -366,3 +366,13 @@ fileprivate extension Sequence where Element == RawMarkup {
366366
return self.lazy.map { $0.subtreeCount }.reduce(0, +)
367367
}
368368
}
369+
370+
extension BidirectionalCollection where Element == RawMarkup {
371+
var parsedRange: SourceRange? {
372+
if let lowerBound = first?.parsedRange?.lowerBound, let upperBound = last?.parsedRange?.upperBound {
373+
return lowerBound..<upperBound
374+
} else {
375+
return nil
376+
}
377+
}
378+
}

Sources/Markdown/Block Nodes/Block Container Blocks/BlockQuote.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,14 @@ public struct BlockQuote: BlockMarkup, BasicBlockContainer {
2929
public extension BlockQuote {
3030
// MARK: BasicBlockContainer
3131

32-
init<Children: Sequence>(_ children: Children) where Children.Element == BlockMarkup {
33-
try! self.init(.blockQuote(parsedRange: nil, children.map { $0.raw.markup }))
32+
init(_ children: some Sequence<BlockMarkup>) {
33+
self.init(children, inheritSourceRange: false)
34+
}
35+
36+
init(_ children: some Sequence<BlockMarkup>, inheritSourceRange: Bool) {
37+
let rawChildren = children.map { $0.raw.markup }
38+
let parsedRange = inheritSourceRange ? rawChildren.parsedRange : nil
39+
try! self.init(.blockQuote(parsedRange: parsedRange, rawChildren))
3440
}
3541

3642
// MARK: Visitation

Sources/Markdown/Block Nodes/Block Container Blocks/CustomBlock.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,14 @@ public struct CustomBlock: BlockMarkup, BasicBlockContainer {
2929
// MARK: - Public API
3030

3131
public extension CustomBlock {
32-
init<Children: Sequence>(_ children: Children) where Children.Element == BlockMarkup {
33-
try! self.init(.customBlock(parsedRange: nil, children.map { $0.raw.markup }))
32+
init(_ children: some Sequence<BlockMarkup>) {
33+
self.init(children, inheritSourceRange: false)
34+
}
35+
36+
init(_ children: some Sequence<BlockMarkup>, inheritSourceRange: Bool) {
37+
let rawChildren = children.map { $0.raw.markup }
38+
let parsedRange = inheritSourceRange ? rawChildren.parsedRange : nil
39+
try! self.init(.customBlock(parsedRange: parsedRange, rawChildren))
3440
}
3541

3642
// MARK: Visitation

Sources/Markdown/Block Nodes/Inline Container Blocks/Paragraph.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,14 @@ public struct Paragraph: BlockMarkup, BasicInlineContainer {
2929
public extension Paragraph {
3030
// MARK: InlineContainer
3131

32-
init<Children: Sequence>(_ newChildren: Children) where Children.Element == InlineMarkup {
33-
try! self.init(.paragraph(parsedRange: nil, newChildren.map { $0.raw.markup }))
32+
init(_ newChildren: some Sequence<InlineMarkup>) {
33+
self.init(newChildren, inheritSourceRange: false)
34+
}
35+
36+
init(_ newChildren: some Sequence<InlineMarkup>, inheritSourceRange: Bool) {
37+
let rawChildren = newChildren.map { $0.raw.markup }
38+
let parsedRange = inheritSourceRange ? rawChildren.parsedRange : nil
39+
try! self.init(.paragraph(parsedRange: parsedRange, rawChildren))
3440
}
3541

3642
// MARK: Visitation

Sources/Markdown/Block Nodes/Tables/TableCell.swift

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,22 @@ public extension Table.Cell {
6666

6767
// MARK: BasicInlineContainer
6868

69-
init<Children>(_ children: Children) where Children : Sequence, Children.Element == InlineMarkup {
69+
init(_ children: some Sequence<InlineMarkup>) {
7070
self.init(colspan: 1, rowspan: 1, children)
7171
}
7272

73-
init<Children>(colspan: UInt, rowspan: UInt, _ children: Children) where Children : Sequence, Children.Element == InlineMarkup {
74-
try! self.init(RawMarkup.tableCell(parsedRange: nil, colspan: colspan, rowspan: rowspan, children.map { $0.raw.markup }))
73+
init(_ children: some Sequence<InlineMarkup>, inheritSourceRange: Bool) {
74+
self.init(colspan: 1, rowspan: 1, children, inheritSourceRange: inheritSourceRange)
75+
}
76+
77+
init(colspan: UInt, rowspan: UInt, _ children: some Sequence<InlineMarkup>) {
78+
self.init(colspan: colspan, rowspan: rowspan, children, inheritSourceRange: false)
79+
}
80+
81+
init(colspan: UInt, rowspan: UInt, _ children: some Sequence<InlineMarkup>, inheritSourceRange: Bool) {
82+
let rawChildren = children.map { $0.raw.markup }
83+
let parsedRange = inheritSourceRange ? rawChildren.parsedRange : nil
84+
try! self.init(.tableCell(parsedRange: parsedRange, colspan: colspan, rowspan: rowspan, rawChildren))
7585
}
7686

7787
// MARK: Visitation

Sources/Markdown/Inline Nodes/Inline Containers/Emphasis.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,14 @@ public struct Emphasis: RecurringInlineMarkup, BasicInlineContainer {
2929
public extension Emphasis {
3030
// MARK: BasicInlineContainer
3131

32-
init<Children>(_ newChildren: Children) where Children : Sequence, Children.Element == InlineMarkup {
33-
try! self.init(RawMarkup.emphasis(parsedRange: nil, newChildren.map { $0.raw.markup }))
32+
init(_ newChildren: some Sequence<InlineMarkup>) {
33+
self.init(newChildren, inheritSourceRange: false)
34+
}
35+
36+
init(_ newChildren: some Sequence<InlineMarkup>, inheritSourceRange: Bool) {
37+
let rawChildren = newChildren.map { $0.raw.markup }
38+
let parsedRange = inheritSourceRange ? rawChildren.parsedRange : nil
39+
try! self.init(.emphasis(parsedRange: parsedRange, rawChildren))
3440
}
3541

3642
// MARK: PlainTextConvertibleMarkup

Sources/Markdown/Inline Nodes/Inline Containers/Strikethrough.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,14 @@ public struct Strikethrough: RecurringInlineMarkup, BasicInlineContainer {
2828
public extension Strikethrough {
2929
// MARK: BasicInlineContainer
3030

31-
init<Children>(_ newChildren: Children) where Children : Sequence, Children.Element == InlineMarkup {
32-
try! self.init(.strikethrough(parsedRange: nil, newChildren.map { $0.raw.markup }))
31+
init(_ newChildren: some Sequence<InlineMarkup>) {
32+
self.init(newChildren, inheritSourceRange: false)
33+
}
34+
35+
init(_ newChildren: some Sequence<InlineMarkup>, inheritSourceRange: Bool) {
36+
let rawChildren = newChildren.map { $0.raw.markup }
37+
let parsedRange = inheritSourceRange ? rawChildren.parsedRange : nil
38+
try! self.init(.strikethrough(parsedRange: parsedRange, rawChildren))
3339
}
3440

3541
// MARK: PlainTextConvertibleMarkup

Sources/Markdown/Inline Nodes/Inline Containers/Strong.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,14 @@ public struct Strong: RecurringInlineMarkup, BasicInlineContainer {
2828
public extension Strong {
2929
// MARK: BasicInlineContainer
3030

31-
init<Children>(_ newChildren: Children) where Children : Sequence, Children.Element == InlineMarkup {
32-
try! self.init(.strong(parsedRange: nil, newChildren.map { $0.raw.markup }))
31+
init(_ newChildren: some Sequence<InlineMarkup>) {
32+
self.init(newChildren, inheritSourceRange: false)
33+
}
34+
35+
init(_ newChildren: some Sequence<InlineMarkup>, inheritSourceRange: Bool) {
36+
let rawChildren = newChildren.map { $0.raw.markup }
37+
let parsedRange = inheritSourceRange ? rawChildren.parsedRange : nil
38+
try! self.init(.strong(parsedRange: parsedRange, rawChildren))
3339
}
3440

3541
// MARK: PlainTextConvertibleMarkup

Sources/Markdown/Structural Restrictions/BasicBlockContainer.swift

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@
1111
/// A block element that can contain only other block elements and doesn't require any other information.
1212
public protocol BasicBlockContainer: BlockContainer {
1313
/// Create this element from a sequence of block markup elements.
14-
init<Children: Sequence>(_ children: Children) where Children.Element == BlockMarkup
14+
init(_ children: some Sequence<BlockMarkup>)
15+
16+
/// Create this element from a sequence of block markup elements, and optionally inherit the source range from those elements.
17+
init(_ children: some Sequence<BlockMarkup>, inheritSourceRange: Bool)
1518
}
1619

1720
// MARK: - Public API
@@ -21,4 +24,14 @@ extension BasicBlockContainer {
2124
public init(_ children: BlockMarkup...) {
2225
self.init(children)
2326
}
27+
28+
/// Create this element with a sequence of block markup elements, and optionally inherit the source range from those elements.
29+
public init(_ children: BlockMarkup..., inheritSourceRange: Bool) {
30+
self.init(children, inheritSourceRange: inheritSourceRange)
31+
}
32+
33+
/// Default implementation of `init(_:inheritSourceRange:)` that discards the `inheritSourceRange` parameter.
34+
public init(_ children: some Sequence<BlockMarkup>, inheritSourceRange: Bool) {
35+
self.init(children)
36+
}
2437
}

0 commit comments

Comments
 (0)