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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2023 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 the list of Swift project authors
//
//===----------------------------------------------------------------------===//
#if swift(>=6)
@_spi(RawSyntax) internal import SwiftSyntax
#else
@_spi(RawSyntax) import SwiftSyntax
#endif
// MARK: - Unexpected nodes
extension RawUnexpectedNodesSyntax {
/// Returns `true` if this contains a token that satisfies `condition`.
func containsToken(where condition: (RawTokenSyntax) -> Bool) -> Bool {
return self.elements.contains(where: { node in
if let token = node.as(RawTokenSyntax.self) {
return condition(token)
} else {
return false
}
})
}
/// If `nodes` is not empty, construct a ``RawUnexpectedNodesSyntax``
/// containing those tokens, otherwise return `nil`.
init?<SyntaxType: RawSyntaxNodeProtocol>(_ nodes: [SyntaxType], arena: __shared SyntaxArena) {
if nodes.isEmpty {
return nil
} else {
self.init(elements: nodes.map(RawSyntax.init), arena: arena)
}
}
/// If `nodes` contains non-`nil` values, construct a ``RawUnexpectedNodesSyntax``
/// containing those tokens, otherwise return `nil`.
init?<SyntaxType: RawSyntaxNodeProtocol>(_ nodes: [SyntaxType?], arena: __shared SyntaxArena) {
self.init(nodes.compactMap({ $0 }), arena: arena)
}
}
// MARK: Combining unexpected nodes
/// Implementation detail of `RawUnexpectedNodesSyntax.init(combining:arena)`.
protocol UnexpectedNodesCombinable {
var elements: [RawSyntax] { get }
}
extension Array: UnexpectedNodesCombinable where Element: UnexpectedNodesCombinable {
var elements: [RawSyntax] { self.flatMap { $0.elements } }
}
extension Optional: UnexpectedNodesCombinable where Wrapped: UnexpectedNodesCombinable {
var elements: [RawSyntax] {
if let self {
return self.elements
} else {
return []
}
}
}
extension RawTokenSyntax: UnexpectedNodesCombinable {
var elements: [RawSyntax] {
return [RawSyntax(self)]
}
}
extension RawUnexpectedNodesSyntax: UnexpectedNodesCombinable {}
extension RawUnexpectedNodesSyntax {
init?(
combining syntax1: some UnexpectedNodesCombinable,
_ syntax2: some UnexpectedNodesCombinable,
arena: __shared SyntaxArena
) {
self.init(syntax1.elements + syntax2.elements, arena: arena)
}
init?(
combining syntax1: some UnexpectedNodesCombinable,
_ syntax2: some UnexpectedNodesCombinable,
_ syntax3: some UnexpectedNodesCombinable,
arena: __shared SyntaxArena
) {
self.init(syntax1.elements + syntax2.elements + syntax3.elements, arena: arena)
}
init?(
combining syntax1: some UnexpectedNodesCombinable,
_ syntax2: some UnexpectedNodesCombinable,
_ syntax3: some UnexpectedNodesCombinable,
_ syntax4: some UnexpectedNodesCombinable,
arena: __shared SyntaxArena
) {
self.init(syntax1.elements + syntax2.elements + syntax3.elements + syntax4.elements, arena: arena)
}
}
// MARK: - Misc
extension SyntaxText {
var isEditorPlaceholder: Bool {
return self.starts(with: SyntaxText("<#")) && self.hasSuffix(SyntaxText("#>"))
}
var isStartingWithUppercase: Bool {
if !self.isEmpty, let firstCharacterByte = self.baseAddress?.pointee {
return 65 <= firstCharacterByte && firstCharacterByte <= 90
} else {
return false
}
}
}
extension RawTriviaPiece {
var isIndentationWhitespace: Bool {
switch self {
case .spaces, .tabs: return true
default: return false
}
}
}
|