1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
/*
This source file is part of the Swift.org open source project
Copyright (c) 2021 Apple Inc. and the Swift project authors
Licensed under Apache License v2.0 with Runtime Library Exception
See https://swift.org/LICENSE.txt for license information
See https://swift.org/CONTRIBUTORS.txt for Swift project authors
*/
/// A type for adjusting the columns of elements that are parsed in *line runs*
/// of the block directive parser to their locations before their indentation was trimmed.
struct RangeAdjuster: MarkupWalker {
/// The line number of the first line in the line run that needs adjustment.
var startLine: Int
/// The tracker that will collect the adjusted ranges.
var ranges: RangeTracker
/// An array of whitespace spans that were removed for each line, indexed
/// by line number. `nil` means that no whitespace was removed on that line.
var trimmedIndentationPerLine: [Int]
mutating func defaultVisit(_ markup: Markup) {
/// This should only be used in the parser where ranges are guaranteed
/// to be filled in from cmark.
let adjustedRange = markup.range.map { range -> SourceRange in
// Add back the offset to the column as if the indentation weren't stripped.
let start = SourceLocation(line: startLine + range.lowerBound.line - 1,
column: range.lowerBound.column + (trimmedIndentationPerLine[range.lowerBound.line - 1] ),
source: range.lowerBound.source)
let end = SourceLocation(line: startLine + range.upperBound.line - 1,
column: range.upperBound.column + (trimmedIndentationPerLine[range.upperBound.line - 1]),
source: range.upperBound.source)
return start..<end
}
ranges.add(adjustedRange)
// Warning! Unsafe stuff!
// Unsafe mutation of shared reference types.
// This should only ever be called during parsing.
markup.raw.markup.header.parsedRange = adjustedRange
for child in markup.children {
child.accept(&self)
}
// End unsafe stuff.
}
}
|