Skip to content

Commit 901b3eb

Browse files
committed
[ASTGen] Implement PackElementTypeRepr, InverseTypeRepr and class constraint
1 parent 76b4854 commit 901b3eb

File tree

5 files changed

+87
-11
lines changed

5 files changed

+87
-11
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1034,6 +1034,12 @@ BridgedTypeRepr BridgedImplicitlyUnwrappedOptionalTypeRepr_createParsed(
10341034
BridgedASTContext cContext, BridgedTypeRepr base,
10351035
BridgedSourceLoc cExclamationLoc);
10361036

1037+
SWIFT_NAME("BridgedInverseTypeRepr.createParsed(_:tildeLoc:constraint:)")
1038+
BridgedTypeRepr
1039+
BridgedInverseTypeRepr_createParsed(BridgedASTContext cContext,
1040+
BridgedSourceLoc cTildeLoc,
1041+
BridgedTypeRepr cConstraint);
1042+
10371043
SWIFT_NAME("BridgedMemberTypeRepr.createParsed(_:base:members:)")
10381044
BridgedTypeRepr
10391045
BridgedMemberTypeRepr_createParsed(BridgedASTContext cContext,
@@ -1051,6 +1057,12 @@ BridgedProtocolTypeRepr_createParsed(BridgedASTContext cContext,
10511057
BridgedTypeRepr baseType,
10521058
BridgedSourceLoc cProtoLoc);
10531059

1060+
SWIFT_NAME("BridgedPackElementTypeRepr.createParsed(_:base:eachKeywordLoc:)")
1061+
BridgedTypeRepr
1062+
BridgedPackElementTypeRepr_createParsed(BridgedASTContext cContext,
1063+
BridgedTypeRepr base,
1064+
BridgedSourceLoc cEachLoc);
1065+
10541066
SWIFT_NAME(
10551067
"BridgedPackExpansionTypeRepr.createParsed(_:base:repeatKeywordLoc:)")
10561068
BridgedTypeRepr

lib/AST/ASTBridging.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1328,6 +1328,15 @@ BridgedTypeRepr BridgedDictionaryTypeRepr_createParsed(
13281328
SourceRange{lSquareLoc, rSquareLoc});
13291329
}
13301330

