@@ -151,7 +151,7 @@ extension Parser {
151
151
152
152
if self . lookahead ( ) . canParseBaseTypeForQualifiedDeclName ( ) {
153
153
type = RawExprSyntax ( RawTypeExprSyntax ( type: self . parseQualifiedTypeIdentifier ( ) , arena: self . arena) )
154
- period = self . consumePrefix ( " . " , as: . period)
154
+ period = self . expectWithoutRecovery ( prefix : " . " , as: . period)
155
155
} else {
156
156
type = nil
157
157
period = nil
@@ -181,52 +181,70 @@ extension Parser {
181
181
return RawTypeSyntax ( self . parseAnyType ( ) )
182
182
}
183
183
184
- var result : RawTypeSyntax ?
185
- var keepGoing : RawTokenSyntax ? = nil
184
+ let ( unexpectedBeforeName, name) = self . expect ( anyIn: IdentifierTypeSyntax . NameOptions. self, default: . identifier)
185
+ let generics : RawGenericArgumentClauseSyntax ?
186
+ if self . atContextualPunctuator ( " < " ) {
187
+ generics = self . parseGenericArguments ( )
188
+ } else {
189
+ generics = nil
190
+ }
191
+
192
+ var result = RawTypeSyntax (
193
+ RawIdentifierTypeSyntax (
194
+ unexpectedBeforeName,
195
+ name: name,
196
+ genericArgumentClause: generics,
197
+ arena: self . arena
198
+ )
199
+ )
200
+
201
+ // If qualified name base type cannot be parsed from the current
202
+ // point (i.e. the next type identifier is not followed by a '.'),
203
+ // then the next identifier is the final declaration name component.
204
+ var backtrack = self . lookahead ( )
205
+ guard
206
+ backtrack. consume ( ifPrefix: " . " , as: . period) != nil ,
207
+ backtrack. canParseBaseTypeForQualifiedDeclName ( )
208
+ else {
209
+ return result
210
+ }
211
+
212
+ var keepGoing = self . consume ( if: . period)
186
213
var loopProgress = LoopProgressCondition ( )
187
- repeat {
188
- let ( unexpectedBeforeName, name) = self . expect ( . identifier, . keyword( . self ) , . keyword ( . Self) , default: . identifier)
214
+ while keepGoing != nil && self . hasProgressed ( & loopProgress ) {
215
+ let ( unexpectedBeforeName, name) = self . expect ( . identifier, . keyword( . self ) , TokenSpec ( . Self, remapping : . identifier ) , default: . identifier)
189
216
let generics : RawGenericArgumentClauseSyntax ?
190
217
if self . atContextualPunctuator ( " < " ) {
191
218
generics = self . parseGenericArguments ( )
192
219
} else {
193
220
generics = nil
194
221
}
195
- if let keepGoing {
196
- result = RawTypeSyntax (
197
- RawMemberTypeSyntax (
198
- baseType: result!,
199
- period: keepGoing,
200
- unexpectedBeforeName,
201
- name: name,
202
- genericArgumentClause: generics,
203
- arena: self . arena
204
- )
205
- )
206
- } else {
207
- result = RawTypeSyntax (
208
- RawIdentifierTypeSyntax (
209
- unexpectedBeforeName,
210
- name: name,
211
- genericArgumentClause: generics,
212
- arena: self . arena
213
- )
222
+ result = RawTypeSyntax (
223
+ RawMemberTypeSyntax (
224
+ baseType: result,
225
+ period: keepGoing!,
226
+ unexpectedBeforeName,
227
+ name: name,
228
+ genericArgumentClause: generics,
229
+ arena: self . arena
214
230
)
215
- }
231
+ )
216
232
217
233
// If qualified name base type cannot be parsed from the current
218
234
// point (i.e. the next type identifier is not followed by a '.'),
219
235
// then the next identifier is the final declaration name component.
220
236
var backtrack = self . lookahead ( )
221
- backtrack. consumePrefix ( " . " , as: . period)
222
- guard backtrack. canParseBaseTypeForQualifiedDeclName ( ) else {
237
+ guard
238
+ backtrack. consume ( ifPrefix: " . " , as: . period) != nil ,
239
+ backtrack. canParseBaseTypeForQualifiedDeclName ( )
240
+ else {
223
241
break
224
242
}
225
243
226
244
keepGoing = self . consume ( if: . period)
227
- } while keepGoing != nil && self . hasProgressed ( & loopProgress )
245
+ }
228
246
229
- return result!
247
+ return result
230
248
}
231
249
}
232
250
0 commit comments