Skip to content

Commit cee3ca7

Browse files
committed
Generate token spec sets
1 parent ca81f39 commit cee3ca7

File tree

12 files changed

+2464
-233
lines changed

12 files changed

+2464
-233
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: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
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+
for layoutNode in SYNTAX_NODES.compactMap(\.layoutNode) {
22+
for child in layoutNode.children {
23+
if case let .token(choices, _, _) = child.kind, choices.count > 1 {
24+
try! ExtensionDeclSyntax("extension \(raw: layoutNode.kind.syntaxType)") {
25+
try EnumDeclSyntax("enum \(raw: child.name)Options: TokenSpecSet") {
26+
for choice in choices {
27+
switch choice {
28+
case .keyword(let keywordText):
29+
let keyword = KEYWORDS.first(where: { $0.name == keywordText })!
30+
DeclSyntax("case \(raw: keyword.escapedName)")
31+
case .token(let tokenText):
32+
let token = SYNTAX_TOKEN_MAP[tokenText]!
33+
DeclSyntax("case \(raw: token.swiftKind)")
34+
}
35+
}
36+
37+
try InitializerDeclSyntax("init?(lexeme: Lexer.Lexeme)") {
38+
try SwitchExprSyntax("switch PrepareForKeywordMatch(lexeme)") {
39+
for choice in choices {
40+
switch choice {
41+
case .keyword(let keywordText):
42+
let keyword = KEYWORDS.first(where: { $0.name == keywordText })!
43+
SwitchCaseSyntax("case TokenSpec(.\(raw: keyword.escapedName)): self = .\(raw: keyword.escapedName)")
44+
case .token(let tokenText):
45+
let token = SYNTAX_TOKEN_MAP[tokenText]!
46+
SwitchCaseSyntax(
47+
"case TokenSpec(.\(raw: token.swiftKind)): self = .\(raw: token.swiftKind)"
48+
)
49+
}
50+
}
51+
SwitchCaseSyntax("default: return nil")
52+
}
53+
}
54+
55+
try VariableDeclSyntax("var spec: TokenSpec") {
56+
try SwitchExprSyntax("switch self") {
57+
for choice in choices {
58+
switch choice {
59+
case .keyword(let keywordText):
60+
let keyword = KEYWORDS.first(where: { $0.name == keywordText })!
61+
SwitchCaseSyntax(
62+
"case .\(raw: keyword.escapedName): return .keyword(.\(raw: keyword.escapedName))"
63+
)
64+
case .token(let tokenText):
65+
let token = SYNTAX_TOKEN_MAP[tokenText]!
66+
SwitchCaseSyntax(
67+
"case .\(raw: token.swiftKind): return .\(raw: token.swiftKind)"
68+
)
69+
}
70+
}
71+
}
72+
}
73+
}
74+
}
75+
}
76+
}
77+
}
78+
}

0 commit comments

Comments
 (0)