@@ -151,7 +151,7 @@ extension Parser {
151151
152152 if self . lookahead ( ) . canParseBaseTypeForQualifiedDeclName ( ) {
153153 type = RawExprSyntax ( RawTypeExprSyntax ( type: self . parseQualifiedTypeIdentifier ( ) , arena: self . arena) )
154- period = self . consumePrefix ( " . " , as: . period)
154+ period = self . expectWithoutRecovery ( prefix : " . " , as: . period)
155155 } else {
156156 type = nil
157157 period = nil
@@ -181,52 +181,70 @@ extension Parser {
181181 return RawTypeSyntax ( self . parseAnyType ( ) )
182182 }
183183
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)
186213 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)
189216 let generics : RawGenericArgumentClauseSyntax ?
190217 if self . atContextualPunctuator ( " < " ) {
191218 generics = self . parseGenericArguments ( )
192219 } else {
193220 generics = nil
194221 }
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
214230 )
215- }
231+ )
216232
217233 // If qualified name base type cannot be parsed from the current
218234 // point (i.e. the next type identifier is not followed by a '.'),
219235 // then the next identifier is the final declaration name component.
220236 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 {
223241 break
224242 }
225243
226244 keepGoing = self . consume ( if: . period)
227- } while keepGoing != nil && self . hasProgressed ( & loopProgress )
245+ }
228246
229- return result!
247+ return result
230248 }
231249}
232250
0 commit comments