Skip to content

Commit 1faaae9

Browse files
committed
Make keyword precedence exhaustive
1 parent 13f113e commit 1faaae9

File tree

1 file changed

+245
-10
lines changed

1 file changed

+245
-10
lines changed

Sources/SwiftParser/TokenPrecedence.swift

Lines changed: 245 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -192,29 +192,34 @@ enum TokenPrecedence: Comparable {
192192
case // Literals
193193
.Self, .false, .nil, .`self`, .super, .true:
194194
self = .identifierLike
195+
195196
// MARK: Expr keyword
196-
case // Keywords
197-
.as, .is, .try,
197+
case // Keywords
198+
.as, .is, .some, .try,
199+
.await, .reasync, .async,
198200
// We don't know much about which contextual keyword it is, be conservative an allow considering it as unexpected.
199201
// Keywords in function types (we should be allowed to skip them inside parenthesis)
200202
.rethrows, .throws,
201203
// Consider 'any' a prefix operator to a type and a type is expression-like.
202204
.Any,
203205
// 'where' can only occur in the signature of declarations. Consider the signature expression-like.
204206
.where,
207+
.each,
205208
// 'in' occurs in closure input/output definitions and for loops. Consider both constructs expression-like.
206209
.in:
207210
self = .exprKeyword
208-
case // Control-flow constructs
211+
212+
case // Control-flow constructs
209213
.defer, .do, .for, .guard, .if, .repeat, .switch, .while,
210214
// Secondary parts of control-flow constructs
211215
.case, .catch, .default, .else,
212216
// Return-like statements
213217
.break, .continue, .fallthrough, .return, .throw, .then, .yield:
214218
self = .stmtKeyword
219+
215220
// MARK: Decl keywords
216-
case // Types
217-
.associatedtype, .class, .enum, .extension, .protocol, .struct, .typealias,
221+
case // Types
222+
.associatedtype, .class, .enum, .extension, .protocol, .struct, .typealias, .actor,
218223
// Access modifiers
219224
.fileprivate, .internal, .private, .public, .static,
220225
// Functions
@@ -225,15 +230,245 @@ enum TokenPrecedence: Comparable {
225230
.operator, .precedencegroup,
226231
// Declaration Modifiers
227232
.__consuming, .final, .required, .optional, .lazy, .dynamic, .infix, .postfix, .prefix, .mutating, .nonmutating, .convenience, .override, .package, .open,
228-
.__setter_access, .indirect, .nonisolated, .distributed, ._local,
229-
.inout, ._mutating, ._borrowing, ._consuming,
233+
.__setter_access, .indirect, .isolated, .nonisolated, .distributed, .unchecked, ._local,
234+
.inout, ._mutating, ._borrow, ._borrowing, .borrowing, ._consuming, .consuming, .consume,
235+
._backDeploy, .backDeployed,
230236
// Misc
231237
.import:
232238
self = .declKeyword
233-
default:
234-
// Treat all keywords that weren't handled above as expression keywords as a fallback option.
235-
// FIXME: We should assign a token precedence to all keywords
239+
240+
case .__owned:
241+
self = .exprKeyword
242+
case .__shared:
243+
self = .exprKeyword
244+
case ._alignment:
245+
self = .exprKeyword
246+
case ._cdecl:
247+
self = .exprKeyword
248+
case ._Class:
249+
self = .exprKeyword
250+
case ._compilerInitialized:
251+
self = .exprKeyword
252+
case ._const:
253+
self = .exprKeyword
254+
case ._documentation:
255+
self = .exprKeyword
256+
case ._dynamicReplacement:
257+
self = .exprKeyword
258+
case ._effects:
259+
self = .exprKeyword
260+
case ._expose:
261+
self = .exprKeyword
262+
case ._forward:
263+
self = .exprKeyword
264+
case ._implements:
265+
self = .exprKeyword
266+
case ._linear:
267+
self = .exprKeyword
268+
case ._modify:
269+
self = .exprKeyword
270+
case ._move:
271+
self = .exprKeyword
272+
case ._NativeClass:
273+
self = .exprKeyword
274+
case ._NativeRefCountedObject:
275+
self = .exprKeyword
276+
case ._noMetadata:
277+
self = .exprKeyword
278+
case ._nonSendable:
279+
self = .exprKeyword
280+
case ._objcImplementation:
281+
self = .exprKeyword
282+
case ._objcRuntimeName:
283+
self = .exprKeyword
284+
case ._opaqueReturnTypeOf:
285+
self = .exprKeyword
286+
case ._optimize:
287+
self = .exprKeyword
288+
case ._originallyDefinedIn:
289+
self = .exprKeyword
290+
case ._PackageDescription:
291+
self = .exprKeyword
292+
case ._private:
293+
self = .exprKeyword
294+
case ._projectedValueProperty:
295+
self = .exprKeyword
296+
case ._read:
297+
self = .exprKeyword
298+
case ._RefCountedObject:
299+
self = .exprKeyword
300+
case ._semantics:
301+
self = .exprKeyword
302+
case ._specialize:
303+
self = .exprKeyword
304+
case ._spi:
305+
self = .exprKeyword
306+
case ._spi_available:
307+
self = .exprKeyword
308+
case ._swift_native_objc_runtime_base:
309+
self = .exprKeyword
310+
case ._Trivial:
311+
self = .exprKeyword
312+
case ._TrivialAtMost:
313+
self = .exprKeyword
314+
case ._typeEraser:
315+
self = .exprKeyword
316+
case ._unavailableFromAsync:
317+
self = .exprKeyword
318+
case ._underlyingVersion:
319+
self = .exprKeyword
320+
case ._UnknownLayout:
321+
self = .exprKeyword
322+
case ._version:
323+
self = .exprKeyword
324+
case .accesses:
325+
self = .exprKeyword
326+
case .addressWithNativeOwner:
327+
self = .exprKeyword
328+
case .addressWithOwner:
329+
self = .exprKeyword
330+
case .any:
331+
self = .exprKeyword
332+
case .assignment:
333+
self = .exprKeyword
334+
case .associativity:
335+
self = .exprKeyword
336+
case .attached:
337+
self = .exprKeyword
338+
case .autoclosure:
339+
self = .exprKeyword
340+
case .availability:
341+
self = .exprKeyword
342+
case .available:
343+
self = .exprKeyword
344+
case .before:
345+
self = .exprKeyword
346+
case .block:
347+
self = .exprKeyword
348+
case .canImport:
349+
self = .exprKeyword
350+
case .compiler:
351+
self = .exprKeyword
352+
case .copy:
353+
self = .exprKeyword
354+
case .convention:
355+
self = .exprKeyword
356+
case .cType:
357+
self = .exprKeyword
358+
case .deprecated:
359+
self = .exprKeyword
360+
case .derivative:
361+
self = .exprKeyword
362+
case .didSet:
363+
self = .exprKeyword
364+
case .differentiable:
365+
self = .exprKeyword
366+
case .escaping:
367+
self = .exprKeyword
368+
case .exclusivity:
369+
self = .exprKeyword
370+
case .exported:
371+
self = .exprKeyword
372+
case .file:
373+
self = .exprKeyword
374+
case .discard:
375+
self = .exprKeyword
376+
case .forward:
377+
self = .exprKeyword
378+
case .get:
379+
self = .exprKeyword
380+
case .higherThan:
381+
self = .exprKeyword
382+
case .initializes:
383+
self = .exprKeyword
384+
case .inline:
385+
self = .exprKeyword
386+
case .introduced:
387+
self = .exprKeyword
388+
case .kind:
389+
self = .exprKeyword
390+
case .left:
391+
self = .exprKeyword
392+
case .line:
393+
self = .exprKeyword
394+
case .linear:
395+
self = .exprKeyword
396+
case .lowerThan:
397+
self = .exprKeyword
398+
case .macro:
399+
self = .exprKeyword
400+
case .message:
401+
self = .exprKeyword
402+
case .metadata:
403+
self = .exprKeyword
404+
case .module:
405+
self = .exprKeyword
406+
case .mutableAddressWithNativeOwner:
407+
self = .exprKeyword
408+
case .mutableAddressWithOwner:
409+
self = .exprKeyword
410+
case .noasync:
411+
self = .exprKeyword
412+
case .noDerivative:
413+
self = .exprKeyword
414+
case .noescape:
415+
self = .exprKeyword
416+
case .none:
417+
self = .exprKeyword
418+
case .objc:
419+
self = .exprKeyword
420+
case .obsoleted:
421+
self = .exprKeyword
422+
case .of:
423+
self = .exprKeyword
424+
case .Protocol:
425+
self = .exprKeyword
426+
case .renamed:
427+
self = .exprKeyword
428+
case .reverse:
429+
self = .exprKeyword
430+
case .right:
431+
self = .exprKeyword
432+
case .safe:
433+
self = .exprKeyword
434+
case .Sendable:
435+
self = .exprKeyword
436+
case .set:
437+
self = .exprKeyword
438+
case .sourceFile:
439+
self = .exprKeyword
440+
case .spi:
441+
self = .exprKeyword
442+
case .spiModule:
443+
self = .exprKeyword
444+
case .swift:
445+
self = .exprKeyword
446+
case .target:
447+
self = .exprKeyword
448+
case .transpose:
449+
self = .exprKeyword
450+
case .Type:
451+
self = .exprKeyword
452+
case .unavailable:
453+
self = .exprKeyword
454+
case .unowned:
455+
self = .exprKeyword
456+
case .unsafeAddress:
457+
self = .exprKeyword
458+
case .unsafeMutableAddress:
459+
self = .exprKeyword
460+
case .visibility:
461+
self = .exprKeyword
462+
case .weak:
463+
self = .exprKeyword
464+
case .willSet:
465+
self = .exprKeyword
466+
case .witness_method:
467+
self = .exprKeyword
468+
case .wrt:
236469
self = .exprKeyword
470+
case .unsafe:
471+
self = .exprKeyword
237472
}
238473
}
239474
}

0 commit comments

Comments
 (0)