1331+
BridgedTypeRepr
1332+
BridgedInverseTypeRepr_createParsed(BridgedASTContext cContext,
1333+
BridgedSourceLoc cTildeLoc,
1334+
BridgedTypeRepr cConstraint) {
1335+
1336+
return new (cContext.unbridged())
1337+
InverseTypeRepr(cTildeLoc.unbridged(), cConstraint.unbridged());
1338+
}
1339+
13311340
BridgedTypeRepr
13321341
BridgedMetatypeTypeRepr_createParsed(BridgedASTContext cContext,
13331342
BridgedTypeRepr baseType,
@@ -1346,6 +1355,15 @@ BridgedProtocolTypeRepr_createParsed(BridgedASTContext cContext,
13461355
return new (context) ProtocolTypeRepr(baseType.unbridged(), protoLoc);
13471356
}
13481357

1358+
BridgedTypeRepr
1359+
BridgedPackElementTypeRepr_createParsed(BridgedASTContext cContext,
1360+
BridgedTypeRepr base,
1361+
BridgedSourceLoc cEachLoc) {
1362+
ASTContext &context = cContext.unbridged();
1363+
return new (context)
1364+
PackElementTypeRepr(cEachLoc.unbridged(), base.unbridged());
1365+
}
1366+
13491367
BridgedTypeRepr
13501368
BridgedPackExpansionTypeRepr_createParsed(BridgedASTContext cContext,
13511369
BridgedTypeRepr base,

lib/ASTGen/Sources/ASTGen/Bridge.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,12 @@ extension BridgedStringRef {
130130
}
131131
}
132132

133+
extension BridgedStringRef: ExpressibleByStringLiteral {
134+
public init(stringLiteral str: StaticString) {
135+
self.init(data: str.utf8Start, count: str.utf8CodeUnitCount)
136+
}
137+
}
138+
133139
extension SyntaxProtocol {
134140
/// Obtains the bridged start location of the node excluding leading trivia in the source buffer provided by `astgen`
135141
///

lib/ASTGen/Sources/ASTGen/Types.swift

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,14 @@ func isTypeMigrated(_ node: TypeSyntax) -> Bool {
3333
while true {
3434
switch current.kind {
3535
case // Known implemented kinds.
36-
.arrayType, .attributedType, .compositionType, .someOrAnyType,
37-
.dictionaryType, .functionType, .implicitlyUnwrappedOptionalType,
38-
.memberType, .metatypeType, .namedOpaqueReturnType, .optionalType,
39-
.packExpansionType, .identifierType, .tupleType:
36+
.arrayType, .attributedType, .classRestrictionType, .compositionType,
37+
.someOrAnyType, .dictionaryType, .functionType, .identifierType,
38+
.implicitlyUnwrappedOptionalType, .memberType, .metatypeType,
39+
.namedOpaqueReturnType, .optionalType, .packElementType,
40+
.packExpansionType, .suppressedType, .tupleType:
4041
break
4142
case // Known unimplemented kinds.
42-
.suppressedType, .packElementType, .missingType:
43+
.missingType:
4344
return false;
4445
case // Unknown type kinds
4546
_ where current.is(TypeSyntax.self):
@@ -66,8 +67,8 @@ extension ASTGenVisitor {
6667
return self.generate(arrayType: node)
6768
case .attributedType(let node):
6869
return self.generate(attributedType: node)
69-
case .classRestrictionType:
70-
break
70+
case .classRestrictionType(let node):
71+
return self.generate(classRestrictionType: node)
7172
case .compositionType(let node):
7273
return self.generate(compositionType: node)
7374
case .dictionaryType(let node):
@@ -88,14 +89,14 @@ extension ASTGenVisitor {
8889
return self.generate(namedOpaqueReturnType: node)
8990
case .optionalType(let node):
9091
return self.generate(optionalType: node)
91-
case .packElementType:
92-
break
92+
case .packElementType(let node):
93+
return self.generate(packElementType: node)
9394
case .packExpansionType(let node):
9495
return self.generate(packExpansionType: node)
9596
case .someOrAnyType(let node):
9697
return self.generate(someOrAnyType: node)
97-
case .suppressedType:
98-
break
98+
case .suppressedType(let node):
99+
return self.generate(suppressedType: node)
99100
case .tupleType(let node):
100101
return self.generate(tupleType: node)
101102
}
@@ -239,6 +240,16 @@ extension ASTGenVisitor {
239240
)
240241
}
241242

243+
func generate(packElementType node: PackElementTypeSyntax) -> BridgedTypeRepr {
244+
let base = generate(type: node.pack)
245+
let eachLoc = self.generateSourceLoc(node.eachKeyword)
246+
return BridgedPackElementTypeRepr.createParsed(
247+
self.ctx,
248+
base: base,
249+
eachKeywordLoc: eachLoc
250+
)
251+
}
252+
242253
func generate(packExpansionType node: PackExpansionTypeSyntax) -> BridgedTypeRepr {
243254
let base = generate(type: node.repetitionPattern)
244255
let repeatLoc = self.generateSourceLoc(node.repeatKeyword)
@@ -314,6 +325,24 @@ extension ASTGenVisitor {
314325
}
315326
}
316327

328+
func generate(suppressedType node: SuppressedTypeSyntax) -> BridgedTypeRepr {
329+
return BridgedInverseTypeRepr.createParsed(
330+
self.ctx,
331+
tildeLoc: self.generateSourceLoc(node.withoutTilde),
332+
constraint: self.generate(type: node.type)
333+
)
334+
}
335+
336+
func generate(classRestrictionType node: ClassRestrictionTypeSyntax) -> BridgedTypeRepr {
337+
// TODO: diagnostics.
338+
// warning: using 'class' keyword to define a class-constrained protocol is deprecated; use 'AnyObject' instead
339+
return BridgedSimpleIdentTypeRepr.createParsed(
340+
self.ctx,
341+
loc: self.generateSourceLoc(node.classKeyword),
342+
name: self.ctx.getIdentifier("AnyObject")
343+
)
344+
}
345+
317346
// NOTE: When implementing new `generate(type:)`, please update `isTypeMigrated(_:)`.
318347
}
319348

test/ASTGen/types.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,14 @@ func test13(body: (_ value: Int) -> Void, i: Int) {
4141
func test14() {
4242
_ = Array<Array<Array<Int>>>().count
4343
}
44+
45+
func testRepeatEach<each T>(_ t: repeat each T) -> (repeat each T) {
46+
fatalError()
47+
}
48+
49+
struct FileDescriptor: ~Copyable {
50+
var fd = 1
51+
}
52+
53+
// FIXME: warning for 'class'
54+
protocol ClassOnly: class {}

0 commit comments

Comments
 (0)