Skip to content

Commit 011f790

Browse files
committed
A couple of miscellaneous implementation improvements in the parser
1 parent f01f024 commit 011f790

File tree

5 files changed

+50
-23
lines changed

5 files changed

+50
-23
lines changed

Sources/SwiftParser/Expressions.swift

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -589,21 +589,18 @@ extension Parser {
589589
// First check to see if we have the start of a regex literal `/.../`.
590590
// tryLexRegexLiteral(/*forUnappliedOperator*/ false)
591591

592-
switch self.currentToken {
593592
// Try parse an 'if' or 'switch' as an expression. Note we do this here in
594593
// parseUnaryExpression as we don't allow postfix syntax to hang off such
595594
// expressions to avoid ambiguities such as postfix '.member', which can
596595
// currently be parsed as a static dot member for a result builder.
597-
case TokenSpec(.switch):
596+
if self.at(.keyword(.switch)) {
598597
return RawExprSyntax(
599598
parseSwitchExpression(switchHandle: .constant(.keyword(.switch)))
600599
)
601-
case TokenSpec(.if):
600+
} else if self.at(.keyword(.if)) {
602601
return RawExprSyntax(
603602
parseIfExpression(ifHandle: .constant(.keyword(.if)))
604603
)
605-
default:
606-
break
607604
}
608605

609606
switch self.at(anyIn: ExpressionPrefixOperator.self) {
@@ -951,7 +948,7 @@ extension Parser {
951948
// Check if the first '#if' body starts with '.' <identifier>, and parse
952949
// it as a "postfix ifconfig expression".
953950
do {
954-
var backtrack = self.lookahead()
951+
var lookahead = self.lookahead()
955952
// Skip to the first body. We may need to skip multiple '#if' directives
956953
// since we support nested '#if's. e.g.
957954
// baseExpr
@@ -960,13 +957,13 @@ extension Parser {
960957
// .someMember
961958
var loopProgress = LoopProgressCondition()
962959
repeat {
963-
backtrack.eat(.poundIf)
964-
while !backtrack.at(.endOfFile) && !backtrack.currentToken.isAtStartOfLine {
965-
backtrack.skipSingle()
960+
lookahead.eat(.poundIf)
961+
while !lookahead.at(.endOfFile) && !lookahead.currentToken.isAtStartOfLine {
962+
lookahead.skipSingle()
966963
}
967-
} while backtrack.at(.poundIf) && backtrack.hasProgressed(&loopProgress)
964+
} while lookahead.at(.poundIf) && lookahead.hasProgressed(&loopProgress)
968965

969-
guard backtrack.isAtStartOfPostfixExprSuffix() else {
966+
guard lookahead.isAtStartOfPostfixExprSuffix() else {
970967
break
971968
}
972969
}

Sources/SwiftParser/Nominals.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,9 +223,9 @@ extension Parser {
223223
inheritanceClause: nil,
224224
genericWhereClause: nil,
225225
memberBlock: RawMemberDeclBlockSyntax(
226-
leftBrace: RawTokenSyntax(missing: .leftBrace, arena: self.arena),
226+
leftBrace: missingToken(.leftBrace),
227227
members: RawMemberDeclListSyntax(elements: [], arena: self.arena),
228-
rightBrace: RawTokenSyntax(missing: .rightBrace, arena: self.arena),
228+
rightBrace: missingToken(.rightBrace),
229229
arena: self.arena
230230
),
231231
arena: self.arena

Sources/SwiftParser/Statements.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -921,7 +921,7 @@ extension Parser {
921921

922922
// label-name → identifier
923923
mutating func parseOptionalControlTransferTarget() -> RawTokenSyntax? {
924-
guard !self.currentToken.isAtStartOfLine else {
924+
guard !self.atStartOfLine else {
925925
return nil
926926
}
927927

Sources/SwiftParser/TokenConsumer.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ extension TokenConsumer {
128128
/// If this is the case, return the `Subset` case that the parser is positioned in
129129
/// as well as a handle to consume that token.
130130
@inline(__always)
131-
mutating func at<SpecSet: TokenSpecSet>(anyIn specSet: SpecSet.Type) -> (SpecSet, TokenConsumptionHandle)? {
131+
mutating func at<SpecSet: TokenSpecSet>(anyIn specSet: SpecSet.Type) -> (spec: SpecSet, handle: TokenConsumptionHandle)? {
132132
#if SWIFTPARSER_ENABLE_ALTERNATE_TOKEN_INTROSPECTION
133133
if shouldRecordAlternativeTokenChoices {
134134
recordAlternativeTokenChoice(for: self.currentToken, choices: specSet.allCases.map(\.spec))

Sources/SwiftParser/Types.swift

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -235,19 +235,49 @@ extension Parser {
235235
mutating func parseSimpleType(
236236
stopAtFirstPeriod: Bool = false
237237
) -> RawTypeSyntax {
238+
enum TypeBaseStart: TokenSpecSet {
239+
case `Self`
240+
case `Any`
241+
case identifier
242+
case leftParen
243+
case leftSquare
244+
case wildcard
245+
246+
init?(lexeme: Lexer.Lexeme) {
247+
switch PrepareForKeywordMatch(lexeme) {
248+
case .keyword(.Self): self = .Self
249+
case .keyword(.Any): self = .Any
250+
case .identifier: self = .identifier
251+
case .leftParen: self = .leftParen
252+
case .leftSquare: self = .leftSquare
253+
case .wildcard: self = .wildcard
254+
default: return nil
255+
}
256+
}
257+
258+
var spec: TokenSpec {
259+
switch self {
260+
case .Self: return .keyword(.Self)
261+
case .Any: return .keyword(.Any)
262+
case .identifier: return .identifier
263+
case .leftParen: return .leftParen
264+
case .leftSquare: return .leftSquare
265+
case .wildcard: return .wildcard
266+
}
267+
}
268+
}
269+
238270
var base: RawTypeSyntax
239-
switch self.currentToken {
240-
case TokenSpec(.Self),
241-
TokenSpec(.Any),
242-
TokenSpec(.identifier):
271+
switch self.at(anyIn: TypeBaseStart.self)?.spec {
272+
case .Self, .Any, .identifier:
243273
base = self.parseTypeIdentifier()
244-
case TokenSpec(.leftParen):
274+
case .leftParen:
245275
base = RawTypeSyntax(self.parseTupleTypeBody())
246-
case TokenSpec(.leftSquare):
276+
case .leftSquare:
247277
base = RawTypeSyntax(self.parseCollectionType())
248-
case TokenSpec(.wildcard):
278+
case .wildcard:
249279
base = RawTypeSyntax(self.parsePlaceholderType())
250-
default:
280+
case nil:
251281
return RawTypeSyntax(RawMissingTypeSyntax(arena: self.arena))
252282
}
253283

0 commit comments

Comments
 (0)