-
Notifications
You must be signed in to change notification settings - Fork 436
/
Copy pathExperimentalFeaturesFile.swift
77 lines (72 loc) · 2.27 KB
/
ExperimentalFeaturesFile.swift
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
//===----------------------------------------------------------------------===//
//
// 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
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
import SwiftSyntax
import SwiftSyntaxBuilder
import SyntaxSupport
import Utils
let experimentalFeaturesFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
DeclSyntax(
"""
extension Parser {
@_spi(ExperimentalLanguageFeatures)
public struct ExperimentalFeatures: OptionSet, Sendable {
public let rawValue: UInt
public init(rawValue: UInt) {
self.rawValue = rawValue
}
}
}
"""
)
try! ExtensionDeclSyntax("extension Parser.ExperimentalFeatures") {
for (i, feature) in ExperimentalFeature.allCases.enumerated() {
DeclSyntax(
"""
/// Whether to enable the parsing of \(raw: feature.documentationDescription).
public static let \(feature.token) = Self(rawValue: 1 << \(raw: i))
"""
)
}
try! VariableDeclSyntax(
"""
/// Set of features always enabled.
static var alwaysEnabledFeatures: Self
"""
) {
ArrayExprSyntax {
for feature in ExperimentalFeature.allCases where feature.isAlwaysEnabledInParser {
ArrayElementSyntax(expression: ExprSyntax(".\(feature.token)"))
}
}
}
try! InitializerDeclSyntax(
"""
/// Creates a new value representing the experimental feature with the
/// given name, or returns nil if the name is not recognized.
public init?(name: String)
"""
) {
try! SwitchExprSyntax("switch name") {
SwitchCaseListSyntax {
for feature in ExperimentalFeature.allCases {
SwitchCaseSyntax(#"case "\#(raw: feature.featureName)":"#) {
ExprSyntax("self = .\(feature.token)")
}
}
SwitchCaseSyntax("default:") {
StmtSyntax("return nil")
}
}
}
}
}
}