Skip to content

Commit d917d85

Browse files
hamishknightmeg-gupta
authored andcommitted
[ASTGen] Diagnose unknown accessor specifiers
1 parent 6f252ec commit d917d85

File tree

2 files changed

+24
-13
lines changed

2 files changed

+24
-13
lines changed

lib/ASTGen/Sources/ASTGen/Decls.swift

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ extension ASTGenVisitor {
288288
// MARK: - AbstractStorageDecl
289289

290290
extension ASTGenVisitor {
291-
private func generate(accessorSpecifier specifier: TokenSyntax) -> BridgedAccessorKind {
291+
private func generate(accessorSpecifier specifier: TokenSyntax) -> BridgedAccessorKind? {
292292
switch specifier.keywordKind {
293293
case .get:
294294
return .get
@@ -300,35 +300,33 @@ extension ASTGenVisitor {
300300
return .willSet
301301
case .unsafeAddress:
302302
return .address
303-
case .addressWithOwner:
304-
return .address
305-
case .addressWithNativeOwner:
306-
return .address
307303
case .unsafeMutableAddress:
308304
return .mutableAddress
309-
case .mutableAddressWithOwner:
310-
return .mutableAddress
311-
case .mutableAddressWithNativeOwner:
312-
return .mutableAddress
313305
case ._read:
314306
return .read
315307
case ._modify:
316308
return .modify
317309
case .`init`:
318310
return .`init`
319311
default:
320-
fatalError("Should have diagnosed this")
312+
self.diagnose(Diagnostic(node: specifier, message: UnknownAccessorSpecifierError(specifier)))
313+
return nil
321314
}
322315
}
323316

324317
private func generate(
325318
accessorDecl node: AccessorDeclSyntax,
326319
for storage: BridgedAbstractStorageDecl
327-
) -> BridgedAccessorDecl {
320+
) -> BridgedAccessorDecl? {
321+
guard let kind = self.generate(accessorSpecifier: node.accessorSpecifier) else {
322+
// TODO: We could potentially recover if this is the first accessor by treating
323+
// it as an implicit getter.
324+
return nil
325+
}
328326
let accessor = BridgedAccessorDecl.createParsed(
329327
self.ctx,
330328
declContext: self.declContext,
331-
kind: self.generate(accessorSpecifier: node.accessorSpecifier),
329+
kind: kind,
332330
storage: storage,
333331
declLoc: self.generateSourceLoc(node.accessorSpecifier),
334332
accessorKeywordLoc: self.generateSourceLoc(node.accessorSpecifier),
@@ -358,7 +356,9 @@ extension ASTGenVisitor {
358356
case .accessors(let accessors):
359357
return BridgedAccessorRecord(
360358
lBraceLoc: leftBrace,
361-
accessors: accessors.lazy.map { self.generate(accessorDecl: $0, for: storage) }.bridgedArray(in: self),
359+
accessors: accessors.lazy.compactMap {
360+
self.generate(accessorDecl: $0, for: storage)
361+
}.bridgedArray(in: self),
362362
rBraceLoc: rightBrace
363363
)
364364
case .getter(let codeBlock):

lib/ASTGen/Sources/ASTGen/Diagnostics.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,3 +101,14 @@ struct NonTrivialPatternForAccessorError: ASTGenError {
101101
"getter/setter can only be defined for a single variable"
102102
}
103103
}
104+
105+
struct UnknownAccessorSpecifierError: ASTGenError {
106+
var specifier: TokenSyntax
107+
init(_ specifier: TokenSyntax) {
108+
self.specifier = specifier
109+
}
110+
111+
var message: String {
112+
"unknown accessor specifier '\(specifier.text)'"
113+
}
114+
}

0 commit comments

Comments
 (0)