Skip to content

Commit 809fe52

Browse files
committed
Extract the optional part of canImport to a separate node
1 parent fa6902a commit 809fe52

File tree

15 files changed

+418
-173
lines changed

15 files changed

+418
-173
lines changed

CodeGeneration/Sources/SyntaxSupport/ExprNodes.swift

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -204,28 +204,37 @@ public let EXPR_NODES: [Node] = [
204204
kind: .token(choices: [.token(tokenKind: "IdentifierToken")])
205205
),
206206
Child(
207-
name: "Comma",
208-
kind: .token(choices: [.token(tokenKind: "CommaToken")]),
207+
name: "VersionInfo",
208+
kind: .node(kind: "CanImportVersionInfo"),
209209
isOptional: true
210210
),
211+
Child(
212+
name: "RightParen",
213+
kind: .token(choices: [.token(tokenKind: "RightParenToken")])
214+
),
215+
]
216+
),
217+
218+
Node(
219+
name: "CanImportVersionInfo",
220+
nameForDiagnostics: nil,
221+
kind: "Expr",
222+
children: [
223+
Child(
224+
name: "Comma",
225+
kind: .token(choices: [.token(tokenKind: "CommaToken")])
226+
),
211227
Child(
212228
name: "Label",
213-
kind: .token(choices: [.keyword(text: "_version"), .keyword(text: "_underlyingVersion")]),
214-
isOptional: true
229+
kind: .token(choices: [.keyword(text: "_version"), .keyword(text: "_underlyingVersion")])
215230
),
216231
Child(
217232
name: "Colon",
218-
kind: .token(choices: [.token(tokenKind: "ColonToken")]),
219-
isOptional: true
233+
kind: .token(choices: [.token(tokenKind: "ColonToken")])
220234
),
221235
Child(
222236
name: "VersionTuple",
223-
kind: .node(kind: "VersionTuple"),
224-
isOptional: true
225-
),
226-
Child(
227-
name: "RightParen",
228-
kind: .token(choices: [.token(tokenKind: "RightParenToken")])
237+
kind: .node(kind: "VersionTuple")
229238
),
230239
]
231240
),

