Skip to content

Commit 6af1c1d

Browse files
hborlaahoppen
authored andcommitted
Parse initializes and accesses specifiers in init accessors.
1 parent d254e24 commit 6af1c1d

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
@@ -1531,6 +1531,7 @@ extension Parser {
15311531
}
15321532

15331533
let effectSpecifiers = self.parseAccessorEffectSpecifiers()
1534+
let initEffects = self.parseInitAccessorEffects()
15341535

15351536
let body = self.parseOptionalCodeBlock()
15361537
return RawAccessorDeclSyntax(
@@ -1540,6 +1541,7 @@ extension Parser {
15401541
accessorKind: introducer.token,
15411542
parameter: parameter,
15421543
effectSpecifiers: effectSpecifiers,
1544+
initEffects: initEffects,
15431545
body: body,
15441546
arena: self.arena
15451547
)

Sources/SwiftParser/Specifiers.swift

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

Tests/SwiftParserTest/DeclarationTests.swift

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -791,6 +791,48 @@ final class DeclarationTests: XCTestCase {
791791
)
792792
}
793793

794+
func testInitAccessorEffects() {
795+
assertParse(
796+
"""
797+
struct S {
798+
var value: Int {
799+
init initializes(x) {}
800+
}
801+
}
802+
"""
803+
)
804+
805+
assertParse(
806+
"""
807+
struct S {
808+
var value: Int {
809+
init accesses(x) {}
810+
}
811+
}
812+
"""
813+
)
814+
815+
assertParse(
816+
"""
817+
struct S {
818+
var value: Int {
819+
init initializes(x) accesses(y) {}
820+
}
821+
}
822+
"""
823+
)
824+
825+
assertParse(
826+
"""
827+
struct S {
828+
var value: Int {
829+
init initializes(x, y, z) accesses(x, y, z) {}
830+
}
831+
}
832+
"""
833+
)
834+
}
835+
794836
func testExpressionMember() {
795837
assertParse(
796838
"""

0 commit comments

Comments
 (0)