@@ -28,41 +28,40 @@ extension ASTGenVisitor {
28
28
}
29
29
30
30
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] ( )
37
33
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
41
38
42
- var elements = [ UnsafeMutableRawPointer] ( )
43
- for (pathElement, generics) in path. reversed ( ) {
44
- var nameText = pathElement. text
39
+ var nameText = nameToken. text
45
40
let name = nameText. withUTF8 { buf in
46
41
return SwiftASTContext_getIdentifier ( ctx, buf. baseAddress, buf. count)
47
42
}
48
- let nameLoc = self . base. advanced ( by: pathElement . position. utf8Offset) . raw
43
+ let nameLoc = self . base. advanced ( by: nameToken . position. utf8Offset) . raw
49
44
50
45
if let generics = generics {
51
46
let lAngle = self . base. advanced ( by: generics. leftAngleBracket. position. utf8Offset) . raw
52
47
let rAngle = self . base. advanced ( by: generics. rightAngleBracket. position. utf8Offset) . raw
53
- elements . append (
48
+ reverseMemberComponents . append (
54
49
generics. arguments. map ( { self . visit ( $0. argumentType) } ) . withBridgedArrayRef {
55
50
genericArgs in
56
51
GenericIdentTypeRepr_create ( self . ctx, name, nameLoc, genericArgs, lAngle, rAngle)
57
52
} )
58
53
} else {
59
- elements . append ( SimpleIdentTypeRepr_create ( self . ctx, nameLoc, name) )
54
+ reverseMemberComponents . append ( SimpleIdentTypeRepr_create ( self . ctx, nameLoc, name) )
60
55
}
56
+
57
+ baseType = Syntax ( memberType. baseType)
61
58
}
62
59
60
+ let baseComponent = visit ( baseType) . rawValue
61
+
63
62
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 )
66
65
} )
67
66
}
68
67
0 commit comments