Skip to content

Commit f4f933f

Browse files
committed
Allow postfix #if to be empty
1 parent 8d5a984 commit f4f933f

File tree

13 files changed

+35
-41
lines changed

13 files changed

+35
-41
lines changed

CodeGeneration/Sources/SyntaxSupport/gyb_generated/DeclNodes.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ public let DECL_NODES: [Node] = [
183183
classification: "BuildConfigId"),
184184
Child(name: "Elements",
185185
kind: "Syntax",
186+
isOptional: true,
186187
nodeChoices: [
187188
Child(name: "Statements",
188189
kind: "CodeBlockItemList"),

Sources/SwiftBasicFormat/generated/BasicFormat.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -934,7 +934,7 @@ open class BasicFormat: SyntaxRewriter {
934934
let unexpectedBetweenPoundKeywordAndCondition = node.unexpectedBetweenPoundKeywordAndCondition.map(self.visit)?.cast(UnexpectedNodesSyntax.self)
935935
let condition = node.condition.map(self.visit)?.cast(ExprSyntax.self)
936936
let unexpectedBetweenConditionAndElements = node.unexpectedBetweenConditionAndElements.map(self.visit)?.cast(UnexpectedNodesSyntax.self)
937-
let elements = self.visit(node.elements).cast(Syntax.self)
937+
let elements = node.elements.map(self.visit)?.cast(Syntax.self)
938938
return Syntax(IfConfigClauseSyntax(unexpectedBeforePoundKeyword, poundKeyword: poundKeyword, unexpectedBetweenPoundKeywordAndCondition, condition: condition, unexpectedBetweenConditionAndElements, elements: elements))
939939
}
940940

Sources/SwiftParser/Directives.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ extension Parser {
6868
public mutating func parsePoundIfDirective<Element: RawSyntaxNodeProtocol>(
6969
_ parseElement: (inout Parser) -> Element?,
7070
addSemicolonIfNeeded: (_ lastElement: Element, _ newItemAtStartOfLine: Bool, _ parser: inout Parser) -> Element? = { _, _, _ in nil },
71-
syntax: (inout Parser, [Element]) -> RawSyntax
71+
syntax: (inout Parser, [Element]) -> RawSyntax?
7272
) -> RawIfConfigDeclSyntax {
7373
var clauses = [RawIfConfigClauseSyntax]()
7474
do {

Sources/SwiftParser/Expressions.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -592,13 +592,13 @@ extension Parser {
592592
// TODO: diagnose and skip the remaining token in the current clause.
593593
return result
594594
}
595-
syntax: { parser, elements in
596-
guard elements.count == 1 else {
597-
assert(elements.isEmpty)
598-
return RawSyntax(RawMissingExprSyntax(arena: parser.arena))
599-
}
600-
return RawSyntax(elements.first!)
595+
syntax: { (parser, elements) -> RawSyntax? in
596+
switch elements.count {
597+
case 0: return nil
598+
case 1: return RawSyntax(elements.first!)
599+
default: fatalError("Postfix #if should only have one element")
601600
}
601+
}
602602

603603
return RawExprSyntax(RawPostfixIfConfigExprSyntax(
604604
base: start, config: config,

Sources/SwiftSyntax/Raw/gyb_generated/RawSyntaxNodes.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7952,7 +7952,7 @@ public struct RawIfConfigClauseSyntax: RawSyntaxNodeProtocol, RawSyntaxToSyntax
79527952
_ unexpectedBetweenPoundKeywordAndCondition: RawUnexpectedNodesSyntax? = nil,
79537953
condition: RawExprSyntax?,
79547954
_ unexpectedBetweenConditionAndElements: RawUnexpectedNodesSyntax? = nil,
7955-
elements: RawSyntax,
7955+
elements: RawSyntax?,
79567956
_ unexpectedAfterElements: RawUnexpectedNodesSyntax? = nil,
79577957
arena: __shared SyntaxArena
79587958
) {
@@ -7964,7 +7964,7 @@ public struct RawIfConfigClauseSyntax: RawSyntaxNodeProtocol, RawSyntaxToSyntax
79647964
layout[2] = unexpectedBetweenPoundKeywordAndCondition?.raw
79657965
layout[3] = condition?.raw
79667966
layout[4] = unexpectedBetweenConditionAndElements?.raw
7967-
layout[5] = elements.raw
7967+
layout[5] = elements?.raw
79687968
layout[6] = unexpectedAfterElements?.raw
79697969
}
79707970
self.init(raw: raw)
@@ -8000,11 +8000,11 @@ public struct RawIfConfigClauseSyntax: RawSyntaxNodeProtocol, RawSyntaxToSyntax
80008000
public func withUnexpectedBetweenConditionAndElements(_ unexpectedBetweenConditionAndElements: RawUnexpectedNodesSyntax?, arena: SyntaxArena) -> RawIfConfigClauseSyntax {
80018001
return layoutView.replacingChild(at: 4, with: unexpectedBetweenConditionAndElements.map(RawSyntax.init), arena: arena).as(RawIfConfigClauseSyntax.self)!
80028002
}
8003-
public var elements: RawSyntax {
8004-
layoutView.children[5]!
8003+
public var elements: RawSyntax? {
8004+
layoutView.children[5]
80058005
}
8006-
public func withElements(_ elements: RawSyntax, arena: SyntaxArena) -> RawIfConfigClauseSyntax {
8007-
return layoutView.replacingChild(at: 5, with: RawSyntax(elements), arena: arena).as(RawIfConfigClauseSyntax.self)!
8006+
public func withElements(_ elements: RawSyntax?, arena: SyntaxArena) -> RawIfConfigClauseSyntax {
8007+
return layoutView.replacingChild(at: 5, with: elements.map(RawSyntax.init), arena: arena).as(RawIfConfigClauseSyntax.self)!
80088008
}
80098009
public var unexpectedAfterElements: RawUnexpectedNodesSyntax? {
80108010
layoutView.children[6].map(RawUnexpectedNodesSyntax.init(raw:))

Sources/SwiftSyntax/Raw/gyb_generated/RawSyntaxValidation.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -884,7 +884,7 @@ func validateLayout(layout: RawSyntaxBuffer, as kind: SyntaxKind) {
884884
_verify(layout[2], as: RawUnexpectedNodesSyntax?.self)
885885
_verify(layout[3], as: RawExprSyntax?.self)
886886
_verify(layout[4], as: RawUnexpectedNodesSyntax?.self)
887-
_verify(layout[5], as: RawSyntax.self)
887+
_verify(layout[5], as: RawSyntax?.self)
888888
_verify(layout[6], as: RawUnexpectedNodesSyntax?.self)
889889
break
890890
case .ifConfigClauseList:

Sources/SwiftSyntax/gyb_generated/SyntaxFactory.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2752,14 +2752,14 @@ public enum SyntaxFactory {
27522752
return FunctionSignatureSyntax(data)
27532753
}
27542754
@available(*, deprecated, message: "Use initializer on IfConfigClauseSyntax")
2755-
public static func makeIfConfigClause(_ unexpectedBeforePoundKeyword: UnexpectedNodesSyntax? = nil, poundKeyword: TokenSyntax, _ unexpectedBetweenPoundKeywordAndCondition: UnexpectedNodesSyntax? = nil, condition: ExprSyntax?, _ unexpectedBetweenConditionAndElements: UnexpectedNodesSyntax? = nil, elements: Syntax, _ unexpectedAfterElements: UnexpectedNodesSyntax? = nil) -> IfConfigClauseSyntax {
2755+
public static func makeIfConfigClause(_ unexpectedBeforePoundKeyword: UnexpectedNodesSyntax? = nil, poundKeyword: TokenSyntax, _ unexpectedBetweenPoundKeywordAndCondition: UnexpectedNodesSyntax? = nil, condition: ExprSyntax?, _ unexpectedBetweenConditionAndElements: UnexpectedNodesSyntax? = nil, elements: Syntax?, _ unexpectedAfterElements: UnexpectedNodesSyntax? = nil) -> IfConfigClauseSyntax {
27562756
let layout: [RawSyntax?] = [
27572757
unexpectedBeforePoundKeyword?.raw,
27582758
poundKeyword.raw,
27592759
unexpectedBetweenPoundKeywordAndCondition?.raw,
27602760
condition?.raw,
27612761
unexpectedBetweenConditionAndElements?.raw,
2762-
elements.raw,
2762+
elements?.raw,
27632763
unexpectedAfterElements?.raw,
27642764
]
27652765
let raw = RawSyntax.makeLayout(kind: SyntaxKind.ifConfigClause,
@@ -2777,7 +2777,7 @@ public enum SyntaxFactory {
27772777
nil,
27782778
nil,
27792779
nil,
2780-
RawSyntax.makeEmptyLayout(kind: SyntaxKind.unknown, arena: .default),
2780+
nil,
27812781
nil,
27822782
], arena: .default))
27832783
return IfConfigClauseSyntax(data)

Sources/SwiftSyntax/gyb_generated/syntax_nodes/SyntaxNodes.swift

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5589,7 +5589,7 @@ public struct IfConfigClauseSyntax: SyntaxProtocol, SyntaxHashable {
55895589
_ unexpectedBetweenPoundKeywordAndCondition: UnexpectedNodesSyntax? = nil,
55905590
condition: ExprSyntax?,
55915591
_ unexpectedBetweenConditionAndElements: UnexpectedNodesSyntax? = nil,
5592-
elements: Syntax,
5592+
elements: Syntax?,
55935593
_ unexpectedAfterElements: UnexpectedNodesSyntax? = nil
55945594
) {
55955595
let layout: [RawSyntax?] = [
@@ -5598,7 +5598,7 @@ public struct IfConfigClauseSyntax: SyntaxProtocol, SyntaxHashable {
55985598
unexpectedBetweenPoundKeywordAndCondition?.raw,
55995599
condition?.raw,
56005600
unexpectedBetweenConditionAndElements?.raw,
5601-
elements.raw,
5601+
elements?.raw,
56025602
unexpectedAfterElements?.raw,
56035603
]
56045604
let raw = RawSyntax.makeLayout(kind: SyntaxKind.ifConfigClause,
@@ -5711,9 +5711,10 @@ public struct IfConfigClauseSyntax: SyntaxProtocol, SyntaxHashable {
57115711
return IfConfigClauseSyntax(newData)
57125712
}
57135713

5714-
public var elements: Syntax {
5714+
public var elements: Syntax? {
57155715
get {
57165716
let childData = data.child(at: 5, parent: Syntax(self))
5717+
if childData == nil { return nil }
57175718
return Syntax(childData!)
57185719
}
57195720
set(value) {
@@ -5726,7 +5727,7 @@ public struct IfConfigClauseSyntax: SyntaxProtocol, SyntaxHashable {
57265727
/// current `elements`, if present.
57275728
public func withElements(
57285729
_ newChild: Syntax?) -> IfConfigClauseSyntax {
5729-
let raw = newChild?.raw ?? RawSyntax.makeEmptyLayout(kind: SyntaxKind.unknown, arena: .default)
5730+
let raw = newChild?.raw
57305731
let newData = data.replacingChild(raw, at: 5)
57315732
return IfConfigClauseSyntax(newData)
57325733
}
@@ -5782,7 +5783,7 @@ extension IfConfigClauseSyntax: CustomReflectable {
57825783
"unexpectedBetweenPoundKeywordAndCondition": unexpectedBetweenPoundKeywordAndCondition.map(Syntax.init)?.asProtocol(SyntaxProtocol.self) as Any,
57835784
"condition": condition.map(Syntax.init)?.asProtocol(SyntaxProtocol.self) as Any,
57845785
"unexpectedBetweenConditionAndElements": unexpectedBetweenConditionAndElements.map(Syntax.init)?.asProtocol(SyntaxProtocol.self) as Any,
5785-
"elements": Syntax(elements).asProtocol(SyntaxProtocol.self),
5786+
"elements": elements.map(Syntax.init)?.asProtocol(SyntaxProtocol.self) as Any,
57865787
"unexpectedAfterElements": unexpectedAfterElements.map(Syntax.init)?.asProtocol(SyntaxProtocol.self) as Any,
57875788
])
57885789
}

Sources/SwiftSyntaxBuilder/generated/BuildableNodes.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7999,7 +7999,7 @@ public struct IfConfigClause: SyntaxBuildable, ExpressibleAsIfConfigClause {
79997999
var unexpectedBetweenPoundKeywordAndCondition: UnexpectedNodes?
80008000
var condition: ExprBuildable?
80018001
var unexpectedBetweenConditionAndElements: UnexpectedNodes?
8002-
var elements: SyntaxBuildable
8002+
var elements: SyntaxBuildable?
80038003
}
80048004
enum Data {
80058005
case buildable(BuildableData)
@@ -8014,9 +8014,9 @@ public struct IfConfigClause: SyntaxBuildable, ExpressibleAsIfConfigClause {
80148014
/// - condition:
80158015
/// - unexpectedBetweenConditionAndElements:
80168016
/// - elements:
8017-
public init (leadingTrivia: Trivia = [], trailingTrivia: Trivia = [], unexpectedBeforePoundKeyword: ExpressibleAsUnexpectedNodes? = nil, poundKeyword: Token, unexpectedBetweenPoundKeywordAndCondition: ExpressibleAsUnexpectedNodes? = nil, condition: ExpressibleAsExprBuildable? = nil, unexpectedBetweenConditionAndElements: ExpressibleAsUnexpectedNodes? = nil, elements: ExpressibleAsSyntaxBuildable) {
8017+
public init (leadingTrivia: Trivia = [], trailingTrivia: Trivia = [], unexpectedBeforePoundKeyword: ExpressibleAsUnexpectedNodes? = nil, poundKeyword: Token, unexpectedBetweenPoundKeywordAndCondition: ExpressibleAsUnexpectedNodes? = nil, condition: ExpressibleAsExprBuildable? = nil, unexpectedBetweenConditionAndElements: ExpressibleAsUnexpectedNodes? = nil, elements: ExpressibleAsSyntaxBuildable? = nil) {
80188018
assert(poundKeyword.text == #"#if"# || poundKeyword.text == #"#elseif"# || poundKeyword.text == #"#else"#)
8019-
self.data = .buildable(BuildableData(leadingTrivia: leadingTrivia, trailingTrivia: trailingTrivia, unexpectedBeforePoundKeyword: unexpectedBeforePoundKeyword?.createUnexpectedNodes(), poundKeyword: poundKeyword, unexpectedBetweenPoundKeywordAndCondition: unexpectedBetweenPoundKeywordAndCondition?.createUnexpectedNodes(), condition: condition?.createExprBuildable(), unexpectedBetweenConditionAndElements: unexpectedBetweenConditionAndElements?.createUnexpectedNodes(), elements: elements.createSyntaxBuildable()))
8019+
self.data = .buildable(BuildableData(leadingTrivia: leadingTrivia, trailingTrivia: trailingTrivia, unexpectedBeforePoundKeyword: unexpectedBeforePoundKeyword?.createUnexpectedNodes(), poundKeyword: poundKeyword, unexpectedBetweenPoundKeywordAndCondition: unexpectedBetweenPoundKeywordAndCondition?.createUnexpectedNodes(), condition: condition?.createExprBuildable(), unexpectedBetweenConditionAndElements: unexpectedBetweenConditionAndElements?.createUnexpectedNodes(), elements: elements?.createSyntaxBuildable()))
80208020
}
80218021
public init(_ constructedNode: IfConfigClauseSyntax) {
80228022
self.data = .constructed(constructedNode)
@@ -8027,7 +8027,7 @@ public struct IfConfigClause: SyntaxBuildable, ExpressibleAsIfConfigClause {
80278027
func buildIfConfigClause() -> IfConfigClauseSyntax {
80288028
switch data {
80298029
case .buildable(let buildableData):
8030-
var result = IfConfigClauseSyntax(buildableData.unexpectedBeforePoundKeyword?.buildUnexpectedNodes(), poundKeyword: buildableData.poundKeyword.buildToken(), buildableData.unexpectedBetweenPoundKeywordAndCondition?.buildUnexpectedNodes(), condition: buildableData.condition?.buildExpr(), buildableData.unexpectedBetweenConditionAndElements?.buildUnexpectedNodes(), elements: buildableData.elements.buildSyntax())
8030+
var result = IfConfigClauseSyntax(buildableData.unexpectedBeforePoundKeyword?.buildUnexpectedNodes(), poundKeyword: buildableData.poundKeyword.buildToken(), buildableData.unexpectedBetweenPoundKeywordAndCondition?.buildUnexpectedNodes(), condition: buildableData.condition?.buildExpr(), buildableData.unexpectedBetweenConditionAndElements?.buildUnexpectedNodes(), elements: buildableData.elements?.buildSyntax())
80318031
result.leadingTrivia = buildableData.leadingTrivia + (result.leadingTrivia ?? [])
80328032
result.trailingTrivia = buildableData.trailingTrivia + (result.trailingTrivia ?? [])
80338033
return result

Sources/SwiftSyntaxParser/gyb_generated/NodeDeclarationHash.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@
1717
extension SyntaxParser {
1818
static func verifyNodeDeclarationHash() -> Bool {
1919
return String(cString: swiftparse_syntax_structure_versioning_identifier()!) ==
20-
"82461208aad7b9c2a13fb8715fdddce431fa2f3f"
20+
"2a5be09fdaf9642a740c7436fd887ffa1251fa7b"
2121
}
2222
}

Tests/SwiftParserTest/translated/IfconfigExprTests.swift

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,7 @@ final class IfconfigExprTests: XCTestCase {
9393
}
9494
"""#,
9595
diagnostics: [
96-
// TODO: Old parser expected error on line 8: unary operator cannot be separated from its operand
9796
DiagnosticSpec(locationMarker: "1️⃣", message: "unexpected code '+ otherExpr' in conditional compilation block"),
98-
// TODO: Old parser expected error on line 13: unexpected tokens in '#if' expression body
9997
DiagnosticSpec(locationMarker: "2️⃣", message: #"unexpected code 'print("debug")' in conditional compilation block"#),
10098
]
10199
)
@@ -120,7 +118,6 @@ final class IfconfigExprTests: XCTestCase {
120118
}
121119
""",
122120
diagnostics: [
123-
// TODO: Old parser expected error on line 12: unexpected tokens in '#if' expression body
124121
DiagnosticSpec(message: "unexpected code '+ 12' in conditional compilation block"),
125122
]
126123
)
@@ -133,22 +130,19 @@ final class IfconfigExprTests: XCTestCase {
133130
baseExpr
134131
#if CONDITION_1
135132
.methodOne()
136-
#elseif CONDITION_21️⃣
133+
#elseif CONDITION_2
137134
// OK. Do nothing.
138135
#endif
139136
baseExpr
140137
#if CONDITION_1
141138
.methodOne()
142-
#elseif CONDITION_22️⃣
143-
3️⃣return
139+
#elseif CONDITION_2
140+
1️⃣return
144141
#endif
145142
}
146143
""",
147144
diagnostics: [
148-
DiagnosticSpec(locationMarker: "1️⃣", message: "expected expression in conditional compilation clause"),
149-
DiagnosticSpec(locationMarker: "2️⃣", message: "expected expression in conditional compilation clause"),
150-
// TODO: Old parser expected error on line 12: unexpected tokens in '#if' expression body
151-
DiagnosticSpec(locationMarker: "3️⃣", message: "unexpected code 'return' in conditional compilation block"),
145+
DiagnosticSpec(message: "unexpected code 'return' in conditional compilation block"),
152146
]
153147
)
154148
}

Tests/SwiftParserTest/translated/ImplicitGetterIncompleteTests.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,8 @@ final class ImplicitGetterIncompleteTests: XCTestCase {
2727
var a : Int {
2828
switch i {
2929
}1️⃣
30-
// expected-error@+1 2 {{expected '}'}}
3130
"""#,
3231
diagnostics: [
33-
// TODO: Old parser expected error on line 4: 'switch' statement body must have at least one 'case'
3432
DiagnosticSpec(message: "expected '}' to end variable"),
3533
DiagnosticSpec(message: "expected '}' to end function"),
3634
]

gyb_syntax_support/DeclNodes.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@
102102
]),
103103
Child('Condition', kind='Expr', name_for_diagnostics='condition', classification='BuildConfigId',
104104
is_optional=True),
105-
Child('Elements', kind='Syntax',
105+
Child('Elements', is_optional=True, kind='Syntax',
106106
node_choices=[
107107
Child('Statements', kind='CodeBlockItemList'),
108108
Child('SwitchCases', kind='SwitchCaseList'),

0 commit comments

Comments
 (0)