Skip to content

Commit 4ab8d62

Browse files
committed
draft implementation for eagarly inlining snippets
1 parent ae35641 commit 4ab8d62

22 files changed

+296
-141
lines changed

Package.resolved

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ let package:Package = .init(
9999
.package(url: "https://github.com/tayloraswift/swift-hash", .upToNextMinor(
100100
from: "0.5.0")),
101101
.package(url: "https://github.com/tayloraswift/swift-mongodb", .upToNextMinor(
102-
from: "0.12.0")),
102+
from: "0.12.1")),
103103
//.package(path: "../swift-mongodb"),
104104

105105
.package(url: "https://github.com/tayloraswift/swift-png", .upToNextMinor(
@@ -108,14 +108,17 @@ let package:Package = .init(
108108
.package(url: "https://github.com/apple/swift-atomics", .upToNextMinor(
109109
from: "1.2.0")),
110110

111+
.package(url: "https://github.com/apple/swift-collections.git", .upToNextMinor(
112+
from: "1.1.0")),
113+
111114
/// swift-nio has a low rate of breakage, and can be trusted with a major-only
112115
/// version requirement.
113116
.package(url: "https://github.com/apple/swift-nio",
114-
from: "2.62.0"),
117+
from: "2.63.0"),
115118
/// swift-nio-ssl has a low rate of breakage, and can be trusted with a
116119
/// major-only version requirement.
117120
.package(url: "https://github.com/apple/swift-nio-ssl",
118-
from: "2.25.0"),
121+
from: "2.26.0"),
119122

120123
.package(url: "https://github.com/apple/swift-nio-http2", .upToNextMinor(
121124
from: "1.29.0")),
@@ -127,7 +130,7 @@ let package:Package = .init(
127130
.package(url: "https://github.com/apple/swift-system", .upToNextMinor(
128131
from: "1.2.1")),
129132
.package(url: "https://github.com/apple/swift-syntax",
130-
exact: "509.0.2"),
133+
exact: "509.1.1"),
131134
],
132135
targets:
133136
[
@@ -332,7 +335,10 @@ let package:Package = .init(
332335
.target(name: "Codelinks"),
333336
.target(name: "MarkdownAST"),
334337
.target(name: "Sources"),
338+
.target(name: "Snippets"),
335339
.target(name: "UnidocDiagnostics"),
340+
341+
.product(name: "OrderedCollections", package: "swift-collections"),
336342
]),
337343

338344
.target(name: "MD5", dependencies:

Sources/MarkdownABI/Bytecode/Markdown.BinaryEncoder.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ extension Markdown.BinaryEncoder
3030
}
3131
extension Markdown.BinaryEncoder
3232
{
33+
@inlinable public static
34+
func += (self:inout Self, bytecode:Markdown.Bytecode)
35+
{
36+
self.bytecode.bytes += bytecode.bytes
37+
}
38+
3339
@inlinable public static
3440
func += (self:inout Self, codepoint:Unicode.Scalar)
3541
{

Sources/MarkdownPluginSwift/Markdown.SwiftLanguage.swift

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,15 @@ extension Markdown.SwiftLanguage:Markdown.CodeLanguageType
2626
extension Markdown.SwiftLanguage
2727
{
2828
public
29-
func parse(snippet utf8:[UInt8]) -> (overview:String, slices:[Snippet.Slice])
29+
func parse(snippet utf8:[UInt8]) -> (overview:String, slices:[Markdown.SnippetSlice])
3030
{
3131
// It is safe to escape the pointer to ``Parser.parse(source:maximumNestingLevel:)``,
3232
// see: https://swiftinit.org/docs/swift-syntax/swiftparser/parser.init(_:maximumnestinglevel:parsetransition:arena:)
3333
let parsed:SourceFileSyntax = utf8.withUnsafeBufferPointer
3434
{
3535
Parser.parse(source: $0)
3636
}
37+
3738
var start:AbsolutePosition = parsed.position
3839
var text:String = ""
3940
lines:
@@ -78,7 +79,8 @@ extension Markdown.SwiftLanguage
7879
text.append("\n")
7980
}
8081

81-
var parser:SnippetParser = .init(start: start)
82+
var parser:SnippetParser = .init(sourcemap: .init(fileName: "", tree: parsed),
83+
start: start)
8284
for token:TokenSyntax in parsed.tokens(viewMode: .sourceAccurate)
8385
{
8486
parser.visit(token: token)
@@ -89,7 +91,7 @@ extension Markdown.SwiftLanguage
8991
var spans:SyntaxClassifications.Iterator = parsed.classifications.makeIterator()
9092
var span:SyntaxClassifiedRange? = spans.next()
9193

92-
let rendered:[Snippet.Slice] = slices.map
94+
let rendered:[Markdown.SnippetSlice] = slices.map
9395
{
9496
(slice:SnippetParser.Slice) in
9597

@@ -133,7 +135,7 @@ extension Markdown.SwiftLanguage
133135
}
134136
}
135137

136-
return .init(id: slice.id, bytecode: bytecode)
138+
return .init(id: slice.id, line: slice.line, code: bytecode)
137139
}
138140

139141
return (text, rendered)

Sources/MarkdownPluginSwift/Snippets/SnippetParser.Slice.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@ extension SnippetParser
88
struct Slice
99
{
1010
let id:String
11+
let line:Int
1112
var ranges:[Range<Int>]
1213

13-
init(id:String, ranges:[Range<Int>])
14+
init(id:String, line:Int, ranges:[Range<Int>])
1415
{
1516
self.id = id
17+
self.line = line
1618
self.ranges = ranges
1719
}
1820
}

Sources/MarkdownPluginSwift/Snippets/SnippetParser.SliceBounds.swift

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ extension SnippetParser
77
struct SliceBounds
88
{
99
let id:String
10-
var indent:Int
10+
var marker:(line:Int, indent:Int)
1111
var ranges:[Range<AbsolutePosition>]
1212

13-
init(id:String, indent:Int)
13+
init(id:String, marker:(line:Int, indent:Int))
1414
{
1515
self.id = id
16-
self.indent = indent
16+
self.marker = marker
1717
self.ranges = []
1818
}
1919
}
@@ -47,7 +47,7 @@ extension SnippetParser.SliceBounds
4747
}
4848

4949
// Compute maximum removable indentation.
50-
var indent:Int = self.indent
50+
var indent:Int = self.marker.indent
5151
for range:Range<Int> in ranges
5252
{
5353
/// We initialize this to 0 and not nil because we assume the range starts at the
@@ -83,12 +83,12 @@ extension SnippetParser.SliceBounds
8383
}
8484

8585

86-
if self.indent == 0
86+
if self.marker.indent == 0
8787
{
88-
return .init(id: self.id, ranges: ranges)
88+
return .init(id: self.id, line: self.marker.line, ranges: ranges)
8989
}
9090

91-
var slice:SnippetParser.Slice = .init(id: self.id, ranges: [])
91+
var slice:SnippetParser.Slice = .init(id: self.id, line: self.marker.line, ranges: [])
9292
slice.ranges.reserveCapacity(ranges.count)
9393

9494
for range:Range<Int> in ranges
@@ -112,7 +112,7 @@ extension SnippetParser.SliceBounds
112112
continue
113113

114114
case (_, let i?):
115-
slice.punch(hole: (i ..< j).prefix(self.indent))
115+
slice.punch(hole: (i ..< j).prefix(self.marker.indent))
116116
start = nil
117117

118118
case (_, nil):

Sources/MarkdownPluginSwift/Snippets/SnippetParser.SliceFetus.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ extension SnippetParser
1010
private
1111
var start:AbsolutePosition?
1212

13-
init(id:String, at position:AbsolutePosition, indent:Int = 0)
13+
init(id:String, position:AbsolutePosition, marker:(line:Int, indent:Int) = (1, 0))
1414
{
15-
self.slice = .init(id: id, indent: indent)
15+
self.slice = .init(id: id, marker: marker)
1616
self.start = position
1717
}
1818
}

