Skip to content

Commit 56a1809

Browse files
committed
ASTGen: Handle member types with non-identifier qualifiers
1 parent 0f2b748 commit 56a1809

File tree

3 files changed

+23
-24
lines changed

3 files changed

+23
-24
lines changed

include/swift/AST/CASTBridging.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,8 @@ void *ProtocolTypeRepr_create(void *ctx, void *baseType, void *protoLoc);
242242
void *PackExpansionTypeRepr_create(void *ctx, void *base, void *repeatLoc);
243243
void *TupleTypeRepr_create(void *ctx, BridgedArrayRef elements, void *lParenLoc,
244244
void *rParenLoc);
245-
void *DeclRefTypeRepr_create(void *ctx, BridgedArrayRef bridgedComponents);
245+
void *MemberTypeRepr_create(void *ctx, void *baseComponent,
246+
BridgedArrayRef bridgedMemberComponents);
246247
void *GenericIdentTypeRepr_create(void *ctx, BridgedIdentifier name,
247248
void *nameLoc, BridgedArrayRef genericArgs,
248249
void *lAngle, void *rAngle);

lib/AST/CASTBridging.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -497,14 +497,13 @@ void *TupleTypeRepr_create(void *ctx, BridgedArrayRef elements, void *lParenLoc,
497497
SourceRange{lParen, rParen});
498498
}
499499

500-
void *DeclRefTypeRepr_create(void *ctx, BridgedArrayRef bridgedComponents) {
500+
void *MemberTypeRepr_create(void *ctx, void *baseComponent,
501+
BridgedArrayRef bridgedMemberComponents) {
501502
ASTContext &Context = *static_cast<ASTContext *>(ctx);
502-
auto components = getArrayRef<IdentTypeRepr *>(bridgedComponents);
503-
if (components.size() == 1) {
504-
return components.front();
505-
}
503+
auto memberComponents = getArrayRef<IdentTypeRepr *>(bridgedMemberComponents);
506504

507-
return MemberTypeRepr::create(Context, components);
505+
return MemberTypeRepr::create(Context, (TypeRepr *)baseComponent,
506+
memberComponents);
508507
}
509508

510509
void *CompositionTypeRepr_create(void *ctx, BridgedArrayRef types,

lib/ASTGen/Sources/ASTGen/Types.swift

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)