Skip to content

Commit b6918a3

Browse files
authored
Merge pull request #79843 from rintaro/astgen-misc
[ASTGen] Misc fixes
2 parents 243cfe0 + a506bae commit b6918a3

File tree

7 files changed

+64
-38
lines changed

7 files changed

+64
-38
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2893,29 +2893,27 @@ struct BridgedRequirementRepr {
28932893
BridgedNullableTypeRepr SecondType;
28942894
BridgedLayoutConstraint LayoutConstraint;
28952895
BridgedSourceLoc LayoutConstraintLoc;
2896-
2897-
// TODO: bool IsExpansionPattern;
2896+
bool IsExpansionPattern;
28982897

28992898
swift::RequirementRepr unbridged() const;
29002899
};
29012900

2902-
SWIFT_NAME(
2903-
"BridgedRequirementRepr.createTypeConstraint(subject:colonLoc:constraint:)")
2904-
BridgedRequirementRepr
2905-
BridgedRequirementRepr_createTypeConstraint(BridgedTypeRepr cSubject,
2906-
BridgedSourceLoc cColonLoc,
2907-
BridgedTypeRepr cConstraint);
2908-
SWIFT_NAME(
2909-
"BridgedRequirementRepr.createSameType(firstType:equalLoc:secondType:)")
2910-
BridgedRequirementRepr
2911-
BridgedRequirementRepr_createSameType(BridgedTypeRepr cFirstType,
2912-
BridgedSourceLoc cEqualLoc,
2913-
BridgedTypeRepr cSecondType);
2901+
SWIFT_NAME("BridgedRequirementRepr.createTypeConstraint(subject:colonLoc:"
2902+
"constraint:isExpansionPattern:)")
2903+
BridgedRequirementRepr BridgedRequirementRepr_createTypeConstraint(
2904+
BridgedTypeRepr cSubject, BridgedSourceLoc cColonLoc,
2905+
BridgedTypeRepr cConstraint, bool isExpansionPattern);
2906+
SWIFT_NAME("BridgedRequirementRepr.createSameType(firstType:equalLoc:"
2907+
"secondType:isExpansionPattern:)")
2908+
BridgedRequirementRepr BridgedRequirementRepr_createSameType(
2909+
BridgedTypeRepr cFirstType, BridgedSourceLoc cEqualLoc,
2910+
BridgedTypeRepr cSecondType, bool isExpansionPattern);
29142911
SWIFT_NAME("BridgedRequirementRepr.createLayoutConstraint(subject:colonLoc:"
2915-
"layout:layoutLoc:)")
2912+
"layout:layoutLoc:isExpansionPattern:)")
29162913
BridgedRequirementRepr BridgedRequirementRepr_createLayoutConstraint(
29172914
BridgedTypeRepr cSubject, BridgedSourceLoc cColonLoc,
2918-
BridgedLayoutConstraint cLayout, BridgedSourceLoc cLayoutLoc);
2915+
BridgedLayoutConstraint cLayout, BridgedSourceLoc cLayoutLoc,
2916+
bool isExpansionPattern);
29192917

29202918
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedGenericTypeParamKind : size_t {
29212919
/// A regular generic type parameter: 'T'

lib/AST/Bridging/GenericsBridging.cpp

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -101,57 +101,59 @@ RequirementRepr BridgedRequirementRepr::unbridged() const {
101101
case BridgedRequirementReprKindTypeConstraint:
102102
return RequirementRepr::getTypeConstraint(
103103
FirstType.unbridged(), SeparatorLoc.unbridged(), SecondType.unbridged(),
104-
/*IsExpansionPattern=*/false);
104+
IsExpansionPattern);
105105
case BridgedRequirementReprKindSameType:
106106
return RequirementRepr::getSameType(
107107
FirstType.unbridged(), SeparatorLoc.unbridged(), SecondType.unbridged(),
108-
/*IsExpansionPattern=*/false);
108+
IsExpansionPattern);
109109
case BridgedRequirementReprKindLayoutConstraint:
110110
return RequirementRepr::getLayoutConstraint(
111111
FirstType.unbridged(), SeparatorLoc.unbridged(),
112112
{LayoutConstraint.unbridged(), LayoutConstraintLoc.unbridged()},
113-
/*IsExpansionPattern=*/false);
113+
IsExpansionPattern);
114114
}
115115
}
116116