Sources/MarkdownPluginSwift/Snippets/SnippetParser.SliceMarker.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@ extension SnippetParser
55
struct SliceMarker
66
{
77
let statement:Statement
8-
/// The number of leading spaces before the control comment.
8+
/// The number of leading spaces before the slice marker.
99
let indent:Int
10-
/// The UTF-8 offset of the (first) newline before the control comment, or the beginning
10+
/// The UTF-8 offset of the (first) newline before the slice marker, or the beginning
1111
/// of the file if the control comment is at the beginning of the file.
1212
let before:AbsolutePosition
13-
/// The UTF-8 offset of the newline after the control comment, assuming it exists.
13+
/// The UTF-8 offset of the newline after the slice marker, assuming it exists.
1414
let after:AbsolutePosition
15+
/// The line number (1-indexed) of the slice marker.
16+
let line:Int
1517
}
1618
}

Sources/MarkdownPluginSwift/Snippets/SnippetParser.swift

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,18 @@ import SwiftSyntax
22

33
struct SnippetParser
44
{
5+
private
6+
let sourcemap:SourceLocationConverter
7+
58
var complete:[SliceBounds]
69
var current:SliceFetus?
710

8-
init(start position:AbsolutePosition)
11+
init(sourcemap:SourceLocationConverter, start position:AbsolutePosition)
912
{
13+
self.sourcemap = sourcemap
14+
1015
self.complete = []
11-
self.current = .init(id: "", at: position)
16+
self.current = .init(id: "", position: position)
1217
}
1318
}
1419
extension SnippetParser
@@ -74,6 +79,7 @@ extension SnippetParser
7479

7580
if let statement:SliceMarker.Statement = .init(lineComment: line, skip: skip)
7681
{
82+
let location:SourceLocation = self.sourcemap.location(for: current)
7783
// We know that line comments always extend to the end of the line.
7884
// Therefore, `range.upperBound` “always” points to a newline, and the start of
7985
// the next line is one after the index after the end of the comment.
@@ -84,7 +90,8 @@ extension SnippetParser
8490
self.push(marker: .init(statement: statement,
8591
indent: leading.indent,
8692
before: leading.position,
87-
after: range.upperBound.advanced(by: 1)))
93+
after: range.upperBound.advanced(by: 1),
94+
line: location.line))
8895
}
8996
else
9097
{
@@ -138,7 +145,9 @@ extension SnippetParser
138145
self.complete.append(slice)
139146
}
140147

141-
self.current = .init(id: id, at: marker.after, indent: marker.indent)
148+
self.current = .init(id: id,
149+
position: marker.after,
150+
marker: (line: marker.line, indent: marker.indent))
142151
}
143152
}
144153
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
@_exported import enum MarkdownABI.Markdown

0 commit comments

Comments
 (0)