@@ -28,41 +28,40 @@ extension ASTGenVisitor {
2828 }
2929
3030 public func visit( _ node: MemberTypeIdentifierSyntax ) -> ASTNode {
31- var path = [ ( TokenSyntax, GenericArgumentClauseSyntax? ) ] ( )
32- var memberRef : Syntax ? = Syntax ( node)
33- while let nestedMember = memberRef? . as ( MemberTypeIdentifierSyntax . self) {
34- path. append ( ( nestedMember. name, nestedMember. genericArgumentClause) )
35- memberRef = Syntax ( nestedMember. baseType)
36- }
31+ // Gather the member components, in decreasing depth order.
32+ var reverseMemberComponents = [ UnsafeMutableRawPointer] ( )
3733
38- if let base = memberRef? . as ( SimpleTypeIdentifierSyntax . self) {
39- path. append ( ( base. name, base. genericArgumentClause) )
40- }
34+ var baseType = Syntax ( node)
35+ while let memberType = baseType. as ( MemberTypeIdentifierSyntax . self) {
36+ let nameToken = memberType. name
37+ let generics = memberType. genericArgumentClause
4138
42- var elements = [ UnsafeMutableRawPointer] ( )
43- for (pathElement, generics) in path. reversed ( ) {
44- var nameText = pathElement. text
39+ var nameText = nameToken. text
4540 let name = nameText. withUTF8 { buf in
4641 return SwiftASTContext_getIdentifier ( ctx, buf. baseAddress, buf. count)
4742 }
48- let nameLoc = self . base. advanced ( by: pathElement . position. utf8Offset) . raw
43+ let nameLoc = self . base. advanced ( by: nameToken . position. utf8Offset) . raw
4944
5045 if let generics = generics {
5146 let lAngle = self . base. advanced ( by: generics. leftAngleBracket. position. utf8Offset) . raw
5247 let rAngle = self . base. advanced ( by: generics. rightAngleBracket. position. utf8Offset) . raw
53- elements . append (
48+ reverseMemberComponents . append (
5449 generics. arguments. map ( { self . visit ( $0. argumentType) } ) . withBridgedArrayRef {
5550 genericArgs in
5651 GenericIdentTypeRepr_create ( self . ctx, name, nameLoc, genericArgs, lAngle, rAngle)
5752 } )
5853 } else {
59- elements . append ( SimpleIdentTypeRepr_create ( self . ctx, nameLoc, name) )
54+ reverseMemberComponents . append ( SimpleIdentTypeRepr_create ( self . ctx, nameLoc, name) )
6055 }
56+
57+ baseType = Syntax ( memberType. baseType)
6158 }
6259
60+ let baseComponent = visit ( baseType) . rawValue
61+
6362 return . type(
64- elements . withBridgedArrayRef { elements in
65- return DeclRefTypeRepr_create ( self . ctx, elements )
63+ reverseMemberComponents . reversed ( ) . withBridgedArrayRef { memberComponents in
64+ return MemberTypeRepr_create ( self . ctx, baseComponent , memberComponents )
6665 } )
6766 }
6867
0 commit comments