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
|
//===----------------------------------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
import SwiftSyntax
import SwiftSyntaxBuilder
import SyntaxSupport
import Utils
let isLexerClassifiedFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
DeclSyntax(
"""
#if swift(>=6)
public import SwiftSyntax
#else
import SwiftSyntax
#endif
"""
)
try! ExtensionDeclSyntax(
"""
extension Keyword
"""
) {
try! VariableDeclSyntax(
"""
/// Whether the token kind is switched from being an identifier to being a keyword in the lexer.
/// This is true for keywords that used to be considered non-contextual.
var isLexerClassified: Bool
"""
) {
try! SwitchExprSyntax("switch self") {
for keyword in Keyword.allCases {
if keyword.spec.isLexerClassified {
SwitchCaseSyntax("case .\(keyword.spec.varOrCaseName): return true")
}
}
SwitchCaseSyntax("default: return false")
}
}
}
try! ExtensionDeclSyntax(
"""
extension TokenKind
"""
) {
try! VariableDeclSyntax(
"""
/// Returns `true` if the token is a Swift keyword.
///
/// Keywords are reserved unconditionally for use by Swift and may not
/// appear as identifiers in any position without being escaped. For example,
/// `class`, `func`, or `import`.
@_spi(Diagnostics) @_spi(Testing)
public var isLexerClassifiedKeyword: Bool
"""
) {
try! SwitchExprSyntax("switch self") {
SwitchCaseSyntax("case .keyword(let keyword):") {
StmtSyntax("return keyword.isLexerClassified")
}
SwitchCaseSyntax("default: return false")
}
}
}
}
|