117-
BridgedRequirementRepr
118-
BridgedRequirementRepr_createTypeConstraint(BridgedTypeRepr cSubject,
119-
BridgedSourceLoc cColonLoc,
120-
BridgedTypeRepr cConstraint) {
117+
BridgedRequirementRepr BridgedRequirementRepr_createTypeConstraint(
118+
BridgedTypeRepr cSubject, BridgedSourceLoc cColonLoc,
119+
BridgedTypeRepr cConstraint, bool isExpansionPattern) {
121120
return {
122121
/*SeparatorLoc=*/cColonLoc,
123122
/*Kind=*/BridgedRequirementReprKindTypeConstraint,
124123
/*FirstType=*/cSubject,
125124
/*SecondType=*/cConstraint.unbridged(),
126125
/*LayoutConstraint=*/{},
127126
/*LayoutConstraintLoc=*/{},
127+
/*IsExpansionPattern=*/isExpansionPattern,
128128
};
129129
}
130130

131-
BridgedRequirementRepr
132-
BridgedRequirementRepr_createSameType(BridgedTypeRepr cFirstType,
133-
BridgedSourceLoc cEqualLoc,
134-
BridgedTypeRepr cSecondType) {
131+
BridgedRequirementRepr BridgedRequirementRepr_createSameType(
132+
BridgedTypeRepr cFirstType, BridgedSourceLoc cEqualLoc,
133+
BridgedTypeRepr cSecondType, bool isExpansionPattern) {
135134
return {
136135
/*SeparatorLoc=*/cEqualLoc,
137136
/*Kind=*/BridgedRequirementReprKindSameType,
138137
/*FirstType=*/cFirstType,
139138
/*SecondType=*/cSecondType.unbridged(),
140139
/*LayoutConstraint=*/{},
141140
/*LayoutConstraintLoc=*/{},
141+
/*IsExpansionPattern=*/isExpansionPattern,
142142
};
143143
}
144144

145145
BridgedRequirementRepr BridgedRequirementRepr_createLayoutConstraint(
146146
BridgedTypeRepr cSubject, BridgedSourceLoc cColonLoc,
147-
BridgedLayoutConstraint cLayout, BridgedSourceLoc cLayoutLoc) {
147+
BridgedLayoutConstraint cLayout, BridgedSourceLoc cLayoutLoc,
148+
bool isExpansionPattern) {
148149
return {
149150
/*SeparatorLoc=*/cColonLoc,
150151
/*Kind=*/BridgedRequirementReprKindLayoutConstraint,
151152
/*FirstType=*/cSubject,
152153
/*SecondType=*/nullptr,
153154
/*LayoutConstraint=*/cLayout,
154155
/*LayoutConstraintLoc=*/cLayoutLoc,
156+
/*IsExpansionPattern=*/isExpansionPattern,
155157
};
156158
}
157159

lib/ASTGen/Sources/ASTGen/DeclAttrs.swift

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,10 @@ extension ASTGenVisitor {
189189
return handle(self.generateUnavailableFromAsyncAttr(attribute: node)?.asDeclAttribute)
190190
case .none where attrName == "_unavailableInEmbedded":
191191
return handle(self.generateUnavailableInEmbeddedAttr(attribute: node)?.asDeclAttribute)
192+
case .none where attrName == "_functionBuilder":
193+
// TODO: Diagnostics. '_functionBuilder' is renamed to 'resultBuilder'
194+
return handle(self.generateSimpleDeclAttr(attribute: node, kind: .resultBuilder))
195+
192196

193197
// Simple attributes.
194198
case .addressableSelf,
@@ -1682,7 +1686,7 @@ extension ASTGenVisitor {
16821686
return nil
16831687
}
16841688

1685-
guard let moveAsLike = args.isEmpty ? false : generateConsumingMoveAsLike() else {
1689+
guard let moveAsLike = args.isEmpty ? false : generateConsumingMovesAsLike() else {
16861690
return nil
16871691
}
16881692

@@ -1711,7 +1715,7 @@ extension ASTGenVisitor {
17111715
return nil
17121716
}
17131717

1714-
guard let moveAsLike = args.isEmpty ? false : generateConsumingMoveAsLike() else {
1718+
guard let moveAsLike = args.isEmpty ? false : generateConsumingMovesAsLike() else {
17151719
return nil
17161720
}
17171721

@@ -1738,10 +1742,10 @@ extension ASTGenVisitor {
17381742
}
17391743
}
17401744

1741-
func generateConsumingMoveAsLike() -> Bool? {
1745+
func generateConsumingMovesAsLike() -> Bool? {
17421746
self.generateConsumingPlainIdentifierAttrOption(args: &args) {
17431747
switch $0.rawText {
1744-
case "moveAsLike":
1748+
case "movesAsLike":
17451749
return true
17461750
default:
17471751
// TODO: Diagnose.

lib/ASTGen/Sources/ASTGen/Generics.swift

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -111,25 +111,41 @@ extension ASTGenVisitor {
111111

112112
func generate(genericWhereClause node: GenericWhereClauseSyntax) -> BridgedTrailingWhereClause {
113113
let requirements = node.requirements.lazy.map { elem -> BridgedRequirementRepr in
114+
115+
// Unwrap 'repeat T' to (isRequirementExpansion: true, type: T)
116+
func generateIsExpansionPattern<Node: SyntaxProtocol>(type node: Node) -> (isExpansionPattern: Bool, type: Node) {
117+
if let expansion = node.as(PackExpansionTypeSyntax.self) {
118+
// Force unwrapping is safe because both 'TypeSyntax' and 'SameTypeRequirementSyntax.LeftType' accept 'TypeSyntax'.
119+
return (true, Node(expansion.repetitionPattern)!)
120+
}
121+
return (false, node)
122+
}
123+
114124
switch elem.requirement {
115125
case .conformanceRequirement(let conformance):
126+
let (isExpansionPattern, leftType) = generateIsExpansionPattern(type: conformance.leftType)
116127
return .createTypeConstraint(
117-
subject: self.generate(type: conformance.leftType),
128+
subject: self.generate(type: leftType),
118129
colonLoc: self.generateSourceLoc(conformance.colon),
119-
constraint: self.generate(type: conformance.rightType)
130+
constraint: self.generate(type: conformance.rightType),
131+
isExpansionPattern: isExpansionPattern
120132
)
121133
case .sameTypeRequirement(let sameType):
134+
let (isExpansionPattern, leftType) = generateIsExpansionPattern(type: sameType.leftType)
122135
return .createSameType(
123-
firstType: self.generate(sameTypeLeftType: sameType.leftType),
136+
firstType: self.generate(sameTypeLeftType: leftType),
124137
equalLoc: self.generateSourceLoc(sameType.equal),
125-
secondType: self.generate(sameTypeRightType: sameType.rightType)
138+
secondType: self.generate(sameTypeRightType: sameType.rightType),
139+
isExpansionPattern: isExpansionPattern
126140
)
127141
case .layoutRequirement(let layout):
142+
let (isExpansionPattern, leftType) = generateIsExpansionPattern(type: layout.type)
128143
return .createLayoutConstraint(
129-
subject: self.generate(type: layout.type),
144+
subject: self.generate(type: leftType),
130145
colonLoc: self.generateSourceLoc(layout.colon),
131146
layout: self.generate(layoutRequirement: layout),
132-
layoutLoc: self.generateSourceLoc(layout.layoutSpecifier)
147+
layoutLoc: self.generateSourceLoc(layout.layoutSpecifier),
148+
isExpansionPattern: isExpansionPattern
133149
)
134150
}
135151
}

test/ASTGen/attrs.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ struct ReferenceOwnershipModifierTest<X: AnyObject> {
240240
}
241241

242242
@_rawLayout(like: T) struct RawStorage<T>: ~Copyable {}
243+
@_rawLayout(like: T, movesAsLike) struct RawStorage2<T>: ~Copyable {}
243244
@_rawLayout(likeArrayOf: T, count: 4) struct RawSmallArray<T>: ~Copyable {}
244245
@_rawLayout(size: 4, alignment: 4) struct Lock: ~Copyable {}
245246

test/ASTGen/decls.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,3 +346,5 @@ func testBuilder() {
346346
1
347347
}
348348
}
349+
350+
struct ExpansionRequirementTest<each T> where repeat each T: Comparable {}

test/ASTGen/diagnostics.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,6 @@ struct S {
3333
subscript(x: Int) { _ = 1 } // expected-error@:23 {{expected '->' and return type in subscript}}
3434
// expected-note@-1:23 {{insert '->' and return type}}
3535
}
36+
37+
struct ExpansionRequirementTest<each T> {}
38+
extension ExpansionRequirementTest where repeat each T == Int {} // expected-error {{same-element requirements are not yet supported}}

0 commit comments

Comments
 (0)