Skip to content

Commit 5d23aa5

Browse files
Simplified recovery logic for parsing function signature in deinit
1 parent 28dfb1b commit 5d23aa5

File tree

2 files changed

+6
-85
lines changed

2 files changed

+6
-85
lines changed

Sources/SwiftParser/Declarations.swift

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1122,7 +1122,6 @@ extension Parser {
11221122
let (unexpectedBeforeDeinitKeyword, deinitKeyword) = self.eat(handle)
11231123

11241124
var unexpectedNameAndSignature: [RawSyntax?] = []
1125-
var unexpectedAfterAsync: [RawSyntax?] = []
11261125

11271126
// async is a contextual keyword
11281127
// must be parsed before attempting to parse identifier
@@ -1135,24 +1134,12 @@ extension Parser {
11351134
effectSpecifiers = parseDeinitEffectSpecifiers()
11361135
}
11371136
if effectSpecifiers == nil && self.at(.leftParen) && !self.currentToken.isAtStartOfLine {
1138-
let sig = parseFunctionSignature()
1139-
unexpectedNameAndSignature.append(contentsOf: sig.unexpectedBeforeInput?.elements ?? [])
1140-
unexpectedNameAndSignature.append(RawSyntax(sig.input))
1141-
unexpectedNameAndSignature.append(contentsOf: sig.unexpectedBetweenInputAndEffectSpecifiers?.elements ?? [])
1142-
if let effects = sig.effectSpecifiers {
1143-
effectSpecifiers = RawDeinitEffectSpecifiersSyntax(
1144-
effects.unexpectedBeforeAsyncSpecifier,
1145-
asyncSpecifier: effects.asyncSpecifier,
1146-
effects.unexpectedBetweenAsyncSpecifierAndThrowsSpecifier,
1147-
throwsSpecifier: effects.throwsSpecifier,
1148-
effects.unexpectedAfterThrowsSpecifier,
1149-
arena: self.arena
1150-
)
1151-
}
1152-
unexpectedAfterAsync.append(contentsOf: sig.unexpectedBetweenEffectSpecifiersAndOutput?.elements ?? [])
1153-
if let output = sig.output {
1154-
unexpectedAfterAsync.append(RawSyntax(output))
1137+
let input = parseParameterClause(RawParameterClauseSyntax.self) { parser in
1138+
parser.parseFunctionParameter()
11551139
}
1140+
unexpectedNameAndSignature.append(RawSyntax(input))
1141+
1142+
effectSpecifiers = parseDeinitEffectSpecifiers()
11561143
}
11571144
let items = self.parseOptionalCodeBlock()
11581145
return RawDeinitializerDeclSyntax(
@@ -1162,7 +1149,7 @@ extension Parser {
11621149
deinitKeyword: deinitKeyword,
11631150
RawUnexpectedNodesSyntax(unexpectedNameAndSignature, arena: self.arena),
11641151
effectSpecifiers: effectSpecifiers,
1165-
RawUnexpectedNodesSyntax(unexpectedAfterAsync, arena: self.arena),
1152+
nil,
11661153
body: items,
11671154
arena: self.arena
11681155
)

Sources/SwiftParser/Specifiers.swift

Lines changed: 0 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -463,72 +463,6 @@ extension RawDeinitEffectSpecifiersSyntax {
463463
}
464464
}
465465
}
466-
467-
public init(
468-
_ unexpectedBeforeAsyncSpecifier: RawUnexpectedNodesSyntax? = nil,
469-
asyncSpecifier: RawTokenSyntax?,
470-
_ unexpectedBetweenAsyncSpecifierAndThrowsSpecifier: RawUnexpectedNodesSyntax? = nil,
471-
throwsSpecifier: RawTokenSyntax?,
472-
_ unexpectedAfterThrowsSpecifier: RawUnexpectedNodesSyntax? = nil,
473-
arena: __shared SyntaxArena
474-
) {
475-
// Missing async keyword was created, meaning that throws and async are swapped
476-
if asyncSpecifier?.isMissing ?? false {
477-
var unexpectedBeforeAsync: [RawSyntax?] = []
478-
var asyncKeyword: RawTokenSyntax? = asyncSpecifier?.raw.as(RawTokenSyntax.self)
479-
var unexpectedAfterAsync: [RawSyntax?] = []
480-
481-
unexpectedBeforeAsync.append(contentsOf: unexpectedBeforeAsyncSpecifier?.elements ?? [])
482-
unexpectedBeforeAsync.append(contentsOf: unexpectedBetweenAsyncSpecifierAndThrowsSpecifier?.elements ?? [])
483-
if let throwsKeyword = throwsSpecifier, !throwsKeyword.isMissing {
484-
unexpectedBeforeAsync.append(RawSyntax(throwsKeyword))
485-
}
486-
for elem in unexpectedAfterThrowsSpecifier?.elements ?? [] {
487-
if let token = Syntax(raw: elem).as(TokenSyntax.self) {
488-
if token.tokenKind == .keyword(.async) {
489-
asyncKeyword = elem.as(RawTokenSyntax.self)
490-
} else {
491-
if asyncKeyword?.isMissing ?? true {
492-
unexpectedBeforeAsync.append(elem)
493-
} else {
494-
unexpectedAfterAsync.append(elem)
495-
}
496-
}
497-
}
498-
}
499-
self.init(
500-
RawUnexpectedNodesSyntax(unexpectedBeforeAsync, arena: arena),
501-
asyncSpecifier: asyncKeyword,
502-
RawUnexpectedNodesSyntax(unexpectedAfterAsync, arena: arena),
503-
arena: arena
504-
)
505-
} else {
506-
let unexpectedAfterAsync: RawUnexpectedNodesSyntax?
507-
if let throwsSpecifier = throwsSpecifier, throwsSpecifier.presence == .present {
508-
var unexpected: [RawSyntax] = unexpectedBetweenAsyncSpecifierAndThrowsSpecifier?.elements ?? []
509-
unexpected.append(throwsSpecifier.raw)
510-
unexpected.append(contentsOf: unexpectedAfterThrowsSpecifier?.elements ?? [])
511-
unexpectedAfterAsync = RawUnexpectedNodesSyntax(unexpected, arena: arena)
512-
} else {
513-
if let afterThrows = unexpectedAfterThrowsSpecifier {
514-
if let beforeThrows = unexpectedBetweenAsyncSpecifierAndThrowsSpecifier {
515-
unexpectedAfterAsync = RawUnexpectedNodesSyntax(beforeThrows.elements + afterThrows.elements, arena: arena)
516-
} else {
517-
unexpectedAfterAsync = afterThrows
518-
}
519-
} else {
520-
unexpectedAfterAsync = unexpectedBetweenAsyncSpecifierAndThrowsSpecifier
521-
}
522-
}
523-
524-
self.init(
525-
unexpectedBeforeAsyncSpecifier,
526-
asyncSpecifier: asyncSpecifier,
527-
unexpectedAfterAsync,
528-
arena: arena
529-
)
530-
}
531-
}
532466
}
533467

534468
extension TokenConsumer {

0 commit comments

Comments
 (0)