Files
Brandon Williams 6574de2396 Make our use of SwiftSyntax APIs more resilient to precompiled SwiftSyntax (#3694)
* Make our use of SwiftSyntax APIs more resilient to precompiled SwiftSyntax

* support 600 and 601"

* wip

* Make store isolation tests more resillient.
2025-05-27 11:52:20 -07:00

110 lines
2.6 KiB
Swift

//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 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
//
//===----------------------------------------------------------------------===//
import SwiftDiagnostics
import SwiftOperators
import SwiftSyntax
import SwiftSyntaxBuilder
import SwiftSyntaxMacros
extension AttributeSyntax {
var availability: AttributeSyntax? {
if attributeName.identifier == "available" {
return self
} else {
return nil
}
}
}
extension IfConfigClauseSyntax.Elements {
var availability: IfConfigClauseSyntax.Elements? {
switch self {
case .attributes(let attributes):
if let availability = attributes.availability {
return .attributes(availability)
} else {
return nil
}
default:
return nil
}
}
}
extension IfConfigClauseSyntax {
var availability: IfConfigClauseSyntax? {
if let availability = elements?.availability {
return with(\.elements, availability)
} else {
return nil
}
}
var clonedAsIf: IfConfigClauseSyntax {
detached.with(\.poundKeyword, .poundIfToken())
}
}
extension IfConfigDeclSyntax {
var availability: IfConfigDeclSyntax? {
var elements = [IfConfigClauseListSyntax.Element]()
for clause in clauses {
if let availability = clause.availability {
if elements.isEmpty {
elements.append(availability.clonedAsIf)
} else {
elements.append(availability)
}
}
}
if elements.isEmpty {
return nil
} else {
return with(\.clauses, IfConfigClauseListSyntax(elements))
}
}
}
extension AttributeListSyntax.Element {
var availability: AttributeListSyntax.Element? {
switch self {
case .attribute(let attribute):
if let availability = attribute.availability {
return .attribute(availability)
}
case .ifConfigDecl(let ifConfig):
if let availability = ifConfig.availability {
return .ifConfigDecl(availability)
}
@unknown default:
return nil
}
return nil
}
}
extension AttributeListSyntax {
var availability: AttributeListSyntax? {
var elements = [AttributeListSyntax.Element]()
for element in self {
if let availability = element.availability {
elements.append(availability)
}
}
if elements.isEmpty {
return nil
}
return AttributeListSyntax(elements)
}
}