Skip to content

Commit b9b176f

Browse files
committed
Generate token spec sets
1 parent 07361ba commit b9b176f

File tree

6 files changed

+2126
-4
lines changed

6 files changed

+2126
-4
lines changed

CodeGeneration/Sources/SyntaxSupport/AttributeNodes.swift

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -656,7 +656,15 @@ public let ATTRIBUTE_NODES: [Node] = [
656656
children: [
657657
Child(
658658
name: "Label",
659-
kind: .node(kind: .token),
659+
kind: .token(choices: [
660+
.keyword(text: "target"),
661+
.keyword(text: "availability"),
662+
.keyword(text: "exported"),
663+
.keyword(text: "kind"),
664+
.keyword(text: "spi"),
665+
.keyword(text: "spiModule"),
666+
.keyword(text: "available"),
667+
]),
660668
nameForDiagnostics: "label",
661669
documentation: "The label of the argument"
662670
),

CodeGeneration/Sources/SyntaxSupport/DeclNodes.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -534,7 +534,6 @@ public let DECL_NODES: [Node] = [
534534
.keyword(text: "public"),
535535
.keyword(text: "reasync"),
536536
.keyword(text: "required"),
537-
.keyword(text: "setter_access"),
538537
.keyword(text: "static"),
539538
.keyword(text: "unowned"),
540539
.keyword(text: "weak"),

CodeGeneration/Sources/generate-swiftsyntax/GenerateSwiftSyntax.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ struct GenerateSwiftSyntax: ParsableCommand {
8989
// SwiftParser
9090
GeneratedFileSpec(swiftParserGeneratedDir + ["IsLexerClassified.swift"], isLexerClassifiedFile),
9191
GeneratedFileSpec(swiftParserGeneratedDir + ["Parser+Entry.swift"], parserEntryFile),
92+
GeneratedFileSpec(swiftParserGeneratedDir + ["Parser+TokenSpecSet.swift"], parserTokenSpecSetFile),
9293
GeneratedFileSpec(swiftParserGeneratedDir + ["TokenSpecStaticMembers.swift"], tokenSpecStaticMembersFile),
9394

9495
// SwiftParserDiagnostics
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2023 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
import SwiftSyntax
14+
import SwiftSyntaxBuilder
15+
import SyntaxSupport
16+
import Utils
17+
18+
let parserTokenSpecSetFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
19+
DeclSyntax("@_spi(RawSyntax) import SwiftSyntax")
20+
21+
try! ExtensionDeclSyntax("extension Parser") {
22+
for node in SYNTAX_NODES {
23+
if let children = node.layoutNode?.children {
24+
for child in children where !child.isUnexpectedNodes {
25+
if case let .token(choices, _, _) = child.kind, choices.count > 1 {
26+
try EnumDeclSyntax("enum \(raw: node.varOrCaseName.description.withFirstCharacterUppercased + child.name): TokenSpecSet") {
27+
for choice in choices {
28+
switch choice {
29+
case .keyword(let keywordText):
30+
let keyword = KEYWORDS.first(where: { $0.name == keywordText })!
31+
DeclSyntax("case \(raw: keyword.escapedName)")
32+
case .token(let tokenText):
33+
let token = SYNTAX_TOKEN_MAP[tokenText]!
34+
DeclSyntax("case \(raw: token.name.withFirstCharacterLowercased)")
35+
}
36+
}
37+
38+
try InitializerDeclSyntax("init?(lexeme: Lexer.Lexeme)") {
39+
try SwitchExprSyntax("switch PrepareForKeywordMatch(lexeme)") {
40+
for choice in choices {
41+
switch choice {
42+
case .keyword(let keywordText):
43+
let keyword = KEYWORDS.first(where: { $0.name == keywordText })!
44+
SwitchCaseSyntax("case TokenSpec(.\(raw: keyword.escapedName)): self = .\(raw: keyword.escapedName)")
45+
case .token(let tokenText):
46+
let token = SYNTAX_TOKEN_MAP[tokenText]!
47+
SwitchCaseSyntax(
48+
"case TokenSpec(.\(raw: token.name.withFirstCharacterLowercased)): self = .\(raw: token.name.withFirstCharacterLowercased)"
49+
)
50+
}
51+
}
52+
SwitchCaseSyntax("default: return nil")
53+
}
54+
}
55+
56+
try VariableDeclSyntax("var spec: TokenSpec") {
57+
try SwitchExprSyntax("switch self") {
58+
for choice in choices {
59+
switch choice {
60+
case .keyword(let keywordText):
61+
let keyword = KEYWORDS.first(where: { $0.name == keywordText })!
62+
SwitchCaseSyntax(
63+
"case .\(raw: keyword.escapedName): return .keyword(.\(raw: keyword.escapedName))"
64+
)
65+
case .token(let tokenText):
66+
let token = SYNTAX_TOKEN_MAP[tokenText]!
67+
SwitchCaseSyntax(
68+
"case .\(raw: token.name.withFirstCharacterLowercased): return .\(raw: token.name.withFirstCharacterLowercased)"
69+
)
70+
}
71+
}
72+
}
73+
}
74+
}
75+
}
76+
}
77+
}
78+
}
79+
}
80+
}

0 commit comments

Comments
 (0)