File: RangeAdjuster.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (52 lines) | stat: -rw-r--r-- 2,229 bytes parent folder | download
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.
    }
}