Sources/SwiftParser/Expressions.swift

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2597,20 +2597,15 @@ extension Parser {
25972597

25982598
let (unexpectedBeforeImportPath, importPath) = self.expect(.identifier)
25992599

2600-
let comma = self.consume(if: .comma)
2600+
var versionInfo: RawCanImportVersionInfoSyntax?
26012601

2602-
var unexpectedBeforeLabel: RawUnexpectedNodesSyntax?
2603-
var label: RawTokenSyntax?
2604-
2605-
var unexpectedBeforeColon: RawUnexpectedNodesSyntax?
2606-
var colon: RawTokenSyntax?
2607-
var version: RawVersionTupleSyntax?
2602+
if let comma = self.consume(if: .comma) {
2603+
let (unexpectedBeforeLabel, label) = self.expect(.keyword(._version), .keyword(._underlyingVersion), default: .keyword(._version))
2604+
let (unexpectedBeforeColon, colon) = self.expect(.colon)
26082605

2609-
if comma != nil {
2610-
(unexpectedBeforeLabel, label) = self.expect(.keyword(._version), .keyword(._underlyingVersion), default: .keyword(._version))
2611-
(unexpectedBeforeColon, colon) = self.expect(.colon)
2606+
let version = self.parseVersionTuple(maxComponentCount: 4)
26122607

2613-
version = self.parseVersionTuple(maxComponentCount: 4)
2608+
versionInfo = RawCanImportVersionInfoSyntax(comma: comma, unexpectedBeforeLabel, label: label, unexpectedBeforeColon, colon: colon, versionTuple: version, arena: self.arena)
26142609
}
26152610

26162611
let (unexpectedBeforeRightParen, rightParen) = self.expect(.rightParen)
@@ -2622,12 +2617,7 @@ extension Parser {
26222617
leftParen: leftParen,
26232618
unexpectedBeforeImportPath,
26242619
importPath: importPath,
2625-
comma: comma,
2626-
unexpectedBeforeLabel,
2627-
label: label,
2628-
unexpectedBeforeColon,
2629-
colon: colon,
2630-
versionTuple: version,
2620+
versionInfo: versionInfo,
26312621
unexpectedBeforeRightParen,
26322622
rightParen: rightParen,
26332623
arena: self.arena

Sources/SwiftParserDiagnostics/ParseDiagnosticsGenerator.swift

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -536,20 +536,8 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
536536
return .skipChildren
537537
}
538538

539-
if let label = node.label,
540-
label.presence == .missing
541-
{
542-
addDiagnostic(
543-
label,
544-
.canImportWrongSecondParameterLabel,
545-
handledNodes: [label.id]
546-
)
547-
548-
handledNodes.append(contentsOf: [node.unexpectedBetweenLabelAndColon?.id, node.colon?.id, node.versionTuple?.id].compactMap { $0 })
549-
}
550-
551-
if let versionTuple = node.versionTuple,
552-
let unexpectedVersionTuple = node.unexpectedBetweenVersionTupleAndRightParen
539+
if let versionTuple = node.versionInfo?.versionTuple,
540+
let unexpectedVersionTuple = node.unexpectedBetweenVersionInfoAndRightParen
553541
{
554542
if versionTuple.major.presence == .missing {
555543
addDiagnostic(
@@ -569,6 +557,24 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
569557
return .visitChildren
570558
}
571559

560+
public override func visit(_ node: CanImportVersionInfoSyntax) -> SyntaxVisitorContinueKind {
561+
if shouldSkip(node) {
562+
return .skipChildren
563+
}
564+
565+
if node.label.presence == .missing {
566+
addDiagnostic(
567+
node.label,
568+
.canImportWrongSecondParameterLabel,
569+
handledNodes: [node.label.id]
570+
)
571+
572+
handledNodes.append(contentsOf: [node.unexpectedBetweenLabelAndColon?.id, node.colon.id, node.versionTuple.id].compactMap { $0 })
573+
}
574+
575+
return .visitChildren
576+
}
577+
572578
public override func visit(_ node: ConditionElementSyntax) -> SyntaxVisitorContinueKind {
573579
if shouldSkip(node) {
574580
return .skipChildren

Sources/SwiftSyntax/Documentation.docc/generated/SwiftSyntax.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ allows Swift tools to parse, inspect, generate, and transform Swift source code.
9494
- <doc:SwiftSyntax/BooleanLiteralExprSyntax>
9595
- <doc:SwiftSyntax/BorrowExprSyntax>
9696
- <doc:SwiftSyntax/CanImportExprSyntax>
97+
- <doc:SwiftSyntax/CanImportVersionInfoSyntax>
9798
- <doc:SwiftSyntax/ClosureExprSyntax>
9899
- <doc:SwiftSyntax/DictionaryExprSyntax>
99100
- <doc:SwiftSyntax/DiscardAssignmentExprSyntax>

Sources/SwiftSyntax/generated/ChildNameForKeyPath.swift

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -411,28 +411,34 @@ public func childName(_ keyPath: AnyKeyPath) -> String? {
411411
return "unexpectedBetweenLeftParenAndImportPath"
412412
case \CanImportExprSyntax.importPath:
413413
return "importPath"
414-
case \CanImportExprSyntax.unexpectedBetweenImportPathAndComma:
415-
return "unexpectedBetweenImportPathAndComma"
416-
case \CanImportExprSyntax.comma:
414+
case \CanImportExprSyntax.unexpectedBetweenImportPathAndVersionInfo:
415+
return "unexpectedBetweenImportPathAndVersionInfo"
416+
case \CanImportExprSyntax.versionInfo:
417+
return "versionInfo"
418+
case \CanImportExprSyntax.unexpectedBetweenVersionInfoAndRightParen:
419+
return "unexpectedBetweenVersionInfoAndRightParen"
420+
case \CanImportExprSyntax.rightParen:
421+
return "rightParen"
422+
case \CanImportExprSyntax.unexpectedAfterRightParen:
423+
return "unexpectedAfterRightParen"
424+
case \CanImportVersionInfoSyntax.unexpectedBeforeComma:
425+
return "unexpectedBeforeComma"
426+
case \CanImportVersionInfoSyntax.comma:
417427
return "comma"
418-
case \CanImportExprSyntax.unexpectedBetweenCommaAndLabel:
428+
case \CanImportVersionInfoSyntax.unexpectedBetweenCommaAndLabel:
419429
return "unexpectedBetweenCommaAndLabel"
420-
case \CanImportExprSyntax.label:
430+
case \CanImportVersionInfoSyntax.label:
421431
return "label"
422-
case \CanImportExprSyntax.unexpectedBetweenLabelAndColon:
432+
case \CanImportVersionInfoSyntax.unexpectedBetweenLabelAndColon:
423433
return "unexpectedBetweenLabelAndColon"
424-
case \CanImportExprSyntax.colon:
434+
case \CanImportVersionInfoSyntax.colon:
425435
return "colon"
426-
case \CanImportExprSyntax.unexpectedBetweenColonAndVersionTuple:
436+
case \CanImportVersionInfoSyntax.unexpectedBetweenColonAndVersionTuple:
427437
return "unexpectedBetweenColonAndVersionTuple"
428-
case \CanImportExprSyntax.versionTuple:
438+
case \CanImportVersionInfoSyntax.versionTuple:
429439
return "versionTuple"
430-
case \CanImportExprSyntax.unexpectedBetweenVersionTupleAndRightParen:
431-
return "unexpectedBetweenVersionTupleAndRightParen"
432-
case \CanImportExprSyntax.rightParen:
433-
return "rightParen"
434-
case \CanImportExprSyntax.unexpectedAfterRightParen:
435-
return "unexpectedAfterRightParen"
440+
case \CanImportVersionInfoSyntax.unexpectedAfterVersionTuple:
441+
return "unexpectedAfterVersionTuple"
436442
case \CaseItemSyntax.unexpectedBeforePattern:
437443
return "unexpectedBeforePattern"
438444
case \CaseItemSyntax.pattern:

Sources/SwiftSyntax/generated/SyntaxAnyVisitor.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,14 @@ open class SyntaxAnyVisitor: SyntaxVisitor {
325325
visitAnyPost(node._syntaxNode)
326326
}
327327

328+
override open func visit(_ node: CanImportVersionInfoSyntax) -> SyntaxVisitorContinueKind {
329+
return visitAny(node._syntaxNode)
330+
}
331+
332+
override open func visitPost(_ node: CanImportVersionInfoSyntax) {
333+
visitAnyPost(node._syntaxNode)
334+
}
335+
328336
override open func visit(_ node: CaseItemListSyntax) -> SyntaxVisitorContinueKind {
329337
return visitAny(node._syntaxNode)
330338
}

Sources/SwiftSyntax/generated/SyntaxBaseNodes.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ public struct ExprSyntax: ExprSyntaxProtocol, SyntaxHashable {
206206

207207
public init?<S: SyntaxProtocol>(_ node: S) {
208208
switch node.raw.kind {
209-
case .arrayExpr, .arrowExpr, .asExpr, .assignmentExpr, .awaitExpr, .binaryOperatorExpr, .booleanLiteralExpr, .borrowExpr, .canImportExpr, .closureExpr, .dictionaryExpr, .discardAssignmentExpr, .editorPlaceholderExpr, .floatLiteralExpr, .forcedValueExpr, .functionCallExpr, .identifierExpr, .ifExpr, .inOutExpr, .infixOperatorExpr, .integerLiteralExpr, .isExpr, .keyPathExpr, .macroExpansionExpr, .memberAccessExpr, .missingExpr, .moveExpr, .nilLiteralExpr, .optionalChainingExpr, .packElementExpr, .packExpansionExpr, .postfixIfConfigExpr, .postfixUnaryExpr, .prefixOperatorExpr, .regexLiteralExpr, .sequenceExpr, .specializeExpr, .stringLiteralExpr, .subscriptExpr, .superRefExpr, .switchExpr, .ternaryExpr, .tryExpr, .tupleExpr, .typeExpr, .unresolvedAsExpr, .unresolvedIsExpr, .unresolvedPatternExpr, .unresolvedTernaryExpr:
209+
case .arrayExpr, .arrowExpr, .asExpr, .assignmentExpr, .awaitExpr, .binaryOperatorExpr, .booleanLiteralExpr, .borrowExpr, .canImportExpr, .canImportVersionInfo, .closureExpr, .dictionaryExpr, .discardAssignmentExpr, .editorPlaceholderExpr, .floatLiteralExpr, .forcedValueExpr, .functionCallExpr, .identifierExpr, .ifExpr, .inOutExpr, .infixOperatorExpr, .integerLiteralExpr, .isExpr, .keyPathExpr, .macroExpansionExpr, .memberAccessExpr, .missingExpr, .moveExpr, .nilLiteralExpr, .optionalChainingExpr, .packElementExpr, .packExpansionExpr, .postfixIfConfigExpr, .postfixUnaryExpr, .prefixOperatorExpr, .regexLiteralExpr, .sequenceExpr, .specializeExpr, .stringLiteralExpr, .subscriptExpr, .superRefExpr, .switchExpr, .ternaryExpr, .tryExpr, .tupleExpr, .typeExpr, .unresolvedAsExpr, .unresolvedIsExpr, .unresolvedPatternExpr, .unresolvedTernaryExpr:
210210
self._syntaxNode = node._syntaxNode
211211
default:
212212
return nil
@@ -218,7 +218,7 @@ public struct ExprSyntax: ExprSyntaxProtocol, SyntaxHashable {
218218
/// is undefined.
219219
internal init(_ data: SyntaxData) {
220220
switch data.raw.kind {
221-
case .arrayExpr, .arrowExpr, .asExpr, .assignmentExpr, .awaitExpr, .binaryOperatorExpr, .booleanLiteralExpr, .borrowExpr, .canImportExpr, .closureExpr, .dictionaryExpr, .discardAssignmentExpr, .editorPlaceholderExpr, .floatLiteralExpr, .forcedValueExpr, .functionCallExpr, .identifierExpr, .ifExpr, .inOutExpr, .infixOperatorExpr, .integerLiteralExpr, .isExpr, .keyPathExpr, .macroExpansionExpr, .memberAccessExpr, .missingExpr, .moveExpr, .nilLiteralExpr, .optionalChainingExpr, .packElementExpr, .packExpansionExpr, .postfixIfConfigExpr, .postfixUnaryExpr, .prefixOperatorExpr, .regexLiteralExpr, .sequenceExpr, .specializeExpr, .stringLiteralExpr, .subscriptExpr, .superRefExpr, .switchExpr, .ternaryExpr, .tryExpr, .tupleExpr, .typeExpr, .unresolvedAsExpr, .unresolvedIsExpr, .unresolvedPatternExpr, .unresolvedTernaryExpr:
221+
case .arrayExpr, .arrowExpr, .asExpr, .assignmentExpr, .awaitExpr, .binaryOperatorExpr, .booleanLiteralExpr, .borrowExpr, .canImportExpr, .canImportVersionInfo, .closureExpr, .dictionaryExpr, .discardAssignmentExpr, .editorPlaceholderExpr, .floatLiteralExpr, .forcedValueExpr, .functionCallExpr, .identifierExpr, .ifExpr, .inOutExpr, .infixOperatorExpr, .integerLiteralExpr, .isExpr, .keyPathExpr, .macroExpansionExpr, .memberAccessExpr, .missingExpr, .moveExpr, .nilLiteralExpr, .optionalChainingExpr, .packElementExpr, .packExpansionExpr, .postfixIfConfigExpr, .postfixUnaryExpr, .prefixOperatorExpr, .regexLiteralExpr, .sequenceExpr, .specializeExpr, .stringLiteralExpr, .subscriptExpr, .superRefExpr, .switchExpr, .ternaryExpr, .tryExpr, .tupleExpr, .typeExpr, .unresolvedAsExpr, .unresolvedIsExpr, .unresolvedPatternExpr, .unresolvedTernaryExpr:
222222
break
223223
default:
224224
preconditionFailure("Unable to create ExprSyntax from \(data.raw.kind)")
@@ -263,6 +263,7 @@ public struct ExprSyntax: ExprSyntaxProtocol, SyntaxHashable {
263263
.node(BooleanLiteralExprSyntax.self),
264264
.node(BorrowExprSyntax.self),
265265
.node(CanImportExprSyntax.self),
266+
.node(CanImportVersionInfoSyntax.self),
266267
.node(ClosureExprSyntax.self),
267268
.node(DictionaryExprSyntax.self),
268269
.node(DiscardAssignmentExprSyntax.self),
@@ -719,6 +720,7 @@ extension Syntax {
719720
.node(BorrowExprSyntax.self),
720721
.node(BreakStmtSyntax.self),
721722
.node(CanImportExprSyntax.self),
723+
.node(CanImportVersionInfoSyntax.self),
722724
.node(CaseItemListSyntax.self),
723725
.node(CaseItemSyntax.self),
724726
.node(CatchClauseListSyntax.self),

Sources/SwiftSyntax/generated/SyntaxEnum.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public enum SyntaxEnum {
5050
case borrowExpr(BorrowExprSyntax)
5151
case breakStmt(BreakStmtSyntax)
5252
case canImportExpr(CanImportExprSyntax)
53+
case canImportVersionInfo(CanImportVersionInfoSyntax)
5354
case caseItemList(CaseItemListSyntax)
5455
case caseItem(CaseItemSyntax)
5556
case catchClauseList(CatchClauseListSyntax)
@@ -364,6 +365,8 @@ public extension Syntax {
364365
return .breakStmt(BreakStmtSyntax(self)!)
365366
case .canImportExpr:
366367
return .canImportExpr(CanImportExprSyntax(self)!)
368+
case .canImportVersionInfo:
369+
return .canImportVersionInfo(CanImportVersionInfoSyntax(self)!)
367370
case .caseItemList:
368371
return .caseItemList(CaseItemListSyntax(self)!)
369372
case .caseItem:

Sources/SwiftSyntax/generated/SyntaxKind.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public enum SyntaxKind {
5050
case borrowExpr
5151
case breakStmt
5252
case canImportExpr
53+
case canImportVersionInfo
5354
case caseItemList
5455
case caseItem
5556
case catchClauseList
@@ -481,6 +482,8 @@ public enum SyntaxKind {
481482
return BreakStmtSyntax.self
482483
case .canImportExpr:
483484
return CanImportExprSyntax.self
485+
case .canImportVersionInfo:
486+
return CanImportVersionInfoSyntax.self
484487
case .caseItemList:
485488
return CaseItemListSyntax.self
486489
case .caseItem:

Sources/SwiftSyntax/generated/SyntaxRewriter.swift

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,13 @@ open class SyntaxRewriter {
263263
return ExprSyntax(visitChildren(node))
264264
}
265265

266+
/// Visit a `CanImportVersionInfoSyntax`.
267+
/// - Parameter node: the node that is being visited
268+
/// - Returns: the rewritten node
269+
open func visit(_ node: CanImportVersionInfoSyntax) -> ExprSyntax {
270+
return ExprSyntax(visitChildren(node))
271+
}
272+
266273
/// Visit a `CaseItemListSyntax`.
267274
/// - Parameter node: the node that is being visited
268275
/// - Returns: the rewritten node
@@ -2479,6 +2486,20 @@ open class SyntaxRewriter {
24792486
return Syntax(visit(node))
24802487
}
24812488

2489+
/// Implementation detail of visit(_:). Do not call directly.
2490+
private func visitImplCanImportVersionInfoSyntax(_ data: SyntaxData) -> Syntax {
2491+
let node = CanImportVersionInfoSyntax(data)
2492+
// Accessing _syntaxNode directly is faster than calling Syntax(node)
2493+
visitPre(node._syntaxNode)
2494+
defer {
2495+
visitPost(node._syntaxNode)
2496+
}
2497+
if let newNode = visitAny(node._syntaxNode) {
2498+
return newNode
2499+
}
2500+
return Syntax(visit(node))
2501+
}
2502+
24822503
/// Implementation detail of visit(_:). Do not call directly.
24832504
private func visitImplCaseItemListSyntax(_ data: SyntaxData) -> Syntax {
24842505
let node = CaseItemListSyntax(data)
@@ -5921,6 +5942,8 @@ open class SyntaxRewriter {
59215942
return visitImplBreakStmtSyntax
59225943
case .canImportExpr:
59235944
return visitImplCanImportExprSyntax
5945+
case .canImportVersionInfo:
5946+
return visitImplCanImportVersionInfoSyntax
59245947
case .caseItemList:
59255948
return visitImplCaseItemListSyntax
59265949
case .caseItem:
@@ -6475,6 +6498,8 @@ open class SyntaxRewriter {
64756498
return visitImplBreakStmtSyntax(data)
64766499
case .canImportExpr:
64776500
return visitImplCanImportExprSyntax(data)
6501+
case .canImportVersionInfo:
6502+
return visitImplCanImportVersionInfoSyntax(data)
64786503
case .caseItemList:
64796504
return visitImplCaseItemListSyntax(data)
64806505
case .caseItem:

Sources/SwiftSyntax/generated/SyntaxTransform.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,11 @@ public protocol SyntaxTransformVisitor {
189189
/// - Returns: the sum of whatever the child visitors return.
190190
func visit(_ node: CanImportExprSyntax) -> ResultType
191191

192+
/// Visiting `CanImportVersionInfoSyntax` specifically.
193+
/// - Parameter node: the node we are visiting.
194+
/// - Returns: the sum of whatever the child visitors return.
195+
func visit(_ node: CanImportVersionInfoSyntax) -> ResultType
196+
192197
/// Visiting `CaseItemListSyntax` specifically.
193198
/// - Parameter node: the node we are visiting.
194199
/// - Returns: the sum of whatever the child visitors return.
@@ -1623,6 +1628,13 @@ extension SyntaxTransformVisitor {
16231628
visitAny(Syntax(node))
16241629
}
16251630

1631+
/// Visiting `CanImportVersionInfoSyntax` specifically.
1632+
/// - Parameter node: the node we are visiting.
1633+
/// - Returns: nil by default.
1634+
public func visit(_ node: CanImportVersionInfoSyntax) -> ResultType {
1635+
visitAny(Syntax(node))
1636+
}
1637+
16261638
/// Visiting `CaseItemListSyntax` specifically.
16271639
/// - Parameter node: the node we are visiting.
16281640
/// - Returns: nil by default.
@@ -3361,6 +3373,8 @@ extension SyntaxTransformVisitor {
33613373
return visit(derived)
33623374
case .canImportExpr(let derived):
33633375
return visit(derived)
3376+
case .canImportVersionInfo(let derived):
3377+
return visit(derived)
33643378
case .caseItemList(let derived):
33653379
return visit(derived)
33663380
case .caseItem(let derived):

0 commit comments

Comments
 (0)