Skip to content

Commit c95a18b

Browse files
committed
Parse initializes and accesses specifiers in init accessors.
1 parent a74adb0 commit c95a18b

File tree

3 files changed

+115
-0
lines changed

3 files changed

+115
-0
lines changed

Sources/SwiftParser/Declarations.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1538,6 +1538,7 @@ extension Parser {
15381538
}
15391539

15401540
let effectSpecifiers = self.parseAccessorEffectSpecifiers()
1541+
let initEffects = self.parseInitAccessorEffects()
15411542

15421543
let body = self.parseOptionalCodeBlock()
15431544
return RawAccessorDeclSyntax(
@@ -1547,6 +1548,7 @@ extension Parser {
15471548
accessorKind: introducer.token,
15481549
parameter: parameter,
15491550
effectSpecifiers: effectSpecifiers,
1551+
initEffects: initEffects,
15501552
body: body,
15511553
arena: self.arena
15521554
)

Sources/SwiftParser/Specifiers.swift

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -572,3 +572,74 @@ extension Parser {
572572
return RawUnexpectedNodesSyntax(unexpected, arena: self.arena)
573573
}
574574
}
575+
576+
// MARK: - Parsing `initializes` and `accesses` specifiers in init accessors
577+
578+
extension Parser {
579+
mutating func parseInitAccessorEffects() -> RawAccessorInitEffectsSyntax? {
580+
let initializes = self.parseInitializesSpecifier()
581+
let accesses = self.parseAccessesSpecifier()
582+
583+
if initializes == nil, accesses == nil {
584+
return nil
585+
}
586+
587+
return RawAccessorInitEffectsSyntax(
588+
initializesEffect: initializes,
589+
accessesEffect: accesses,
590+
arena: self.arena
591+
)
592+
}
593+
594+
mutating func parseInitializesSpecifier() -> RawInitializesEffectSyntax? {
595+
guard let keyword = self.consume(if: .keyword(.initializes)) else {
596+
return nil
597+
}
598+
599+
let (unexpectedBeforeLeftParen, leftParen) = self.expect(.leftParen)
600+
601+
let args = parseArgumentListElements(pattern: .none)
602+
let argumentList = RawTupleExprElementListSyntax(
603+
elements: args,
604+
arena: self.arena
605+
)
606+
607+
let (unexpectedBeforeRightParen, rightParen) = self.expect(.rightParen)
608+
609+
return RawInitializesEffectSyntax(
610+
initializesKeyword: keyword,
611+
unexpectedBeforeLeftParen,
612+
leftParen: leftParen,
613+
propertyList: argumentList,
614+
unexpectedBeforeRightParen,
615+
rightParen: rightParen,
616+
arena: self.arena
617+
)
618+
}
619+
620+
mutating func parseAccessesSpecifier() -> RawAccessesEffectSyntax? {
621+
guard let keyword = self.consume(if: .keyword(.accesses)) else {
622+
return nil
623+
}
624+
625+
let (unexpectedBeforeLeftParen, leftParen) = self.expect(.leftParen)
626+
627+
let args = parseArgumentListElements(pattern: .none)
628+
let argumentList = RawTupleExprElementListSyntax(
629+
elements: args,
630+
arena: self.arena
631+
)
632+
633+
let (unexpectedBeforeRightParen, rightParen) = self.expect(.rightParen)
634+
635+
return RawAccessesEffectSyntax(
636+
accessesKeyword: keyword,
637+
unexpectedBeforeLeftParen,
638+
leftParen: leftParen,
639+
propertyList: argumentList,
640+
unexpectedBeforeRightParen,
641+
rightParen: rightParen,
642+
arena: self.arena
643+
)
644+
}
645+
}

Tests/SwiftParserTest/DeclarationTests.swift

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -918,6 +918,48 @@ final class DeclarationTests: XCTestCase {
918918
)
919919
}
920920

921+
func testInitAccessorEffects() {
922+
assertParse(
923+
"""
924+
struct S {
925+
var value: Int {
926+
init initializes(x) {}
927+
}
928+
}
929+
"""
930+
)
931+
932+
assertParse(
933+
"""
934+
struct S {
935+
var value: Int {
936+
init accesses(x) {}
937+
}
938+
}
939+
"""
940+
)
941+
942+
assertParse(
943+
"""
944+
struct S {
945+
var value: Int {
946+
init initializes(x) accesses(y) {}
947+
}
948+
}
949+
"""
950+
)
951+
952+
assertParse(
953+
"""
954+
struct S {
955+
var value: Int {
956+
init initializes(x, y, z) accesses(x, y, z) {}
957+
}
958+
}
959+
"""
960+
)
961+
}
962+
921963
func testExpressionMember() {
922964
assertParse(
923965
"""

0 commit comments

Comments
 (0)