Skip to content

Commit eb10985

Browse files
Find correct async token in unexpectedAfterThrowsSpecifier
1 parent 9a191e8 commit eb10985

File tree

2 files changed

+51
-41
lines changed

2 files changed

+51
-41
lines changed

Sources/SwiftParser/Specifiers.swift

Lines changed: 51 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -472,50 +472,62 @@ extension RawDeinitEffectSpecifiersSyntax {
472472
_ unexpectedAfterThrowsSpecifier: RawUnexpectedNodesSyntax? = nil,
473473
arena: __shared SyntaxArena
474474
) {
475-
/*
476-
if asyncKeyword?.isMissing ?? false {
477-
unexpectedBeforeAsync.append(contentsOf: effects.unexpectedBetweenAsyncSpecifierAndThrowsSpecifier?.elements ?? [])
478-
if let throwsKeyword = sig.effectSpecifiers?.throwsSpecifier {
479-
unexpectedBeforeAsync.append(RawSyntax(throwsKeyword))
480-
}
481-
for elem in effects.unexpectedAfterThrowsSpecifier?.elements ?? [] {
482-
if let token = Syntax(raw: elem).as(TokenSyntax.self) {
483-
if AsyncEffectSpecifier(token: token) != nil {
484-
asyncKeyword = elem.as(RawTokenSyntax.self)!
485-
} else {
486-
if asyncKeyword?.isMissing ?? true {
487-
unexpectedBeforeAsync.append(elem)
488-
} else {
489-
unexpectedAfterAsync.append(elem)
490-
}
491-
}
492-
}
493-
}
494-
*/
495-
let unexpectedAfterAsync: RawUnexpectedNodesSyntax?
496-
if let throwsSpecifier = throwsSpecifier, throwsSpecifier.presence == .present {
497-
var unexpected: [RawSyntax] = unexpectedBetweenAsyncSpecifierAndThrowsSpecifier?.elements ?? []
498-
unexpected.append(throwsSpecifier.raw)
499-
unexpected.append(contentsOf: unexpectedAfterThrowsSpecifier?.elements ?? [])
500-
unexpectedAfterAsync = RawUnexpectedNodesSyntax(unexpected, arena: arena)
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+
)
501505
} else {
502-
if let afterThrows = unexpectedAfterThrowsSpecifier {
503-
if let beforeThrows = unexpectedBetweenAsyncSpecifierAndThrowsSpecifier {
504-
unexpectedAfterAsync = RawUnexpectedNodesSyntax(beforeThrows.elements + afterThrows.elements, arena: arena)
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+
}
505519
} else {
506-
unexpectedAfterAsync = afterThrows
520+
unexpectedAfterAsync = unexpectedBetweenAsyncSpecifierAndThrowsSpecifier
507521
}
508-
} else {
509-
unexpectedAfterAsync = unexpectedBetweenAsyncSpecifierAndThrowsSpecifier
510522
}
523+
524+
self.init(
525+
unexpectedBeforeAsyncSpecifier,
526+
asyncSpecifier: asyncSpecifier,
527+
unexpectedAfterAsync,
528+
arena: arena
529+
)
511530
}
512-
513-
self.init(
514-
unexpectedBeforeAsyncSpecifier,
515-
asyncSpecifier: asyncSpecifier,
516-
unexpectedAfterAsync,
517-
arena: arena
518-
)
519531
}
520532
}
521533

Tests/SwiftParserTest/translated/InitDeinitTests.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -575,7 +575,6 @@ final class InitDeinitTests: XCTestCase {
575575
}
576576

577577
func testDeinitNameAwait() {
578-
// TODO: Fix this
579578
assertParse(
580579
"""
581580
class FooClassDeinitializerA {
@@ -595,7 +594,6 @@ final class InitDeinitTests: XCTestCase {
595594
}
596595

597596
func testDeinitNameAsyncAsync() {
598-
// TODO: Fix this
599597
assertParse(
600598
"""
601599
class FooClassDeinitializerA {

0 commit comments

Comments
 (0)